C++ Eigen库如何比专业供应商库更好地运行?

Any*_*orn 37 c++ performance eigen

我正在查看性能基准:http://eigen.tuxfamily.org/index.php?title = Benchmark

我不禁注意到,eigen似乎始终优于所有专业供应商库.问题是:怎么可能?可以假设mkl/goto将使用处理器特定的调谐代码,而特征是相当通用的.

请注意这个http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf,基本上是一个dgemm.对于N = 1000,Eigen大约为17Gf,MKL仅为12Gf

chr*_*ock 29

艾根有懒惰的评价.从Eigen如何与BLAS/LAPACK比较?:

对于涉及复杂表达式的操作,Eigen本质上比任何BLAS实现更快,因为它可以全局处理和优化整个操作 - 而BLAS强制程序员将复杂操作分成与BLAS固定功能API匹配的小步骤,这会导致效率低下由于临时介绍.例如,参见Y = a X + b Y操作的基准结果,其涉及对BLAS level1例程的两次调用,而Eigen自动生成单个矢量化循环.

基准测试中的第二个图表是Y = a*X + b*YEigen专门为处理而设计的.毫无疑问,图书馆会在创建的基准测试中获胜.您会注意到更通用的基准测试,如矩阵 - 矩阵乘法,对于Eigen没有任何优势.

  • Transpose由三个嵌套循环的顺序基本交换处理.添加的数量仅为"N ^ 2"而"N ^ 3"相乘,非常微不足道.如有兴趣,请访问http://www.netlib.org/blas/dgemm.f (2认同)

Ins*_*oop 26

基准旨在被误解.

让我们看一下矩阵*矩阵乘积.本上提供的基准页面从征的网站告诉你比艾根(有自己的BLAS)给出了类似的MKL大矩阵(N = 1000)的时序.我在我的计算机(具有核心i7的笔记本电脑)上比较了Eigen 3.2.6和MKL 11.3,对于使用一个线程的矩阵,MKL比Eigen快3倍,比使用4个线程的Eigen快10倍.这看起来完全不同.有两个原因.Eigen 3.2.6(其内部BLAS)不使用AVX.而且,它似乎没有很好地利用多线程.这个基准测试隐藏了这一点,因为他们使用的CPU没有多线程就没有AVX支持.

通常,那些C++库(Eigen,Armadillo,Blaze)带来两件事:

  • 好的运算符重载:你可以使用+,*和向量和矩阵.为了获得良好的性能,他们必须使用称为"智能模板表达式"的棘手技术,以避免在缩短时序时暂时(例如y = alpha x1 + beta x2 with y,x1,x2 vector)并引入当它们有用时(例如A = B*C,A,B,C矩阵).它们还可以对较少计算的操作重新排序,例如,如果A,B,C是矩阵,则A*B*C可以根据它们的大小计算为(A*B)*C或A*(B*C).
  • 内部BLAS:为了计算2个矩阵的乘积,它们可以依赖于它们的内部BLAS或外部提供的BLAS(MKL,OpenBLAS,ATLAS).在具有大型矩阵的英特尔芯片上,MKL il几乎不可能被击败.对于小型矩阵,人们可以击败MKL,因为它不是为那种问题而设计的.

通常,当这些库提供针对MKL的基准时,它们通常使用旧硬件,并且不打开多线程,因此它们可以与MKL相提并论.他们也可能将BLAS 1级操作(例如y = alpha x1 + beta x2)与2次调用BLAS 1级函数进行比较,无论如何这都是一个愚蠢的事情.

简而言之,这些库非常方便它们的+和*的重载,这是非常难以做到而不会失去性能.他们通常在这方面做得很好.但是,当他们给你的基准说,他们可以在标准杆或用自己的BLAS击败MKL,要小心,做你自己的基准.你通常会得到不同的结果;-).

  • 我同意那个。做你自己的基准测试。这里 http://www.mathematik.uni-ulm.de/~lehn/test_ublas/session8/page01.html 和 http://www.mathematik.uni-ulm.de/~lehn/test_blaze/session1/page01.html我做了一些基准测试,比较英特尔 MKL、Eigen、BLAZE 和我自己的实现。真的很难接近英特尔 MKL。所有这些基准几乎都是独立的。所以你可以自己做。您应该将“试图击败英特尔 MKL”视为一种兴奋或自学目的。否则会令人沮丧;-) (2认同)

Mic*_*ehn 11

关于ATLAS与Eigen的比较

从Eigen邮件列表上看这个帖子从这里开始:

例如,它表明ATLAS在矩阵矩阵乘积上的表现优于46%:

可以在此处找到更多基准测试结果以及基准测试如何完成的详细信息:

编辑:

在我的演讲"高性能计算的软件基础知识"中,我创建了一个名为ulmBLAS的小框架.它包含ATLAS基准测试套件,学生可以根据BLIS论文实现自己的矩阵矩阵产品.您可以查看同样测量Eigen的最终基准:

您可以使用ulmBLAS框架制作自己的基准测试.

另外看看

  • 感谢Michael为ulmBlas开发页面,这些非常有趣 - 在性能方面你非常接近MKL非常有趣. (2认同)

小智 5

通用代码可以很快,因为编译时函数评估 (CTFE) 允许选择最佳寄存器阻塞策略(存储在 CPU 寄存器中的小型临时子矩阵)。

Mir GLAS 和英特尔 MKL 比 Eigen 和 OpenBLAS 更快。与 Eigen 相比,Mir GLAS 更通用。另请参阅基准测试reddit 线程


sth*_*sth 2

它似乎并没有始终优于其他库,正如您链接的页面下方的图表所示。因此,不同的库针对不同的用例进行了优化,并且不同的库针对不同的问题速度更快。

这并不奇怪,因为您通常无法针对所有用例进行完美优化。针对一项特定操作的优化通常会限制其他用例的优化选项。

  • Eigen 在长表达式上有超越其他库的潜力,因为它可以优化整个表达式并为其整体生成代码。任何具有 C 或类似 FORTAN 的 API 都没有这种功能。对于此功能,您需要 C++、Lisp 或在 CLR 之上运行的东西(C#、F# 等)。 (3认同)