加载指令中的 AVX2 __m256i const* mem_addr 与 AVX

AVX2 __m256i const* mem_addr in load instructions vs AVX

我无法像以前在 AVX 中那样使用 AVX2 内在指令加载或存储。没有错误,只是警告,它不会在 运行 时执行 load/store 指令。其他 AVX2 指令工作正常,但我无法从内存加载。

如下

AVX:

float t[MAX][MAX];
row0 = _mm256_load_ps(&t[i][j]);
_mm256_store_ps(&t[j][i], row0);

AVX2:

const int32_t a[MAX][MAX]; // I tried int, long, global and local and many other things... 
a0_i =_mm256_stream_load_si256 (&a[0][0]);
mm256_store_si256(&a[0][0], a0_i);

那么,什么是problem/difference?有什么想法或解决方案吗?

如果您查看 _mm256_stream_load_si256 的原型:

__m256i _mm256_stream_load_si256 (__m256i const* mem_addr);

您可以看到您需要将 转换为正确的类型,即:

a0_i =_mm256_stream_load_si256 ((__m256i *)&a[0][0]);
                                 ^^^^^^^^^ ^

你也忘记了获取数组第一个元素的地址,你在后续的存储中还有一些错误:

_mm256_store_si256((__m256i *)&a[0][0], a0_i);
^                   ^^^^^^^^^ 

请注意,当您的编译正常时,您的下一个问题可能是 运行 时的内存对齐。