了解《英特尔技术指南》中的代码示例

时间:2019-08-30 13:26:09

标签: intel sse simd intrinsics avx

我正在尝试了解ngOnInit() { this.players = this.teamService.players; this.statUser(); } statUser() { this.players.forEach(function(element) { console.log(element.id); this.getStats('element.id'); }); } getStats(idUser) { this.http.get(this.urlIdTest + idUser).subscribe((data) => { this.getStat = data; }); } 的作用,但无法完全理解intel's code-example

_mm256_permute2f128_ps()

具体来说,我不明白:

  • 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 表示法。他们是否将其用作4字节掩码? But I've seen people invoke imm8[3:0],其中imm8用作数字(数字5)。

  • _mm256_permute2f128_pd(myVec, myVec, 5)函数内部,SELECT4是什么意思?控制是字节掩码还是用作数字?它由多少字节组成?

  • 为什么在英特尔示例中使用control[1:0]。是否会撤消IF control[3]内部的选择3:?如果我们一直将CASE设置为零,为什么还要将其设置为零?

1 个答案:

答案 0 :(得分: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指令相反(如果在具有AVX支持的CPU上执行),则上半部分将保持不变(并产生错误的依赖关系,请参见this related question)。