我有一个应用程序,其中大型矩阵上的减少操作(如求和、最大值)是瓶颈。我需要尽可能快地做到这一点。mkl 中是否有向量指令可以做到这一点?
在至强 cpu、gpu 或 mic 上是否有特殊的硬件单元来处理它?
通常如何在这些硬件中实现 reduce 操作?
您可以使用 KNC vpermd 和 vpermf32x4 指令以及 swizzle 修饰符来实现自己的简单归约,以在向量单元内进行交叉车道操作。
这些的 C 内在函数等价物是mm512 {mask}permute* 和mm512 {mask}swizzle* 系列。
但是,我建议您首先查看数组符号 reduce 操作,它已经在 MIC 上实现了高性能。
查看此处可用的缩减操作,并查看来自英特尔的 Taylor Kidd 的视频,该视频讨论了 Xeon Phi 从 20 分钟 30 秒开始的阵列符号缩减。
编辑:我注意到您也在寻找基于 CPU 的解决方案。阵列符号减少在 Xeon 上也能很好地工作。
此操作将受到带宽限制,因此矢量化几乎肯定无关紧要。您需要具有最大内存带宽的硬件。英特尔至强融核处理器比至强处理器具有更多的总带宽(但不是每核带宽)。
原来所有硬件都没有内置reduce运算电路。我想象有一个 16 个 17 位加法器连接到 128 位向量寄存器以进行减和运算。也许这是因为没有人遇到过 reduce 操作的重大瓶颈。好吧,我找到的最好的解决方案是#pragma omp parallel for reduction
在 openmp 中。不过,我还没有测试它的性能。