Многомерные проблемы с выравниванием типов данных __m256i

Я надеюсь, что кто-то сможет помочь с этой проблемой, которая беспокоит меня уже более часа.

У меня есть этот код (он на 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]).


person oPolo    schedule 05.05.2016    source источник
comment
Можете ли вы пояснить описанный вами обходной путь, связанный с изменением сигнатуры функции, то есть с фактическим кодом? Обратите внимание, что в качестве объявления параметра функции __m256i state[5][2] эквивалентно __m256i (*state)[2], что полностью отличается от __m256i *state[2].   -  person John Bollinger    schedule 05.05.2016
comment
Кроме того, ваш код не совсем соответствует минимально воспроизводимому примеру. Он опускает объявления и/или заголовки для нестандартных типов данных и функций, управляющих ими.   -  person John Bollinger    schedule 05.05.2016
comment
Связанный: stackoverflow.com/questions/28488986/.   -  person John Bollinger    schedule 05.05.2016
comment
Кроме того, удалите по крайней мере один из тегов [avx] и [avx2] и вместо этого пометьте соответствующий компилятор, так как это проблема, связанная с реализацией.   -  person John Bollinger    schedule 05.05.2016
comment
Это случайно не Visual Studio? (Кажется, он отлично компилируется с gcc/clang/ICC).   -  person Paul R    schedule 05.05.2016
comment
Спасибо за ответ Джон и Павел! Я только что исправил свой ответ, чтобы отразить изменение сигнатуры функции, которое я пробовал. Я также изменил код, поэтому теперь он должен быть завершен. Да, это с Visual Studio. Кажется (на основе ссылки Джона), что потенциально это может быть что-то с компилятором VS. Тщательно еще не проверил его ссылку.   -  person oPolo    schedule 05.05.2016
comment
Да, с Visual Studio всегда было очень сложно работать как для SSE, так и для AVX — она налагает странные и ненужные ограничения на параметры функций и т. д. в отношении выравнивания, некоторые из которых легко обойти, некоторые не так уж и сложно. Типичный обходной путь заключается в использовании указателей в коде C (и ссылок в C++) и разрешении компилятору оптимизировать любую косвенность, когда функция встроена.   -  person Paul R    schedule 05.05.2016
comment
Я скомпилировал ваш код с помощью VS2013 как в 32-битном, так и в 64-битном режиме и не получил ошибок.   -  person Z boson    schedule 12.05.2016
comment
Спасибо за ответ! Хм, интересно, изменился ли компилятор в VS2016 для C... Хотя, было бы странно, если бы он был в худшую сторону. На самом деле я нашел ответ (основываясь на том, что написал Джон Боллинджер), поскольку __m256i (*state)[2] работал. Я обновлю вопрос с ответом, который говорит об этом. Спасибо!   -  person oPolo    schedule 12.05.2016
comment
Я скомпилировал из командной строки с cl /c /O2 /arch:AVX foo.cpp в 32-битном и 64-битном режиме и получил ошибки.   -  person Z boson    schedule 13.05.2016


Ответы (1)


Использование «__m256i (*state)[2]» в подписи вместо вышеупомянутых вариантов устранило мою проблему с выравниванием. Джон Боллинджер предложил это в комментарии, поэтому голосовать за него следует в первую очередь.

person oPolo    schedule 12.05.2016