Встроенный ассемблер для этого бесполезен (https://gcc.gnu.org/wiki/DontUseInlineAsm), и ваш код небезопасен и неэффективен, даже если вы исправили синтаксическую ошибку, добавив третий операнд.
Используйте встроенный _mm512_xor_epi64( __m512i a, __m512i b);
, как описано в руководстве Intel asm для pxor. Посмотрите на сгенерированный компилятором asm, если хотите увидеть, как это делается.
Небезопасно, потому что у вас нет стирателя "memory"
, чтобы сообщить компилятору, что вы читаете/записываете память, и вы не объявляете стиратель на zmm0
или zmm1
.
И неэффективно по многим причинам, включая форсирование режимов адресации и отсутствие использования операнда-источника памяти. И не позволять компилятору выбирать, какие регистры использовать.
Простое исправление синтаксиса asm, чтобы он компилировался, превратится из очевидной ошибки времени компиляции в незаметную и опасную ошибку времени выполнения, которая может быть видна только при включенной оптимизации.
Подробнее о встроенном asm см. https://stackoverflow.com/tags/inline-assembly/info. Но опять же, практически нет причин использовать его для большинства SIMD, потому что вы можете заставить компилятор сделать asm таким же эффективным, как то, что вы можете сделать вручную, и более эффективным, чем это.
person
Peter Cordes
schedule
29.07.2019
_mm512_xor_epi64( __m512i a, __m512i b);
, как задокументировано в записи руководства Intel asm дляpxor
: felixcloutier.com/x86/pxor. Посмотрите на сгенерированный компилятором asm, если хотите увидеть, как это делается. - person Peter Cordes   schedule 29.07.2019"memory"
clobber, чтобы сообщить компилятору, что вы читаете/записываете память, и вы не объявляете clobbers на zmm0 или zmm1. И неэффективно по многим причинам, включая форсирование режимов адресации и неиспользование операнда-источника памяти. И не позволять компилятору выбирать, какие регистры использовать. - person Peter Cordes   schedule 29.07.2019