gpt4 book ai didi

c - 如何在 AVX 或 SSE 指令中进行间接加载(聚集-分散)?

转载 作者:太空狗 更新时间:2023-10-29 16:45:24 31 4
gpt4 key购买 nike

我已经搜索了一段时间,但似乎无法在文档或 SO 上找到任何有用的信息。 This question并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 语言编写。

我有一些代码进行间接访问,我想对其进行矢量化处理。

for (i = 0; i < LENGTH; ++i) {
foo[bar[i]] *= 2;
}

因为我有索引,我想在 bar 中加倍,我想知道是否有办法将 foo 的索引加载到 vector 寄存器中,然后我可以应用我的数学并将其存储回相同的索引。

类似下面的内容。我刚刚编写的 loadstore 指令是因为我在 AVX 或 SSE 文档中找不到类似的内容。我想我在某处读到 AVX2 具有类似的功能,但我正在使用的处理器不支持 AVX2。

for (i = 0; i < LENGTH; i += 8) {
// For simplicity, I'm leaving out any pointer type casting
__m256 ymm0 = _mm256_load_indirect(bar+i);
__m256 ymm1 = _mm256_set1_epi32(2); // Set up vector of just 2's
__m256 ymm2 = _mm256_mul_ps(ymm0, ymm1);
_mm256_store_indirect(ymm2, bar+i);
}

AVX 或 SSE 中是否有任何指令允许我使用来自不同数组的索引数组加载 vector 寄存器?或者如果没有明确的功能,有什么“hacky”的方法吗?

最佳答案

(我正在写这个老问题的答案,因为我认为它可能对其他人有帮助。)

简答

没有。 SSE 和 AVX 指令集中没有分散/聚集指令。

更长的答案

分散/聚集指令的实现成本很高(就复杂性和硅片面积而言),因为分散/聚集机制需要与高速缓存 Controller 深度交织在一起。我相信这就是 SSE/AVX 缺少此功能的原因。

对于较新的指令集,情况有所不同。在 AVX2你有

  • VGATHERDPD、VGATHERDPS、VGATHERQPD、VGATHERQPS 用于浮点收集 (intrinsics here)
  • VPGATHERDD、VPGATHERQD、VPGATHERDQ、VPGATHERQQ 用于整数收集 ( intrinsics here )

AVX-512我们得到了

  • VSCATTERDPD、VSCATTERDPS、VSCATTERQPD、VSCATTERQPS 用于浮点分散( intrinsics here )
  • VPSCATTERDD、VPSCATTERQD、VPSCATTERDQ、VPSCATTERQQ 用于整数散布 (intrinsics here)

但是,对于这样一个简单的操作使用分散/聚集是否真的会有返回,这仍然是一个问题。

关于c - 如何在 AVX 或 SSE 指令中进行间接加载(聚集-分散)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36971722/

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