请注意http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf,本质上是dgemm。对于N=1000,Eigen获得了大约17Gf,而MKL仅有12Gf。
N^2
,而乘法的数量为N^3
,非常微不足道。如果感兴趣,请访问http://www.netlib.org/blas/dgemm.f。 - Anycorn基准测试的设计本就容易被误解。
让我们来看一下矩阵乘法。Eigen网站上这个页面上提供的基准测试显示,在处理大型矩阵(n = 1000)时,使用Eigen(自带BLAS)与使用MKL的时间相似。但我在我的电脑上(搭载core i7的笔记本电脑)进行了Eigen 3.2.6和MKL 11.3的比较,发现单线程情况下MKL比Eigen快3倍,四线程情况下MKL比Eigen快10倍。这看起来就是完全不同的结论。其原因有两点:Eigen 3.2.6(自带的BLAS)不使用AVX指令集,而且似乎也没有很好地利用多线程。由于基准测试使用的CPU不支持AVX指令集,也没有启用多线程,所以这些问题都被隐藏了起来。
通常,这些C++库(如Eigen、Armadillo、Blaze)有两个优点:
请参考Eigen邮件列表中这个帖子:
其中指出,例如在矩阵乘法方面,ATLAS的性能比Eigen快46%:
更多基准测试结果以及如何进行基准测试的详细信息,请参见以下链接:
Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz:
http://www.mathematik.uni-ulm.de/~lehn/bench_FLENS/index.html
http://sourceforge.net/tracker/index.php?func=detail&aid=3540928&group_id=23725&atid=379483
编辑:
为我的“高性能计算软件基础”课程创建了一个名为ulmBLAS的小框架。它包含ATLAS基准测试套件,学生可以根据BLIS论文实现自己的矩阵乘法。您可以查看最终的基准测试结果,其中也测量了Eigen:
您可以使用 ulmBLAS 框架来制作自己的基准测试。
同时,请查看以下链接:
根据您提供的链接,它似乎并没有始终优于其他库。从页面下方的图表可以看出这一点。因此,不同的库针对不同的用例进行了优化,并且不同的库在解决不同问题时更快。
这并不奇怪,因为通常您无法完美地优化所有用例。为一个特定操作进行优化通常会限制其他用例的优化选项。
A*A'
比mkl明显更快。 - Anycorn我之前曾将同样的问题发送到ATLAS邮件列表:
http://sourceforge.net/mailarchive/message.php?msg_id=28711667
ATLAS开发人员Clint不相信这些基准测试结果。他建议使用一些可靠的基准测试程序。我有空的时候会进行这种基准测试。
如果Eigen的BLAS功能确实比GotoBLAS / GotoBLAS、ATLAS、MKL等更快,那么它们应该提供标准的BLAS接口。这将允许将LAPACK与这样的Eigen-BLAS链接。在这种情况下,这也将是Matlab和其他软件的一个有趣的选择。