1

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

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

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

提前致谢。

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

编辑 2:如果归因于 cublas 库的初始化,它似乎很慢。我继续努力。当我了解更多信息时,我会在这里更新。

4

1 回答 1

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 算法)尺寸的密集矩阵上。

于 2012-06-14T23:18:19.730 回答