你成功使用过GPGPU吗?

时间:2008-09-10 21:59:23

标签: cuda gpgpu hpc

我很想知道是否有人编写了一个利用GPGPU的应用程序,例如使用nVidia CUDA。如果是这样,与标准CPU相比,您发现了哪些问题和性能提升?

10 个答案:

答案 0 :(得分:29)

我一直用ATI's stream SDK代替Cuda进行gpgpu开发。 您将获得什么样的性能提升取决于 批次 因素,但最重要的是数字强度。 (即,计算操作与内存引用的比率。)

BLAS level-1或BLAS level-2函数如添加两个向量只对每3个内存引用进行1次数学运算,因此NI为(1/3)。这总是使用CAL或Cuda运行更慢而不是仅仅在cpu上运行。主要原因是将数据从cpu传输到gpu并返回的时间。

对于类似FFT的函数,有O(N log N)计算和O(N)存储器参考,因此NI是O(log N)。如果N非常大,比如1,000,000,那么在gpu上执行它可能会更快;如果N很小,比如1000就几乎肯定会慢一些。

对于BLAS level-3或LAPACK函数,如矩阵的LU分解,或找到其特征值,有O(N ^ 3)个计算和O(N ^ 2)个内存引用,所以NI是O(N )。对于非常小的数组,比如N是一个得分,这对cpu来说仍然会更快,但随着N的增加,算法很快从内存绑定到计算限制,并且gpu的性能提升非常高快。

任何涉及复杂arithemetic的计算都比标量算法计算更多,这通常会使NI加倍并提高gpu性能。


(来源:earthlink.net

这是CGEMM的性能 - 在Radeon 4870上完成的复杂单精度矩阵 - 矩阵乘法。

答案 1 :(得分:12)

我写了一些简单的应用程序,如果你可以平行浮点计算,它确实很有用。

我发现以下课程由伊利诺伊大学厄巴纳香槟分校教授和NVIDIA工程师在我开始时非常有用:http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html(包括所有讲座的录音)。

答案 2 :(得分:10)

我已经将CUDA用于多种图像处理算法。当然,这些应用程序非常适合CUDA(或任何GPU处理范例)。

IMO,将算法移植到CUDA有三个典型的阶段:

  1. 初始移植即使对CUDA有非常基本的了解,您也可以在几小时内移植简单的算法。如果运气好的话,你的表现会达到2到10倍。
  2. 琐碎的优化:这包括使用纹理输入数据和填充多维数组。如果您有经验,可以在一天内完成,并且可能会给您另外10倍的性能。生成的代码仍然可读。
  3. 硬核优化:这包括将数据复制到共享内存以避免全局内存延迟,将代码内部转出以减少已使用的寄存器数量等。您可以在此步骤中花费数周时间,但在大多数情况下,性能提升并不值得。在此步骤之后,您的代码将被混淆,以至于没有人理解它(包括您)。
  4. 这与优化CPU代码非常相似。但是,GPU对性能优化的响应甚至比CPU更难以预测。

答案 3 :(得分:7)

我一直在使用GPGPU进行运动检测(最初使用CG和现在的CUDA)和稳定(使用CUDA)进行图像处理。 在这些情况下,我的速度提升了10-20倍。

从我所读到的,这对于数据并行算法来说是相当典型的。

答案 4 :(得分:2)

虽然我还没有任何CUDA的实践经验,但我一直在研究这个主题,并发现了许多使用GPGPU API记录正面结果的论文(它们都包括CUDA)。

这个paper描述了如何通过创建一些可以组合成有效算法的并行基元(映射,分散,收集等)来对数据库连接进行并行化。

在此paper中,创建了AES加密标准的并行实现,其速度与谨慎的加密硬件相当。

最后,这个paper分析了CUDA如何应用于许多应用程序,例如结构化和非结构化网格,组合逻辑,动态编程和数据挖掘。

答案 5 :(得分:2)

我在CUDA中实施了蒙特卡罗计算以用于某些财务用途。优化的CUDA代码比“本来可以尝试更难,但不是真正的”多线程CPU实现快约500倍。 (在这里比较GeForce 8800GT和Q6600)。众所周知,蒙特卡洛问题令人尴尬地平行。

由于G8x和G9x芯片对IEEE单精度浮点数的限制,遇到的主要问题涉及精度损失。随着GT200芯片的发布,通过使用双精度单元可以在一定程度上减轻这种情况,但是会牺牲一些性能。我还没试过。

此外,由于CUDA是C扩展,因此将其集成到另一个应用程序中可能并非易事。

答案 6 :(得分:1)

我在GPU上实现了一个遗传算法,速度提升了大约7 ..如同其他人指出的那样,更高的数值强度可以获得更多的增益。是的,如果申请是正确的,那么收益就在那里

答案 7 :(得分:1)

我已经实现了Cholesky Factorization,使用ATI Stream SDK在GPU上解决大型线性方程。我的观察是

alt text

性能提升达10倍。

通过将其扩展到多个GPU,处理同样的问题以进一步优化它。

答案 8 :(得分:1)

我编写了一个复数值矩阵乘法内核,对于我使用它的应用程序来说,它大大超过了cuBLAS实现的30%,以及一种矢量外部产品函数,它比一个多重跟踪解决方案运行了几个数量级。其余的问题。

这是最后一年的项目。我花了整整一年。

http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf

答案 9 :(得分:0)

是。我使用CUDA api实现了Nonlinear Anisotropic Diffusion Filter

这很简单,因为它是一个必须在给定输入图像的情况下并行运行的过滤器。我没有遇到很多困难,因为它只需要一个简单的内核。加速时间约为300倍。这是我关于CS的最终项目。该项目可以找到here(用葡萄牙语写的)。

我也尝试过编写Mumford&Shah分段算法,但这一直很难写,因为CUDA还处于起步阶段,因此发生了很多奇怪的事情。我甚至通过在代码O_O中添加if (false){}来看到性能提升。

此分割算法的结果并不好。与CPU方法相比,我的性能损失是20倍(但是,因为它是一个CPU,所以可以采用不同的方法,并且可以采用相同的结果)。它仍然是一项正在进行的工作,但不幸的是,我离开了我正在研究的实验室,所以也许有一天我可能会完成它。