【问题标题】:Segfaults with Intel Intrinsics英特尔内部的 Segfaults
【发布时间】:2014-06-17 10:42:03
【问题描述】:

我有以下使用英特尔内在函数的功能:

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;
}

数组inArroutArr 具有偶数长度,lm 为 0 或 1。如果为 0,则一切正常,但如果 lm 为 1,则 _mm_store_sd 导致程序段错误(或者,换句话说,注释掉这两行会使段错误消失)。对于lm == 1xnc 索引未与 16 字节对齐,但根据英特尔的文档,_mm_store_sd 不需要 16 字节对齐,仅适用于 _mm_store_pd。我一无所知。有什么建议吗?

【问题讨论】:

    标签: c intel sse intrinsics memory-alignment


    【解决方案1】:

    事实证明:

    1. 我可以使用 _mm_storeu_pd 将两个打包的 64 位浮点数存储到未对齐的内存地址中。

    2. 但是当我这样做时,我还必须使用_mm_loadu_pd 从未对齐的内存地址加载。

    所以实际上_mm_load_pd 导致了段错误,但是当我注释掉存储操作时,它被优化掉了,因为它是死代码。

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 2018-08-03
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2014-03-24
      • 2016-12-03
      相关资源
      最近更新 更多