【问题标题】:Understanding a code-example from the Intel Intrinsics Guide了解英特尔内部指南中的代码示例
【发布时间】:2020-01-03 18:17:49
【问题描述】:

我想了解_mm256_permute2f128_ps() 的作用,但无法完全理解intel's code-example

DEFINE SELECT4(src1, src2, control) {
    CASE(control[1:0]) OF
    0:  tmp[127:0] := src1[127:0]
    1:  tmp[127:0] := src1[255:128]
    2:  tmp[127:0] := src2[127:0]
    3:  tmp[127:0] := src2[255:128]
    ESAC
    IF control[3]
        tmp[127:0] := 0
    FI
    RETURN tmp[127:0]
}
dst[127:0] := SELECT4(a[255:0], b[255:0], imm8[3:0])
dst[255:128] := SELECT4(a[255:0], b[255:0], imm8[7:4])
dst[MAX:256] := 0

具体的我不明白:

  • imm8[3:0] 表示法。他们是否将其用作 4 字节掩码? But I've seen people invoke_mm256_permute2f128_pd(myVec, myVec, 5),其中 imm8 用作数字(数字 5)。

  • SELECT4 函数内部,control[1:0] 是什么意思?控制是字节掩码,还是用作数字?它由多少字节组成?

  • 为什么在英特尔的示例中使用IF control[3]。它不会撤消3:CASE 中的选择吗?如果我们一直在输出到 tmp[127 to 0],为什么还要将其设置为零?

【问题讨论】:

    标签: intel sse simd intrinsics avx


    【解决方案1】:

    在这种情况下,[x:y] 符号始终指的是位号。例如,如果您将 5 作为imm8 参数传递,那么(因为5==0b00000101imm8[3:0]==0b0101==5 并且如果将其作为control 传递给SELECT4 宏,您将得到control[3]==0==falsecontrol[1:0]==0b01==1control[2] 位将被忽略。

    充分评估这一点,你会得到

    dst[127:0]   := SELECT4(a[255:0], b[255:0], 5) == a[255:128]
    dst[255:128] := SELECT4(a[255:0], b[255:0], 0) == a[127:0]
    

    这意味着这将切换a寄存器的上半部分和下半部分并将其存储到dst寄存器中。

    dst[MAX:256] := 0 仅与具有较大寄存器的架构相关(如果您有 AVX-512),即它将第 255 位以上的所有内容设置为零。这与旧版 SSE 指令形成对比,旧版 SSE 指令(如果在支持 AVX 的 CPU 上执行)将保持上半部分不变(并产生错误的依赖关系——参见 this related question)。

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 2018-08-03
      • 2020-05-12
      • 2016-10-22
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多