【发布时间】:2020-12-04 21:54:00
【问题描述】:
我正在尝试了解 _mm256_permute2x128_si256。是先将寄存器 a 的所有 256 位读入机箱,然后再将寄存器 b 的 256 位读入机箱吗?还是在向量 a 和向量 b 之间交错读取每 32 位?那么哪个向量的哪个 32 位被读取对应于 imm8 中的哪个位以什么顺序以及如何读取?谢谢!
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
【问题讨论】:
-
CASE(control[1:0]) OF在 C/C++ 中的读法与switch(control & 0x3) {类似(但在每种情况下都有隐式的break)。你在哪里看到伪代码中的 32 位? -
@chtz 如果 src1 是 256 位向量,在内存中不是表示为寄存器中每 32 位的一个元素吗?
-
@chtz 你是怎么知道在每个开关盒中使用 0x3 来控制 & 的?