使用Intel Intrinsic的SEGFULTS

使用Intel Intrinsic的SEGFULTS,c,intel,sse,intrinsics,memory-alignment,C,Intel,Sse,Intrinsics,Memory Alignment,我使用Intel Intrinsic具有以下函数: int c_lattice_worker( int lm, double* inArr, double* outArr, int arrLen, double sin_, double cos_ ) { int xi, yi; double x, y; __m128d _msin, _mcos; __m128d _m0, _m1; _msin = _mm_loaddup_pd( &sin_

我使用Intel Intrinsic具有以下函数:

int c_lattice_worker( int lm, double* inArr, double* outArr, int arrLen,
             double sin_,  double cos_ ) {
  int xi, yi;
  double x, y;
  __m128d _msin, _mcos;
  __m128d _m0, _m1;
  _msin = _mm_loaddup_pd( &sin_ );
  _mcos = _mm_loaddup_pd( &cos_ );

  for ( int xnc = lm; xnc < (arrLen - (lm << 1)); xnc += 2 ) {
    _m0 = _mm_load_pd( &inArr[ xnc ] );
    _m1 = _mm_shuffle_pd( _m0, _m0, 0x1 );
    _m0 = _mm_mul_pd( _msin, _m0 );
    _m1 = _mm_mul_pd( _mcos, _m1 );
    _m0 = _mm_addsub_pd( _m0, _m1 );
    _mm_store_sd( &outArr[ xnc + 1 ], _m0 ); // segfault here if lm == 1
    _m1 = _mm_shuffle_pd( _m0, _m0, 0x1 );
    _mm_store_sd( &outArr[ xnc     ], _m1 ); // segfault here if lm == 1
    }
  }

  // fliping the lm modifier
  return 1 - lm;
}
int c_lattice_worker(int-lm,double*inar,double*outArr,int-arrLen,
双正弦,双余弦){
国际席;
双x,y;
__m128d _msin,_mcos;
__m128d _m0,m1 ;;
_msin=_mm_loaddup_pd(&sin_u);
_mcos=_mm_loaddup_pd(&cos);
对于(int xnc=lm;xnc<(arrLen-(lm),结果是:

  • 我可以使用
    \u mm\u storeu\u pd
    将两个压缩的64位浮点存储到未对齐的内存地址中

  • 但当我这样做时,我还必须使用
    \u mm\u loadu\u pd
    从未对齐的内存地址加载

  • 所以事实上,segfault是由
    \u mm\u load\u pd
    引起的,但当我注释掉存储操作时,它得到了优化,因为它是死代码