根据我对古巴拉斯和阿特拉斯的dgemm的测量结果,atlas在速度方面严重击败了cublas。对于配备Intel i7 950和Nvidia GTX470的系统,这是预期的吗?
我测试了尺寸为10x10到6000x6000的矩阵,增量为50.Atlas总是获胜。我测量了总的应用程序执行和只是乘法步骤。
其他人有这方面的经验吗?这是预期的结果吗?
提前致谢。
编辑:(相同的代码,在Xeon X5670和Nvidia Tesla C2050上的相同结果)
edit2:如果归因于cublas库的初始化,它似乎很慢。我继续努力。当我了解更多信息时,我会在这里更新。
答案 0 :(得分: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,针对每种大小进行了优化)和非常大(使用Strassen算法的1000x1000以上)大小的密集矩阵中。