Это не унаследованный код. __attribute__ ((vector_size(32)))
означает 32-байтовый вектор, то есть 256 бит, который (на x86) означает AVX.
AVX не включен, если вы не используете -mavx
(или его настройку -march
). Без этого компилятору не разрешается генерировать код, который использует команды AVX, потому что это вызовет ошибку с неправильной инструкцией на старых процессорах, которые не поддерживают AVX.
Таким образом, компилятор не может передавать или возвращать векторы 256b в регистры, как указывает нормальное соглашение о вызовах. Вероятно, это относится к ним так же, как к структурам такого размера, переданным по значению.
См. Ссылки ABI в вики-ссылке x86 или на странице x86 Calling Conventions в Википедии (в основном, не упоминается векторный регистр).
Поскольку синтаксис GNU C Vector Extensions не привязан к какой-либо конкретной аппаратной, используя вектор 32 байт еще будет собирать, чтобы исправить код. Он будет работать плохо, но он все равно будет работать, даже если компилятор может использовать только инструкции SSE. (Последнее, что я видел, gcc, как было известно, очень плохо справляется с созданием кода для работы с векторами, более широкими, чем поддержка целевых машин. Вы получите значительно лучший код для машины с векторами 16B с использованием vector_size(16)
вручную.)
Во всяком случае, дело в том, что вы получаете предупреждение вместо ошибки компилятора, потому что __attribute__ ((vector_size(32)))
не означает, что AVX определенно, но для его компиляции требуется код AVX или какой-либо другой 256b векторный набор команд good.
Ненавидьте тех троллей, которые дали отрицательные, но объяснений не объяснили. – user534498
Нет моего голоса, но похоже, что вы сбросили блок кода и только одну строку текста «не смогли найти его в Google». В общем, это не очень хорошие вопросы. И вы можете объяснить, что вы пытаетесь сделать - почему вы пытаетесь использовать AVX, когда не понимаете, что это такое? – MSalters
Вы должны задать свои вопросы в пунктах текста, а не в комментариях внутри блока кода. –