我很想知道是否有人编写了一个利用GPGPU的应用程序,例如使用nVidia CUDA.如果是这样,与标准CPU相比,您发现了哪些问题以及实现了哪些性能提升?
我一直用ATI的流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上完成的复杂单精度矩阵 - 矩阵乘法.
我写了一些简单的应用程序,如果你可以平行浮点计算它真的很有用.
我发现以下课程是由伊利诺伊大学厄巴纳香槟分校教授和NVIDIA工程师在我开始时非常有用的:http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html(包括所有讲座的录音).
我已经将CUDA用于多种图像处理算法.当然,这些应用程序非常适合CUDA(或任何GPU处理范例).
IMO,将算法移植到CUDA有三个典型的阶段:
初始移植:即使具有CUDA的基本知识,您也可以在几个小时内移植简单的算法.如果运气好的话,你的成绩会达到2到10倍.
平凡优化:这包括使用纹理输入数据和填充多维数组.如果您有经验,可以在一天内完成,并且可能会给您另外10倍的性能.生成的代码仍然可读.
硬核优化:这包括将数据复制到共享内存以避免全局内存延迟,将代码内部转出以减少使用的寄存器数量等.您可以花费数周时间完成此步骤,但性能提升并不值得大多数情况下.在此步骤之后,您的代码将被混淆,以至于没有人理解它(包括您).
这与优化CPU代码非常相似.但是,GPU对性能优化的响应甚至比CPU更难以预测.
我一直在使用GPGPU进行运动检测(最初使用CG和现在的CUDA)和稳定(使用CUDA)进行图像处理.在这些情况下,我已经获得了大约10-20倍的加速.
根据我的阅读,这对于数据并行算法来说非常典型.