冲突检测指令如何使向量化循环变得更容易?

Posted

技术标签:

【中文标题】冲突检测指令如何使向量化循环变得更容易?【英文标题】:How do the Conflict Detection instructions make it easier to vectorize loops? 【发布时间】:2017-02-16 05:51:54 【问题描述】:

AVX512CD 指令系列有:VPCONFLICT、VPLZCNT 和 VPBROADCASTM。

The Wikipedia section about these instruction 说:

AVX-512 冲突检测(AVX-512CD)中的说明是 旨在帮助有效地计算无冲突子集 循环中通常无法安全矢量化的元素。

有哪些示例表明这些指令在矢量化循环中很有用?如果答案将包括标量循环及其矢量化对应物,那将很有帮助。

谢谢!

【问题讨论】:

【参考方案1】:

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 指令似乎是值得的。通常,这些将是数据元素将以非确定性方式更新的模拟。在KNL book by Jeffers et al 中引用了一个示例(来自LAMMPS Molecular Dynamics Simulator)。

【讨论】:

另见page 50 of Kirill Yukhin's slides from 2014。我发布了一些关于使用/不使用 AVX512CD on a recent question 加速直方图类型问题的内容。克隆您的 bin 并在最后汇总的常用技巧有助于避免冲突(以及存储转发数据依赖瓶颈,即使对于标量也是如此)。 谢谢彼得 - 我以前没看过那些幻灯片 - 里面有一些有趣的花絮...... Intel optimization manuals 的“16.2.3 使用 AVX-512CD 说明”部分准确地描述了这一点。请参见示例“示例 16-4. 使用 AVX-512CD 更新矢量直方图”。你是从那里得到这个想法的吗?你怎么知道它并不比标量好?您是否在 KNL 的实践中尝试过? @Zboson:不,我不认为我见过(我认为我的主要参考资料是上面链接的杰弗斯书),但我确实在 KNL 上对其中一些东西进行了基准测试几个月前,它似乎并没有太令人印象深刻。不过我没时间了,所以有机会时可能会重温一遍。 也许你可以把你的代码放在这里?我正在考虑尝试用 KNL 来实现这一点。您是什么时候访问 KNL 的?

以上是关于冲突检测指令如何使向量化循环变得更容易?的主要内容,如果未能解决你的问题,请参考以下文章

组成原理-存储关于交叉存储器检测访问冲突的一种算法

实际上,Core Data 如何检测冲突?

如何检测 SKSpriteNode 和 SKView SpriteKit 之间的冲突

未检测到 SkSpriteNode 冲突

如何检测与 C++、OpenGL 和 freeglut 的冲突?

如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?