多维 __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 存储为整数

SSE/AVX 向量类型的差异

仅在发布模式下将 __m256i 存储在 std::vector 中会产生访问冲突[重复]

填充__m128i参数的正确方法是啥,从基本类型(例如short)到与_mm256_broadcast_epi(例如_mm_broadcastw_epi16)一起使用

犰狳向量 vec/fvec 的内存对齐

x86-64 处理器的数据类型