出于测试目的,我正在为icls内联汇编程序编写用于英特尔至强融核的短汇编代码片段。现在我想使用屏蔽矢量指令,但是我无法将它们馈送到内联汇编程序。屏蔽矢量指令
对于这样的代码:
vmovapd -64(%%r14, %%r10), %%zmm0{%%k1}
我得到错误信息
/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register
我尝试了很多不同的组合,但毫无效果。编译器是linux下的intel64/13.1up03,GAS语法。
编辑:上面的代码实际上适用于非扩展汇编器。所以这个:
__asm__("vmovapd -64(%r14, %r10), %zmm0{%k1} ")
作品,这并不:
__asm__("vmovapd -64(%[src], %%r10), %%zmm0{%%k1} "
:
: [src]"r"(src)
:)
我quess它有什么做的必要性,扩展模式寄存器名称前使用双重%。但是,不,k的单个百分比不起作用。
VMASKMOVPD仅适用于AVX,不适用于KNI。他们没有包括它,因为有通用的矢量通道遮罩功能。 – user116429
我不明白你的意思。 vmovapd和vmaskmovpd都是AVX512指令。我不知道在这种情况下KNI是什么 - 我熟悉的这种TLA唯一使用的是内核NIC接口。 – pburka
KNI是骑士角新指令,Xeon Phi的矢量指令集。 AVX512非常相似,两种指令集将来都可能会收敛。 – user116429