50

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

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

注意这个http://download.tuxfamily.org/eigen/btl-results-110323/aat.pdf,本质上是一个 dgemm。对于 N=1000,Eigen 得到大约 17Gf,MKL 只有 12Gf

4

6 回答 6

38

Eigen 有惰性求值。从Eigen 与 BLAS/LAPACK 相比如何?

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

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

于 2012-04-28T18:06:44.260 回答
34

基准测试旨在被误解

让我们看一下矩阵*矩阵乘积。Eigen 网站上此页面上提供的基准告诉您,Eigen(具有自己的 BLAS)提供的时序类似于大型矩阵(n = 1000)的 MKL。我已经在我的计算机(具有核心 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 向量)并引入当它们有用时(例如 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 几乎不可能被击败。对于小型矩阵,可以击败 MKL,因为它不是为此类问题而设计的。

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

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

于 2015-12-31T13:52:42.857 回答
13

关于 ATLAS 与 Eigen 的比较

从这里开始查看 Eigen 邮件列表上的这个线程:

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

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

编辑:

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

您可以使用ulmBLAS框架进行自己的基准测试。

也看看

于 2012-09-27T21:29:39.483 回答
4

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

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

于 2016-09-27T06:51:42.410 回答
2

我前段时间向 ATLAS 邮件列表发送了同样的问题:

http://sourceforge.net/mailarchive/message.php?msg_id=28711667

Clint(ATLAS 开发人员)不信任这些基准。他建议了一些值得信赖的基准程序。只要我有一些空闲时间,我就会做这种基准测试。

如果 Eigen 的 BLAS 功能实际上比 GotoBLAS/GotoBLAS、ATLAS、MKL 更快,那么它们无论如何都应该提供标准的 BLAS 接口。这将允许将 LAPACK 链接到这样的 Eigen-BLAS。在这种情况下,这对于 Matlab 和朋友来说也是一个有趣的选择。

于 2012-06-10T14:02:07.577 回答
2

从您链接的页面下方的图表中可以看出,它似乎并没有始终优于其他库。所以不同的库针对不同的用例进行了优化,不同的库针对不同的问题速度更快。

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

于 2012-04-28T18:02:22.250 回答