Intel AVX-512指令的掩码向量汇编语法

7

为了测试目的,我正在使用Icc内联汇编器编写Intel Xeon Phi的短汇编片段。现在,我想使用掩码向量指令,但是我无法将它们传递给内联汇编器。

对于这样的代码:

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

我收到了错误消息。
/tmp/icpc5115IWas_.s: Assembler messages:
/tmp/icpc5115IWas_.s:563: Error: junk `%k1' after register

我尝试了很多不同的组合,但都没有成功。编译器版本是使用GAS语法的Linux下的intel64/13.1up03。
编辑:上面的代码实际上适用于非扩展汇编。所以这个:
__asm__("vmovapd  -64(%r14, %r10), %zmm0{%k1} ")

这个有效,而下面的则不行:

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

我猜这与在扩展模式下使用双个百分号来注册名称有关。但是,使用单个百分号也无法为k工作。

2个回答

6

在GNU C内联汇编中,常规花括号用于语法方言的替代,例如add {%0, %1 | %1, %0},以编写适用于AT&T或Intel的代码,因此您可以使用或不使用-masm = intel编译它。 - Peter Cordes
此外,推荐的方法是将 { 转义为 %{,例如 "... %{%%k1%} \n" - Peter Cordes

0

我认为你需要使用指令的掩码变体: VMASKMOVPD


VMASKMOVPD仅适用于AVX,而不适用于KNI。他们没有包含它,因为有通用的矢量通道掩码功能。 - user116429
我不明白你的意思。vmovapd和vmaskmovpd都是AVX512指令。在这个上下文中,我不知道KNI是什么 - 我熟悉的英特尔使用这个TLA的唯一方式是内核NIC接口。 - pburka
KNI是骑士角新指令,是Xeon Phi的向量指令集。AVX512非常相似,两个指令集在未来可能会趋于融合。 - user116429

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接