Есть ли встроенный x86, который генерирует операцию широковещательной передачи AVX512 из 32-битного значения с плавающей запятой в памяти в 512-битный регистр?

Инструкция существует (vbroadcastss zmm/m32), но, похоже, нет никаких внутренних средств для ее создания.

Я могу закодировать это как

static inline  __m512 mybroadcast(float *x) {
    __m512 v;
    asm inline ( "vbroadcastss %1,%0 "
                 : "=v" (v)
                 : "m" (*x)
                 );
    return v;
}

Есть ли способ сделать это без встроенного asm?


person Steve Linton    schedule 01.12.2019    source источник
comment
вы забыли указать на каком языке в тегах   -  person TehMattGR    schedule 01.12.2019
comment
Это будет полностью зависеть от компилятора ... но я подозреваю, что нет: у вас уже есть лучшее решение, которое вы, вероятно, найдете.   -  person FoggyDay    schedule 01.12.2019
comment
@FoggyDay Я думаю о стандартных встроенных функциях Intel.   -  person Steve Linton    schedule 01.12.2019
comment
Похоже, его не существует: test.c:5: Error: no such instruction: 'vpbroadcastss %zmm0,-64(%rsp)'   -  person S.S. Anne    schedule 02.12.2019
comment
Измените его на vbroadcastss, и он говорит test.c:5: Error: operand size mismatch for 'vbroadcastss'   -  person S.S. Anne    schedule 02.12.2019
comment
@ JL2210: да, это опечатка, и x операнд должен быть "m"(*x), чтобы сообщить компилятору, что вы хотите, чтобы float находился в памяти, а не указатель в памяти. Или, может быть, лучше, "xm"(*x) может позволить компилятору передать его вам в регистре XMM вместо памяти, если это удобно; в отличие от AVX1, версии AVX2 и AVX512 vbroadcastss работают как в случайном порядке reg-reg, так и в качестве загрузки. felixcloutier.com/x86/vbroadcast. В любом случае, это все еще хуже, чем внутреннее, потому что, помимо прочего, оно побеждает оптимизацию постоянного распространения.   -  person Peter Cordes    schedule 02.12.2019
comment
@ JL2210: Ради интереса я исправил код в вопросе на случай, если кому-то интересно: P   -  person Peter Cordes    schedule 02.12.2019
comment
@PeterCordes Вы не должны вносить такие радикальные правки.   -  person S.S. Anne    schedule 02.12.2019
comment
@ JL2210: Почему бы и нет? Он лучше задает тот же вопрос, без ошибок в примере. Я не собираюсь начинать войну редактирования, но я бы порекомендовал Стиву вернуться к моему редактированию. Я не вижу, чтобы это каким-либо образом меняло намерения, а исходное полностью сломанное состояние отвлекало. Как обладатель золотого значка в нескольких релевантных тегах ([gcc], [x86], [c] и т. Д.), Я думаю, что улучшение вопросов, чтобы четко задать, что явно предназначено OP, - это хорошо, когда я понимаю тему достаточно хорошо, чтобы вносить подобные правки.   -  person Peter Cordes    schedule 02.12.2019
comment
@ JL2210: После вашего редактирования он все равно не будет компилироваться только с gcc -march=skylake-avx512. Встроенный asm использует синтаксис Intel. Этот комментарий был важен; вы все равно получите ошибку несоответствия размера операнда. Я также включил ссылки на руководство по asm, чтобы оправдать вопрос как не недостаток исследовательских усилий - обычно вы можете найти встроенные инструкции для инструкций в вводе руководства по asm. И еще больше деталей о том, почему встроенный asm был неоптимальным, потому что по крайней мере один комментатор подумал, что asm уже может быть оптимальным! В любом случае OP может выбирать между моим редактированием или вашим с откатом.   -  person Peter Cordes    schedule 02.12.2019
comment
@PeterCordes Спасибо, что указали на это. Я исправил порядок операндов.   -  person S.S. Anne    schedule 02.12.2019
comment
Почему вы думаете, что OP хотел синтаксис AT&T вместо синтаксиса Intel? Оба варианта являются технически обоснованными. (Хотя AT&T обычно стандартная).   -  person Peter Cordes    schedule 02.12.2019


Ответы (1)


Я думаю _mm512_set1_ps это то, что вы хотите.

https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm512_set1_ps&expand=5236,4980

person bg2b    schedule 01.12.2019
comment
@SteveLinton: если вы будете искать broadcast в том же руководстве по внутренним функциям, в результатах появятся _mm_set1 встроенные функции (похороненные под тонной маскированной, немодифицированной и т. Д. AVX512). Но если вы Control-f выполните поиск на странице для float, вы быстро найдете их вместе с AVX1 _mm256_broadcast_ss. (Но нет версии AVX512 этой встроенной функции.) - person Peter Cordes; 02.12.2019