gpt4 book ai didi

x86 - 使用AVX2收集指令时的加载地址计算

转载 作者:行者123 更新时间:2023-12-03 23:41:45 24 4
gpt4 key购买 nike

查看 AVX2 内在函数文档,收集了一些加载指令,例如 VPGATHERDD :

__m128i _mm_i32gather_epi32 (int const * base, __m128i index, const int scale);

我从文档中不清楚计算出的加载地址是元素地址还是字节地址,即元素的加载地址 i :
load_addr = base + index[i] * scale;               // (1) element addressing ?

或者:
load_addr = (char *)base + index[i] * scale;       // (2) byte addressing ?

来自 Intel docs看起来它可能是 (2),但考虑到收集加载的最小元素大小是 32 位,这没有多大意义 - 为什么要从未对齐的地址加载(即使用 scale < 4)?

最佳答案

收集指令没有任何对齐要求。所以不允许字节寻址太严格了。

另一个原因是一致性。使用 SIB 寻址,我们显然有字节地址:

MOV eax, [rcx + rdx * 2]

VPGATHERDD只是此 MOV 的矢量化变体指令,我们不应该期望与 VSIB 寻址有什么不同:
VPGATHERDD ymm0, [rcx + ymm2 * 2], ymm3

至于字节寻址的实际用途,我们可以有一个 24 位彩色图像,其中每个像素都是 3 字节对齐的。我们可以使用单个 VPGATHERDD 指令加载 8 个像素,但前提是 VSIB 中的“scale”字段为“1”且 VPGATHERDD使用字节寻址。

关于x86 - 使用AVX2收集指令时的加载地址计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16193434/

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