我一直在寻找在性能基准测试: http://eigen.tuxfamily.org/index.php?title=Benchmark
我不禁注意到,本征出现持续超越所有专门的供应商库。 问题是:怎么可能? 人们会认为MKL / GOTO将使用处理器专用调谐代码,而本征是相当通用的。
注意这个http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf ,基本上是一个DGEMM。 对于N = 1000的本征变得大致17Gf,MKL仅12Gf
艾根有懒的评价。 从如何征比较BLAS / LAPACK? :
对于涉及复杂的表达式运算,本征天生就比任何BLAS实现更快,因为它可以处理和优化全球整体操作 - 而BLAS迫使程序员到复杂的操作分成匹配BLAS固定功能的API,小的步骤,这将产生效率低下由于引进的临时的。 参见例如一个Y的基准测试结果=其涉及两个调用BLAS级别1的例程,而本征自动生成一个单一的量化循环一个X + B Y形操作。
在第二个图表的基准是Y = a*X + b*Y
,其本征是专门设计来处理。 这应该是毫无疑问,库胜在它是创造了一个标杆。 你会发现,更通用的基准,如矩阵的矩阵乘法,没有表现出任何优势征。
基准的设计被误解 。
让我们来看看矩阵*矩阵产品。 本上提供的基准页面从征的网站告诉你比艾根(有自己的BLAS)给出了类似的MKL大矩阵(N = 1000)的时序。 我比较本征3.2.6与MKL 11.3我的计算机上(具有核i7膝上型计算机)和MKL比本征快3倍,使用一个线程这样的矩阵,并且比使用4个线程的本征快10倍。 这看起来像一个完全不同的结论。 有两个原因。 艾根3.2.6(其内部BLAS)不使用AVX。 此外,它似乎并没有做多线程的一个很好的使用。 因为他们使用的是不具有AVX支持多线程没有一个CPU此基准隐藏这一点。
通常情况下,这些C ++库(本征,犰狳,火焰)带来两件事情:
- 尼斯运算符重载 :您可以使用+,*与向量和矩阵。 为了获得好的性能,但是它们具有以使用称为“智能模板表述”棘手技术来避免临时当它们减少的定时(如Y =阿尔法X1 +其中y,X1,X2载体的β×2)和引入他们时,他们是有用的(如用A,B,C的矩阵A = B * C)。 他们还可以重新排列操作的较少的计算,例如,如果A,B,C是矩阵A * B * C可被计算为取决于它们的尺寸(A * B)* C或A *(B * C)。
- 内部BLAS:要计算的2个矩阵的乘积,它们可以依赖于它们的内部BLAS或一个外部提供(MKL,OpenBLAS,ATLAS)。 在具有大矩阵英特尔芯片的MKL IL几乎是不可能被击败。 对于小矩阵,一个可以打败MKL,因为它不是为那样的问题。
通常情况下,当这些图书馆提供对MKL基准,他们通常使用旧的硬件,也不要在多线程关闭,使他们能够在与票面MKL。 他们也可能比较BLAS级别1的操作,如Y =阿尔法X1 + 2调用一个BLAS 1级功能,是无论如何做的傻事测试版X2。
简而言之 ,这些库是为他们的+超载极其方便*这是非常困难的,而不会丢失性能做。 他们通常做一个很好的工作。 但是,当他们给你的基准说,他们可以在标准杆或用自己的BLAS击败MKL,要小心,做你自己的基准。 你通常会得到不同的结果;-)。
关于比较ATLAS与本征
看看这个线程从这里开始,本征邮件列表:
- http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00052.html
它示出了用于实例ATLAS优于本征的矩阵矩阵产物由46%:
- http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00062.html
如何在基准测试做更多的基准结果和细节可以在这里找到:
编辑:
对于我的演讲“软件基础的高性能计算”我创建了一个名为ulmBLAS微架构。 它包含的ATLAS基准套件和学生可以根据在实现自己的矩阵,矩阵产品BLIS论文。 你可以看看最终的基准也衡量征:
- http://apfel.mathematik.uni-ulm.de/~lehn/sghpc/gemm/page14/index.html#toc5
您可以使用ulmBLAS框架,以使自己的基准。
也看看
- 矩阵,矩阵产品实验用的uBLAS
- 矩阵,矩阵产品实验与Blaze
它似乎并没有持续超越其他库,可以在图中可以看出往后你挂在该网页。 因此,不同的库都是不同的使用情况进行了优化,并且不同的库是针对不同的问题更快。
这并不奇怪,因为你通常不能完全适用于所有的用例进行优化。 优化一个具体的操作通常限制了其他使用情况的优化选项。
我发送到ATLAS邮件列表同样的问题前一段时间:
http://sourceforge.net/mailarchive/message.php?msg_id=28711667
克林特(ATLAS的开发者)不相信这些基准。 他提出了一些值得信赖的基准程序。 只要我有一些空闲时间,我会做这样的标杆。
如果本征的BLAS功能实际上是快那么GotoBLAS / GotoBLAS,ATLAS的,MKL那么他们无论如何都应该提供一个标准的BLAS接口。 这将允许LAPACK针对这样的固有BLAS链接。 在这种情况下,它也将是Matlab和朋友一个有趣的选择。
通用代码可以很快,因为编译时功能评价(CTFE)允许选择最佳的寄存器阻断策略(小的临时存储在CPU寄存器子矩阵)。
米尔GLAS和Intel MKL比征和OpenBLAS更快。 相比于艾根米尔GLAS是更通用。 又见基准和reddit的线程 。
文章来源: How can the C++ Eigen library perform better than specialized vendor libraries?