加载指令与 AVX 中的 AVX2 __m256i const* mem_addr [关闭]
Posted
技术标签:
【中文标题】加载指令与 AVX 中的 AVX2 __m256i const* mem_addr [关闭]【英文标题】:AVX2 __m256i const* mem_addr in load instructions vs AVX [closed] 【发布时间】:2016-03-03 17:34:52 【问题描述】:我无法像以前在 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);
那么,问题/区别是什么?有什么想法或解决方案吗?
【问题讨论】:
你说的无法从内存中加载是什么意思?你检查堆栈上数组的对齐方式了吗? 它是如何以及在哪里失败的?在编译或运行时?您观察到的错误是什么? 【参考方案1】:如果您查看_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);
^ ^^^^^^^^^
请注意,当您编译成功后,您的下一个问题可能是运行时的内存对齐。
【讨论】:
非常感谢它现在可以使用以上是关于加载指令与 AVX 中的 AVX2 __m256i const* mem_addr [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器