gpt4 book ai didi

c++ - AVX(2) 收集指令如何实际计算获取地址?

转载 作者:行者123 更新时间:2023-12-05 02:43:38 34 4
gpt4 key购买 nike

_mm_i32gather_epi32() 的当前英特尔内在函数指南将每个子词的计算地址描述为:

addr := base_addr + SignExtend64(vindex[m+31:m]) * ZeroExtend64(scale) * 8

最后 8 个让我很困惑。假设 addrbase_addr 以字节为单位,并且 scale 的值为 1、2、4 或 8,那么您只能对 strides 进行索引从基址起 8 个字节。这是文档中的错误,还是我遗漏了什么?对于我检查过的所有收集指令,它的描述方式相同。

A previous question引用没有 8 的文档,这表明发生了一些变化。

最佳答案

注意伪代码中的下一行:

dst[i+31:i] := MEM[addr+31:addr]

显然有人认为将内存地址描述为位地址而不是字节地址是个好主意。/捂脸。这实际上没有意义,不是任何人所期望的,甚至没有做对,因为他们未能将 base_addr 缩放 8。所以他们在一个字节中添加了一个位偏移量地址。

这只是糟糕的文档,并且是一种比链接问题中引用的先前版本更糟糕的描述方式。这只是文档更改,而不是代码含义的更改,您可以尝试编译它并查看 asm 以查看生成的实际指令。 (我对您链接的问题的回答仍然是正确的:asm 指令允许比例因子为 1、2、4 或 8,因为 2 位移位计数的编码方式与标量指令对缩放索引寻址模式的编码方式相同。所以你可以使用字节偏移 vector 。)

之前更好的伪代码是:

dst[i+31:i] := MEM[base_addr + SignExtend(vindex[i+31:i])*scale]

因此 MEM[](虚拟地址空间)正在使用计算出的字节偏移量进行索引,访问宽度为 dst[31:0]< 隐含的 32 位 位宽。


根据经验,内部函数通常尽可能直接映射到 asm 指令。他们不会选择以要求编译器发出 vpslld 的方式来定义它ymm0, ymm1, 3 在运行 vpgatherdd 之前缩放索引寄存器。

因此您可以查阅 asm 指令的文档(有时会有不同的伪代码,如本例):https://www.felixcloutier.com/x86/vpgatherdd:vpgatherqd

...
DATA_ADDR←BASE_ADDR + (SignExtend(VINDEX1[i+31:i])*SCALE + DISP;
IF MASK[31+i] THEN
DEST[i +31:i]←FETCH_32BITS(DATA_ADDR); // a fault exits the instruction
FI;

关于c++ - AVX(2) 收集指令如何实际计算获取地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66821476/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com