CUDA矩阵乘法的性能

问题描述:

如果你能帮我澄清关于GPU性能的一些细节,这将是非常好的,因为我在这里呆了几个星期。 此外,我很抱歉我的英语不好,但我会尽力解释这个问题。CUDA矩阵乘法的性能

所以,关于我的问题。我们来看看非常简单的程序 - 使用共享内存的密集矩阵乘法。 据我所知,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 = 318Gflops。

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

所以,问题是:

1)我对我的推理吗?

2)我甚至无法达到峰值性能一半的主要原因是什么?

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

谢谢你的关注!

+2

您是否熟悉[Google学术搜索](http://scholar.google.com/)?使用关键字“GPU”“CUDA”“GEMM”的简单查询产生了一系列处理高性能实现策略的文章。性能超越算法的其余部分是精心设计的手工汇编语言实现(这几乎适用于所有计算平台)。 – njuffa 2014-12-05 17:38:16

+2

请显示您的代码。按照我的观点,您的问题太广泛了,无法得出明确的答案。没有看到您的实施,有太多可能的地方可以提出改进建议。 – 2014-12-05 17:39:00

+0

关于代码:我正在谈论提高nvidia代码的性能,并提供了链接。当然,我有自己的实现(速度提高1.4倍),但我决定不在这里提供,因为这不是我正在寻求的加速,而且我希望避免在自己的代码中谈论可能出现的错误。那么让我们考虑一下我们想要加速Nvidia代码。 – 2014-12-05 18:35:44

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

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

+0

非常感谢,我忘记了MAGMA是开源的。如果有针对开普勒的GEMM实施,那将解决我的问题。 – 2014-12-05 19:08:22

+0

什么是块大小?你在使用阻塞算法吗? – 2014-12-05 22:19:27

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

+0

是的,谢谢你的回答。我知道它是什么,我敢肯定,我正在避免银行冲突。 – 2014-12-05 18:55:43