gpt4 book ai didi

c - Intel Intrinsics 的段错误

转载 作者:行者123 更新时间:2023-11-30 15:32:23 25 4
gpt4 key购买 nike

我使用英特尔内在函数具有以下函数:

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 字节对齐,但根据 Intel 文档,_mm_store_sd 不需要 16 字节对齐,仅适用于_mm_store_pd。我一无所知。有什么建议吗?

最佳答案

事实证明:

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

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

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

关于c - Intel Intrinsics 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24261713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com