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

标签 c x86 simd avx avx2

我无法像之前在 AVX 中那样加载或存储 AVX2 内在函数指令。没有错误,只是警告,并且它不会在运行时执行加载/存储指令。其他 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);

那么,问题/差异是什么?有什么想法或解决方案吗?

最佳答案

如果您查看 _mm256_stream_load_si256 的原型(prototype):

__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);
^                   ^^^^^^^^^ 

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

关于c - 加载指令中的 AVX2 __m256i const* mem_addr 与 AVX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35779092/

相关文章:

c - 在 Swift 模块中使用 C 库的链接器架构错误

c - Little Endian系统中Big Endian系统发送的结构数据的反序列化

c - 打印 mpiexec 参数而不是正在执行的程序的参数

java - 在 Vista 32 位和 Win 7 64 位中访问 %ProgramFiles(x86)% 的统一方式

c++ - 使用 SSE 内部函数时结果不正确

linux - Simd 不在我的 Linux 机器上 : fatal error: simd/simd. h: No such file or directory

c - 如何防止整数在 C 中除法时截断值?

architecture - 将ARM指令转换为i386指令

c++ - 更短的循环,相同的覆盖范围,为什么我在使用 Visual Studio 2013 的 C++ 中得到更多的末级缓存未命中?

x86 - 将8个16位SSE寄存器转换成8位数据