首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Intel Intrinsics中的分段故障

Intel Intrinsics中的分段故障
EN

Stack Overflow用户
提问于 2014-06-17 10:42:03
回答 1查看 175关注 0票数 0

我有以下使用Intel本质的功能:

代码语言:javascript
复制
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不需要16字节对齐。我毫无头绪。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-18 08:33:16

事实证明:

  1. 我可以使用_mm_storeu_pd将两个打包的64位浮点数存储到未对齐的内存地址中。
  2. 但是,当我这样做时,我还必须使用_mm_loadu_pd从未对齐的内存地址加载。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24261713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档