CUDA矩阵乘法的性能

时间:2014-12-05 17:29:41

标签: c matrix cuda

如果你帮助我澄清有关GPU性能的一些细节,那将是非常好的,因为我已经在这里坚持了几个星期。 此外,我很遗憾我的英语不好,但我会尽力解释这个问题。

所以,关于我的问题。 让我们看一下非常简单的程序 - 使用共享内存的密集矩阵乘法。 据我了解,Nvidia在cuda编程指南中提供了其中一个实现(这里是链接): http://docs.nvidia.com/cuda/cuda-c-programming-guide/#shared-memory

这很简单,我想每个熟悉CUDA的人都已经看过了。 但是,让我们衡量一下这个内核的性能(Gflops)。 使用" Nvprof"实用程序我们可以测量一些指标来计算浮点运算的计数,并且使用cuda事件我们可以测量内核的执行时间。

因此,对于方阵乘法(每个矩阵中有2048x2048个浮点元素),我们有 (1.7180e + 10)/(0.054 * 10 ^ 9)Gflpos = 318 Gflops。

现在说我使用GeForce GTX Titan卡在单精度上的峰值性能大约为3.1 Tflops是很重要的。因此,我们只达到了峰值性能的1/10,但我们已经使用了我从大学CUDA课程中获知的所有优化(共享内存,合并内存访问等)。 在这里我猜它是因为它是内存限制问题,但据我所知它是不对的。作为一个例子,cuBlas(如果我正确)SGEMM功能达到峰值性能的约71%。当然我知道很难达到cuBlas性能,但为什么我甚至不能达到1个Tflop?

所以,问题是:

1)我的理由是正确的吗?

2)为什么我达不到一半的峰值性能的主要原因是什么?

3)我可以使用哪些其他优化? (这里你知道的一切都非常有用 - 文章,建议等)

感谢您的关注!

2 个答案:

答案 0 :(得分:2)

查看您提到的代码,代码只是一个简单的解释示例,但实际上并不可用,因为它没有考虑其他优化因素。从这种示例中优化性能在我的学习经历中并不有效。

当然,你看不到cuBlas的源代码,但是很少有开源项目,包括MAGMA和矩阵乘法的实际实现。 MAGMA源代码中的MAGMABLAS文件夹包含BLAS的实现,有助于我了解矩阵乘法如何实际实现。

答案 1 :(得分:-1)

我不确定这是否适用,但银行冲突会降低使用共享内存时的性能。这里有一个很好的解释:What is a bank conflict? (Doing Cuda/OpenCL programming)