Инструкция существует (vbroadcastss zmm/m32
), но, похоже, нет никаких внутренних средств для ее создания.
Я могу закодировать это как
static inline __m512 mybroadcast(float *x) {
__m512 v;
asm inline ( "vbroadcastss %1,%0 "
: "=v" (v)
: "m" (*x)
);
return v;
}
Есть ли способ сделать это без встроенного asm?
test.c:5: Error: no such instruction: 'vpbroadcastss %zmm0,-64(%rsp)'
- person S.S. Anne   schedule 02.12.2019vbroadcastss
, и он говоритtest.c:5: Error: operand size mismatch for 'vbroadcastss'
- person S.S. Anne   schedule 02.12.2019x
операнд должен быть"m"(*x)
, чтобы сообщить компилятору, что вы хотите, чтобы float находился в памяти, а не указатель в памяти. Или, может быть, лучше,"xm"(*x)
может позволить компилятору передать его вам в регистре XMM вместо памяти, если это удобно; в отличие от AVX1, версии AVX2 и AVX512vbroadcastss
работают как в случайном порядке reg-reg, так и в качестве загрузки. felixcloutier.com/x86/vbroadcast. В любом случае, это все еще хуже, чем внутреннее, потому что, помимо прочего, оно побеждает оптимизацию постоянного распространения. - person Peter Cordes   schedule 02.12.2019[gcc]
,[x86]
,[c]
и т. Д.), Я думаю, что улучшение вопросов, чтобы четко задать, что явно предназначено OP, - это хорошо, когда я понимаю тему достаточно хорошо, чтобы вносить подобные правки. - person Peter Cordes   schedule 02.12.2019gcc -march=skylake-avx512
. Встроенный asm использует синтаксис Intel. Этот комментарий был важен; вы все равно получите ошибку несоответствия размера операнда. Я также включил ссылки на руководство по asm, чтобы оправдать вопрос как не недостаток исследовательских усилий - обычно вы можете найти встроенные инструкции для инструкций в вводе руководства по asm. И еще больше деталей о том, почему встроенный asm был неоптимальным, потому что по крайней мере один комментатор подумал, что asm уже может быть оптимальным! В любом случае OP может выбирать между моим редактированием или вашим с откатом. - person Peter Cordes   schedule 02.12.2019