我很想知道是否有人编写了一个利用GPGPU的应用程序,例如使用nVidia CUDA。如果是这样,与标准CPU相比,您发现了哪些问题以及实现了哪些性能提升?
我一直用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上完成的复杂单精度矩阵 - 矩阵乘法。
是。我使用CUDA api实现了Nonlinear Anisotropic Diffusion Filter。
这很容易,因为它是一个必须在给定输入图像的情况下并行运行的过滤器。我没有遇到很多困难,因为它只需要一个简单的内核。加速时间约为300倍。这是我关于CS的最终项目。该项目可以找到here(它是用葡萄牙语写的)。
我也尝试过编写Mumford&Shah分割算法,但这一直很难写,因为CUDA还处于起步阶段,因此发生了许多奇怪的事情。我甚至通过在代码O_O中添加if (false){}
来看到性能提升。
这种分割算法的结果并不好。与CPU方法相比,我的性能损失是20倍(但是,因为它是一个CPU,所以可以采用不同的方法,并且可以采用相同的结果)。它仍然是一项正在进行的工作,但不幸的是我离开了我正在研究的实验室,所以也许有一天我可能会完成它。
我写了一些简单的应用程序,如果你可以并行化浮点计算,它确实很有帮助。
我发现以下课程由伊利诺伊大学厄巴纳香槟分校教授和NVIDIA工程师在我开始时非常有用:http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html(包括所有讲座的录音)。
我已经将CUDA用于多种图像处理算法。当然,这些应用程序非常适合CUDA(或任何GPU处理范例)。
IMO,将算法移植到CUDA有三个典型的阶段:
这与优化CPU代码非常相似。但是,GPU对性能优化的响应甚至比CPU更难以预测。
我一直在使用GPGPU进行运动检测(最初使用CG和现在的CUDA)和稳定(使用CUDA)进行图像处理。在这些情况下,我已经获得了大约10-20倍的加速。
根据我的阅读,这对于数据并行算法来说非常典型。
我已经在CUDA中实施了蒙特卡罗计算以用于某些财务用途。优化的CUDA代码比“本来可以尝试更难,但不是真正的”多线程CPU实现快约500倍。 (在这里比较GeForce 8800GT和Q6600)。众所周知,蒙特卡洛问题令人尴尬地平行。
遇到的主要问题涉及由于G8x和G9x芯片对IEEE单精度浮点数的限制而导致的精度损失。随着GT200芯片的发布,通过使用双精度单元可以在一定程度上减轻这种情况,但是会牺牲一些性能。我还没有尝试过。
此外,由于CUDA是C扩展,因此将其集成到另一个应用程序中可能并非易事。
我在GPU上实现了一个遗传算法,并且速度提升了大约7 ..如同其他人指出的那样,更高的数值强度可以获得更多的增益。是的,如果应用程序是正确的,那么收益就在那里
我写了一个复数值矩阵乘法内核,它为我使用它的应用程序击败了cuBLAS实现约30%,以及一种矢量外部产品函数,其运行几个数量级,而不是多次跟踪解决方案。问题。
这是一个最后一年的项目。我花了整整一年的时间。
我已经实现了Cholesky Factorization,使用ATI Stream SDK在GPU上解决大型线性方程。我的观察是
性能提升达10倍。
通过将其扩展到多个GPU,解决相同的问题以进一步优化它。