使用OpenMp和SSE进行分段故障

Ian*_*haw 6 c gcc sse openmp

我刚刚开始尝试将OpenMP添加到某些SSE代码中.

我的第一个测试程序SOMETIMES在_mm_set_ps中崩溃,但在我设置if(0)时有效.

它看起来很简单,我必须遗漏一些明显的东西.我正在使用gcc -fopenmp -g -march = core2 -pthreads进行编译

  #include <stdio.h>
  #include <stdlib.h>
  #include <immintrin.h>

  int main()
  {
  #pragma omp parallel if (1)
   {
  #pragma omp sections
       {
  #pragma omp section
           {
              __m128 x1 = _mm_set_ps ( 1.1f, 2.1f, 3.1f, 4.1f );
           }
  #pragma omp section
           {
              __m128 x2 = _mm_set_ps ( 1.2f, 2.2f, 3.2f, 4.2f );
           }
       } // end omp sections
   } //end omp parallel

  return 0;
  }
Run Code Online (Sandbox Code Playgroud)

Nor*_* P. 6

这是openMP实现中的一个错误.我在Windows(MinGW)上的gcc中遇到了同样的问题.-mstackrealign命令行选项解决了我的问题.这会向每个函数的序言添加一条指令,以便在16字节边界处重新对齐堆栈.我没有注意到任何性能损失.您也可以尝试添加__attribute__ ((force_align_arg_pointer))一个函数声明,它应该执行相同的操作,但仅适用于特定的函数.您可能必须将SSE代码放在一个单独的函数中,然后使用#pragma omp从函数调用,以便堆栈有机会重新对齐.

当我开始编译64位目标(MinGW64,如TDM GCC构建)时,我就停止了这个问题.

我正在使用需要32字节对齐的AVX指令,但GCC根本不支持Windows.这迫使我使用python脚本修复生成的汇编代码,但它可以工作.