4

因此,通常有关通过汇编代码提高性能的问题的答案是“不要打扰,编译器比你更聪明”。我明白了。

但是,我注意到优化的线性代数库(例如 ACML)可以在标准编译库的 2 到 5 倍范围内实现性能改进。例如,在我的 8 核机器上,我的优化矩阵乘法运行速度比现有的单线程 BLAS 实现快了 30 倍以上,这意味着,在考虑到由于使用所有内核而带来的 8 倍改进之后,仍然有 4 倍简单地从优化中改进。

所以在我看来,优化的汇编代码真的可以产生巨大的影响。我错过了什么吗?

我在问,因为如果它不是非常困难,我可能倾向于在其他一些代码段上尝试这个。没什么复杂的,但是如果我可以通过在汇编中编写一些小的内部循环来获得 2 倍的改进,那可能是值得的。

4

2 回答 2

4

矩阵-矩阵乘积的加速仅部分是由于使用了汇编代码。在一个简单的实现中,主要瓶颈是内存访问。大多数情况下,您的 CPU 将等待进行实际计算。

您首先必须修改矩阵-矩阵乘法的算法,以便可以尽可能频繁地重用 L2 和 L1 缓存中的数据。这可以在 C(或 C++ 或 Fortran 或 ...)中完成。这将导致当矩阵大小变得大于缓存时不会崩溃的实现。这也意味着实现可以一直进行计算(CPU 寄存器中需要的数据几乎总是在 L1 缓存中,L1 缓存中需要的数据几乎总是在 L2 缓存中,...)。

下一步是优化完成所有计算的热点。这仅涉及几行 C 代码(在我的GEMM 教程中只有 10 行)。汇编代码使用 SSE(或 AVX)对指令流水线、循环展开(用于改进分支预测)、预取(用于减少缓存未命中)进行优化。

类似的技术可用于其他 BLAS 3 级功能。实际上,它们中的大多数使用 GEMM 函数的内部东西(所谓的微内核)。

ulmBLAS 基准测试中,您可以看到几乎所有 BLAS 3 级功能都可以达到大致相同的性能。

为了更深入地阅读,我建议您阅读 Robert A. van de Geijn 和 Enrique S. Quintana-Ortí 撰写的精彩论文The Science of Programming Matrix Computations。而且您可能还想查看BLIS,其中大部分想法都是为ulmBLAS采用和简化的。

于 2014-12-01T10:48:07.940 回答
2

优化的汇编代码可以为您带来巨大的速度增益。

我的研究表明,关于“编译器更好”的说法是有偏见的,与现实生活无关。这是一个神话。

仅当您将编写良好的 HLL 程序、使用非常好的编译器编译的程序与编写不佳的汇编程序进行比较时,编译器才会更好。

没有那么多优秀甚至体面的汇编程序员是另一回事。:)

于 2013-07-25T04:41:48.753 回答