【发布时间】: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。它省略了非标准数据类型的声明和/或标头以及操作它们的函数。
-
另外,删除 [avx] 和 [avx2] 标记中的至少一个,并改为标记相关的编译器,因为这是特定于实现的问题。
-
是的,Visual Studio 对于 SSE 和 AVX 一直是出了名的难以使用 - 它在对齐方面对函数参数等施加了奇怪且不必要的约束,其中一些很容易解决,有些不是那么多。典型的解决方法是在 C 代码中使用指针(以及 C++ 中的引用),并让编译器在函数内联时优化掉任何间接。
标签: c visual-c++ struct intrinsics avx2