【问题标题】:Should cublas be outperformed by atlas?cublas 是否应该被 atlas 超越?
【发布时间】:2012-06-18 00:47:39
【问题描述】:

根据我对 cublas 和 atlas 的 dgemm 测量结果,atlas 在速度方面远远超过 cublas。这对于配备 Intel i7 950 和 Nvidia GTX470 的系统是否可以预期?

我以 50 为增量测试了 10x10 到 6000x6000 大小的矩阵。Atlas 总是胜出。我测量了整个应用程序的执行和乘法步骤。

其他人有这方面的经验吗?这是预期的结果吗?

提前致谢。

编辑:(相同的代码,在 Xeon X5670 和 Nvidia Tesla C2050 上的结果相同)

edit2:如果归因于 cublas 库的初始化,它会显得非常缓慢。我继续努力。当我了解更多时,我会在这里更新。

【问题讨论】:

  • 不,这不是预期的结果,尤其是对于 C2050。你能展示一些代码和实际的 CUBLAS 案例的 GFLOP/s 数字吗?
  • 加速器对于单次操作没有用处,因为将数据复制到/从加速器内存和同步内核执行可能需要比实际计算更多的时间。您确实应该对图形卡上的数据进行大量计算,而无需来回移动它。 GTX470 的双精度性能降低到核心能力的 1/4,因此无法与高端 Quadros 和 Teslas 竞争。
  • 如果您在 Linux 上,我建议您在持久模式下运行 nvidia-smi(或在后台以循环模式 (-l) 运行它)。这可以将设备上下文创建从几秒减少到几毫秒。如果您发布用于运行和计时 cublas 的代码,我们可以帮助您确保它是正确的。

标签: c cuda cublas


【解决方案1】:

您是否使用了这两个库的单线程版本?据我了解,GotoBLAS 和 Atlas 在处理大型矩阵时都倾向于偷偷使用多个线程。

也就是说,在大矩阵大小时,所使用的算法往往比低级实现更重要。朴素矩阵乘法是 O(N^3),而 Strassen 算法的扩展性要好得多,大约 O(N^2.81) 左右。然而,Strassen 算法恰好可以很好地向量化(对于更大的 SSE 和 AVX 寄存器,效率几乎提高了 2 到 8 倍,具体取决于浮点格式和寄存器大小)。

我不确定您提到的两个 GPU 处理双精度数学的能力如何。通常,它们针对单精度(32 位浮点数)进行了优化,处理双精度时会下降到该速度的三分之一或四分之一。

您的测试中还有其他因素可能会影响结果。例如,您可能包括矩阵传输到 CPU 的时间。我不知道这是否符合现实世界的用例;我没有要测试的 Nvidia GPU。但我怀疑没有。通常有多个运算,运算之间不需要传递矩阵。

我一直在使用 GCC 和 ICC C99 编译器提供的 SSE/AVX 矢量内置函数编写自己的低级 SSE3 矩阵函数;早期测试表明它在很大程度上击败了当前的 Fortran 实现,尤其是在密集矩阵的非常小(比如高达 8x8,针对每种尺寸进行了优化)和非常大(超过 1000x1000,使用 Strassen 算法)尺寸方面。

【讨论】:

  • 朴素矩阵 mul 也可以很好地向量化,不是吗?你自己的低级 vs atlas 或 GotoBLAS 怎么样?
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2014-03-09
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多