2014-01-09 3 views
0

Для целей тестирования я пишу короткие фрагменты сборки для Intels 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) 
    :) 

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

ответ

1

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

vmovapd  %%zmm30,   (%%r15, %%r10){{%%k1}} 
0

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

+0

VMASKMOVPD предназначен только для AVX, а не для KNI. Они не включили его, потому что есть универсальная функция маскировки векторной полосы. – user116429

+0

Я не понимаю, что вы имеете в виду. vmovapd и vmaskmovpd являются инструкциями AVX512. Я не знаю, что такое KNI в этом контексте - единственное использование Intel этого TLA, с которым я знаком, - это интерфейс NIC для ядра. – pburka

+0

KNI - это Knights Corner Новые инструкции, набор векторных команд Xeon Phi. AVX512 довольно похож, и оба набора инструкций, вероятно, сходятся в будущем. – user116429

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