AVX512CD 指令系列是:VPCONFLICT、VPLZCNT 和 VPBROADCASTM。
AVX-512 冲突检测 (AVX-512CD) 中的说明旨在帮助有效计算循环中通常无法安全矢量化的元素的无冲突子集。
有哪些示例表明这些指令在矢量化循环中很有用?如果答案将包括标量循环及其矢量化对应物,那将很有帮助。
谢谢!
AVX512CD 指令系列是:VPCONFLICT、VPLZCNT 和 VPBROADCASTM。
AVX-512 冲突检测 (AVX-512CD) 中的说明旨在帮助有效计算循环中通常无法安全矢量化的元素的无冲突子集。
有哪些示例表明这些指令在矢量化循环中很有用?如果答案将包括标量循环及其矢量化对应物,那将很有帮助。
谢谢!
CD 指令可能有用的一个示例是直方图。对于标量代码,直方图只是一个简单的循环,如下所示:
load bin index
load bin count at index
increment bin count
store updated bin count at index
通常你不能向量化直方图,因为你可能在一个向量中多次拥有相同的 bin 索引 - 你可能会天真地尝试这样的事情:
load vector of N bin indices
perform gathered load using N bin indices to get N bin counts
increment N bin counts
store N updated bin counts using scattered store
但是如果向量中的任何索引相同,那么您就会遇到冲突,并且生成的 bin 更新将是不正确的。
因此,CD 指令进行救援:
load vector of N bin indices
use CD instruction to test for duplicate indices
set mask for all unique indices
while mask not empty
perform masked gathered load using <N bin indices to get <N bin counts
increment <N bin counts
store <N updated bin counts using masked scattered store
remove non-masked indices and update mask
end
在实践中,这个例子效率很低,并不比标量代码好,但是还有其他计算密集型的例子,使用 CD 指令似乎是值得的。通常,这些将是数据元素将以非确定性方式更新的模拟。Jeffers等人在KNL 书中提到了一个示例(来自LAMMPS 分子动力学模拟器) 。