2016-09-08 3 views
2

Я пытаюсь выполнить поиск в google, но не нашел ничего полезного.Компиляция устаревшего кода GCC с предупреждениями об AVX-векторе

typedef int64_t v4si __attribute__ ((vector_size(32))); 

//warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi] 
// so isn't AVX already automatically enabled? 
// What does it mean "without AVX enabled"? 
// What does it mean "changes the ABI"? 
inline v4si v4si_gt0(v4si x_); 

//warning: The ABI for passing parameters with 32-byte alignment has changed in GCC 4.6 
//So why there's warning and what does it mean? 
// Why only this parameter got warning? 
// And all other v4si parameter/arguments got no warning? 
void set_quota(v4si quota); 
+1

Ненавидьте тех троллей, которые дали отрицательные, но объяснений не объяснили. – user534498

+3

Нет моего голоса, но похоже, что вы сбросили блок кода и только одну строку текста «не смогли найти его в Google». В общем, это не очень хорошие вопросы. И вы можете объяснить, что вы пытаетесь сделать - почему вы пытаетесь использовать AVX, когда не понимаете, что это такое? – MSalters

+3

Вы должны задать свои вопросы в пунктах текста, а не в комментариях внутри блока кода. –

ответ

3

Это не унаследованный код. __attribute__ ((vector_size(32))) означает 32-байтовый вектор, то есть 256 бит, который (на x86) означает AVX.

AVX не включен, если вы не используете -mavx (или его настройку -march). Без этого компилятору не разрешается генерировать код, который использует команды AVX, потому что это вызовет ошибку с неправильной инструкцией на старых процессорах, которые не поддерживают AVX.

Таким образом, компилятор не может передавать или возвращать векторы 256b в регистры, как указывает нормальное соглашение о вызовах. Вероятно, это относится к ним так же, как к структурам такого размера, переданным по значению.

См. Ссылки ABI в вики-ссылке или на странице x86 Calling Conventions в Википедии (в основном, не упоминается векторный регистр).


Поскольку синтаксис GNU C Vector Extensions не привязан к какой-либо конкретной аппаратной, используя вектор 32 байт еще будет собирать, чтобы исправить код. Он будет работать плохо, но он все равно будет работать, даже если компилятор может использовать только инструкции SSE. (Последнее, что я видел, gcc, как было известно, очень плохо справляется с созданием кода для работы с векторами, более широкими, чем поддержка целевых машин. Вы получите значительно лучший код для машины с векторами 16B с использованием vector_size(16) вручную.)

Во всяком случае, дело в том, что вы получаете предупреждение вместо ошибки компилятора, потому что __attribute__ ((vector_size(32))) не означает, что AVX определенно, но для его компиляции требуется код AVX или какой-либо другой 256b векторный набор команд good.

+0

Спасибо! Я столкнулся с другой проблемой, но ваш ответ дал мне достаточно подсказок о поведении этого едва документированного атрибута, который я могу угадать, как исправить мою проблему. –

Смежные вопросы