【问题标题】:Assembly syntax for masked vector Intel AVX-512 instructions掩码向量英特尔 AVX-512 指令的汇编语法
【发布时间】:2014-01-09 22:16:42
【问题描述】:

出于测试目的,我正在使用 Icc 内联汇编器为英特尔的 Xeon Phi 编写简短的汇编 sn-ps。现在我想使用屏蔽向量指令,但我无法将它们提供给内联汇编器。

对于这样的代码:

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)
    :)

我想这与在扩展模式下注册名称之前使用双 % 的必要性有关。但是不,k 的单个 % 也不起作用。

【问题讨论】:

    标签: x86 inline-assembly icc intel-mic


    【解决方案1】:

    我在英特尔开发者专区http://software.intel.com/en-us/forums/topic/499145#comment-1776563 中提出了同样的问题,答案是,为了在扩展内联汇编程序中使用 Xeon Phi 上的掩码寄存器,您必须在掩码寄存器修饰符周围使用双花括号.

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

    【讨论】:

    • GNU C 内联 asm 中的正则花括号用于替代语法方言,例如 add {%0, %1 | %1, %0} 用于编写适用于 AT&T 或 Intel 的代码,因此您可以使用或不使用 -masm=intel 进行编译。
    • 另外,推荐的方法是将{转义为%{,例如"... %{%%k1%} \n"
    【解决方案2】:

    我认为您需要使用指令的屏蔽变体:VMASKMOVPD

    【讨论】:

    • VMASKMOVPD 仅适用于 AVX,不适用于 KNI。他们没有包括它,因为有通用的矢量车道掩蔽功能。
    • 我不明白你的意思。 vmovapd 和 vmaskmovpd 都是 AVX512 指令。在这种情况下,我不知道 KNI 是什么——我熟悉的英特尔对这个 TLA 的唯一使用是内核 NIC 接口。
    • KNI 是 Knights Corner New Instructions,Xeon Phi 的向量指令集。 AVX512 非常相似,未来两种指令集可能会收敛。
    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 2018-10-10
    • 1970-01-01
    • 2021-04-14
    • 2016-07-13
    • 2011-04-29
    • 2021-02-06
    相关资源
    最近更新 更多