我已经搜索了一段时间,但似乎在文档或 SO 中找不到任何有用的东西。这个问题并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 编写。
我有一些代码进行间接访问,我想对其进行矢量化。
for (i = 0; i < LENGTH; ++i) {
foo[bar[i]] *= 2;
}
因为我有索引,所以我想在里面加倍bar
,我想知道是否有办法加载这些索引foo
到向量寄存器中,然后我可以应用我的数学并将其存储回相同的索引。
像下面这样的东西。这load
and store
我刚刚编写的说明,因为我在 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 中是否有任何指令允许我使用来自不同数组的索引数组加载向量寄存器?或者如果没有显式函数,有什么“hacky”方法可以解决它吗?
(我写了这个老问题的答案,因为我认为这可能对其他人有帮助。)
简短回答
否。SSE 和 AVX 指令集中没有分散/聚集指令。
更长的答案
分散/聚集指令的实现成本很高(就复杂性和芯片面积而言),因为分散/聚集机制需要与高速缓存存储器控制器紧密交织。我相信这就是 SSE/AVX 缺少此功能的原因。
对于较新的指令集,情况有所不同。在AVX2你有
-
VGATHERDPD、VGATHERDPS、VGATHERQPD、VGATHERQPS对于浮点聚集(这里的内在函数)
-
VPGATHERDD、VPGATHERQD、VPGATHERDQ、VPGATHERQQ对于整数聚集(这里的内在函数)
In AVX-512 we got
-
VSCATTERDPD、VSCATTERDPS、VSCATTERQPD、VSCATTERQPS对于浮点分散
(这里的内在函数)
-
VPSCATTERDD、VPSCATTERQD、VPSCATTERDQ、VPSCATTERQQ对于整数散布 (这里的内在函数)
然而,使用分散/聚集进行如此简单的操作是否真正有效仍然是一个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)