Синтаксис сборки для маскированных векторных инструкций Intel AVX-512

В целях тестирования я пишу короткие фрагменты сборки для Intel Xeon Phi с встроенным ассемблером Icc. Теперь я хотел использовать замаскированные векторные инструкции, но мне не удалось передать их встроенному ассемблеру.

Для такого кода:

vmovapd  -64(%%r14, %%r10), %%zmm0{%%k1} 

Я получаю сообщение об ошибке

/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register

Я перепробовал много разных комбинаций, но ничего не вышло. Версия компилятора - intel64 / 13.1up03 под Linux с использованием синтаксиса GAS.

Изменить: приведенный выше код действительно работает с нерасширенным ассемблером. Итак, это:

__asm__("vmovapd  -64(%r14, %r10), %zmm0{%k1} ")

работает, а следующее - нет:

__asm__("vmovapd  -64(%[src], %%r10), %%zmm0{%%k1} "
    :
    : [src]"r"(src)
    :)

Я предполагаю, что это как-то связано с необходимостью использовать двойной% перед именами регистров в расширенном режиме. Но нет, ни одного% для k тоже не работает.


person user116429    schedule 09.01.2014    source источник


Ответы (2)


Я задал тот же вопрос в зоне для разработчиков Intel http://software.intel.com/en-us/forums/topic/499145#comment-1776563, ответ заключается в том, что для использования регистров маски на Xeon Phi в расширенном встроенном ассемблере вы должны использовать двойные фигурные фигурные скобки вокруг модификатора регистра маски.

vmovapd     %%zmm30,         (%%r15,    %%r10){{%%k1}}
person user116429    schedule 13.01.2014
comment
Обычные фигурные скобки в встроенном asm GNU C предназначены для альтернативного синтаксического диалекта, например add {%0, %1 | %1, %0} для написания кода, который работает с AT&T или Intel, поэтому вы можете скомпилировать его с -masm=intel или без него. - person Peter Cordes; 20.03.2018
comment
Кроме того, рекомендуется экранировать { как %{, например "... %{%%k1%} \n" - person Peter Cordes; 25.02.2021

Думаю нужно использовать замаскированный вариант инструкции: VMASKMOVPD

person pburka    schedule 10.01.2014
comment
VMASKMOVPD предназначен только для AVX, а не для KNI. Они не включили его, потому что есть универсальная функция маскирования векторных полос. - person user116429; 11.01.2014
comment
Я не понимаю о чем ты. vmovapd и vmaskmovpd - это инструкции AVX512. Я не знаю, что такое KNI в этом контексте - единственное, что Intel использует этот TLA, с которым я знаком, - это интерфейс Kernel NIC. - person pburka; 12.01.2014
comment
KNI - это новые инструкции Knights Corner, набор векторных инструкций Xeon Phi. AVX512 очень похож, и оба набора инструкций, вероятно, в будущем сойдутся. - person user116429; 13.01.2014