我有一个应用程序,其中大型矩阵上的减少操作(如sum,max)是瓶颈 . 我需要尽快做到这一点 . mkl中有向量指令吗?
是否有特殊的硬件单元在xeon cpu,gpu或mic上处理它?
一般来说,如何在这些硬件中实现减少操作?
您可以使用KNC vpermd和vpermf32x4指令以及swizzle修饰符来实现您自己的简单缩减,以在向量单元内执行跨道操作 .
这些C的内在函数等价物是mm512 permute *和mm512 swizzle * family .
但是,我建议您首先查看数组符号减少操作,它已经在MIC上实现了高性能 .
查看可用的减少操作here并查看来自英特尔的泰勒基德的视频this视频,讨论从20分30秒开始对至强披的阵列符号减少 .
编辑:我注意到你也在寻找基于CPU的解决方案 . 数组符号减少在Xeon上也能很好地工作 .
事实证明,没有任何硬件具有内置的减少运算电路 . 我想象一个16位17位加法器连接到128位向量寄存器以进行降低和运算 . 也许这是因为没有人遇到减少操作的重大瓶颈 . 好吧,我发现的最佳解决方案是openmp中的 #pragma omp parallel for reduction . 我还没有测试它的性能 .
#pragma omp parallel for reduction
此操作将受带宽限制,因此矢量化几乎肯定无关紧要 . 您希望硬件具有最大的内存带宽 . 英特尔至强融核处理器具有比Xeon处理器更多的聚合带宽(但不是每核心带宽) .
3 回答
您可以使用KNC vpermd和vpermf32x4指令以及swizzle修饰符来实现您自己的简单缩减,以在向量单元内执行跨道操作 .
这些C的内在函数等价物是mm512 permute *和mm512 swizzle * family .
但是,我建议您首先查看数组符号减少操作,它已经在MIC上实现了高性能 .
查看可用的减少操作here并查看来自英特尔的泰勒基德的视频this视频,讨论从20分30秒开始对至强披的阵列符号减少 .
编辑:我注意到你也在寻找基于CPU的解决方案 . 数组符号减少在Xeon上也能很好地工作 .
事实证明,没有任何硬件具有内置的减少运算电路 . 我想象一个16位17位加法器连接到128位向量寄存器以进行降低和运算 . 也许这是因为没有人遇到减少操作的重大瓶颈 . 好吧,我发现的最佳解决方案是openmp中的
#pragma omp parallel for reduction
. 我还没有测试它的性能 .此操作将受带宽限制,因此矢量化几乎肯定无关紧要 . 您希望硬件具有最大的内存带宽 . 英特尔至强融核处理器具有比Xeon处理器更多的聚合带宽(但不是每核心带宽) .