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没有任何优势.
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)带来两件事:
通常,当这些库提供针对MKL的基准时,它们通常使用旧硬件,并且不打开多线程,因此它们可以与MKL相提并论.他们也可能将BLAS 1级操作(例如y = alpha x1 + beta x2)与2次调用BLAS 1级函数进行比较,无论如何这都是一个愚蠢的事情.
简而言之,这些库非常方便它们的+和*的重载,这是非常难以做到而不会失去性能.他们通常在这方面做得很好.但是,当他们给你的基准说,他们可以在标准杆或用自己的BLAS击败MKL,要小心,做你自己的基准.你通常会得到不同的结果;-).
Mic*_*ehn 11
从Eigen邮件列表上看这个帖子从这里开始:
例如,它表明ATLAS在矩阵矩阵乘积上的表现优于46%:
可以在此处找到更多基准测试结果以及基准测试如何完成的详细信息:
Intel(R)Core(TM)i5-3470 CPU @ 3.20GHz:
http://www.mathematik.uni-ulm.de/~lehn/bench_FLENS/index.html
编辑:
在我的演讲"高性能计算的软件基础知识"中,我创建了一个名为ulmBLAS的小框架.它包含ATLAS基准测试套件,学生可以根据BLIS论文实现自己的矩阵矩阵产品.您可以查看同样测量Eigen的最终基准:
您可以使用ulmBLAS框架制作自己的基准测试.
另外看看
它似乎并没有始终优于其他库,正如您链接的页面下方的图表所示。因此,不同的库针对不同的用例进行了优化,并且不同的库针对不同的问题速度更快。
这并不奇怪,因为您通常无法针对所有用例进行完美优化。针对一项特定操作的优化通常会限制其他用例的优化选项。
| 归档时间: |
|
| 查看次数: |
33734 次 |
| 最近记录: |