多维 __m256i 数据类型对齐问题
Posted
技术标签:
【中文标题】多维 __m256i 数据类型对齐问题【英文标题】:Multidimensional __m256i datatype alignment issues 【发布时间】:2016-05-05 13:19:01 【问题描述】:我希望有人能够帮助解决这个困扰我一个多小时的问题。
我有这段代码(在 C 中):
#include <immintrin.h>
void test_vectors(__m256i state[5][2]);
void test()
__m256i state[5][2];
for (int i = 0; i < 5; i++)
state[i][0] = _mm256_setzero_si256();
state[i][1] = _mm256_setzero_si256();
test_vectors(state);
void test_vectors(__m256i state[5][2])
__m256i some_new_vector = _mm256_xor_si256(state[0][0], state[0][1]);
我无法构建这个,因为我得到了错误:
“错误‘状态’:请求对齐为 32 的形式参数不会 对齐”
我看不到,这里有什么问题。我已经指定了数组的维度,所以编译器应该能够弄清楚。此外,我看不出为什么 Intel Intrinsics 库应该返回一个未对齐的 __m256i 结构,因为它的大多数库函数都需要对齐。
我可以通过将函数的签名更改为:
void schwabe_bitsliced_primate(__m256i *state[5]);
但是,一旦我访问数组(我在 test_vector 方法的唯一行中执行此操作),我就会得到一个异常“struct at NULL”。 如果状态数组参数是一维的(即只有 state[5]),它可以正常工作。
【问题讨论】:
您能否阐明您描述的解决方法,涉及更改函数签名 - 即使用实际代码?请注意,作为函数参数的声明,__m256i state[5][2]
等价于__m256i (*state)[2]
,与__m256i *state[2]
完全不同。
此外,您的代码似乎不是minimal reproducible example。它省略了非标准数据类型的声明和/或标头以及操作它们的函数。
相关:***.com/questions/28488986/….
另外,删除 [avx] 和 [avx2] 标记中的至少一个,并改为标记相关的编译器,因为这是特定于实现的问题。
是的,Visual Studio 对于 SSE 和 AVX 一直是出了名的难以使用 - 它在对齐方面对函数参数等施加了奇怪且不必要的约束,其中一些很容易解决,有些不是那么多。典型的解决方法是在 C 代码中使用指针(以及 C++ 中的引用),并让编译器在函数内联时优化掉任何间接。
【参考方案1】:
在签名中使用“__m256i (*state)[2]”而不是上述变体,解决了我的对齐问题。 John Bollinger 在评论中建议了这一点,因此应该首先向他投赞成票。
【讨论】:
以上是关于多维 __m256i 数据类型对齐问题的主要内容,如果未能解决你的问题,请参考以下文章
仅在发布模式下将 __m256i 存储在 std::vector 中会产生访问冲突[重复]
填充__m128i参数的正确方法是啥,从基本类型(例如short)到与_mm256_broadcast_epi(例如_mm_broadcastw_epi16)一起使用