Я надеюсь, что кто-то сможет помочь с этой проблемой, которая беспокоит меня уже более часа.
У меня есть этот код (он на 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". Он отлично работает, если параметр массива состояний является одномерным (т.е. только состояние [5]).
__m256i state[5][2]
эквивалентно__m256i (*state)[2]
, что полностью отличается от__m256i *state[2]
. - person John Bollinger   schedule 05.05.2016cl /c /O2 /arch:AVX foo.cpp
в 32-битном и 64-битном режиме и получил ошибки. - person Z boson   schedule 13.05.2016