您是不是成功使用了 GPGPU? [关闭]
Posted
技术标签:
【中文标题】您是不是成功使用了 GPGPU? [关闭]【英文标题】:Have you successfully used a GPGPU? [closed]您是否成功使用了 GPGPU? [关闭] 【发布时间】:2010-09-08 11:56:03 【问题描述】:我很想知道是否有人编写了一个利用GPGPU 的应用程序,例如使用nVidia CUDA。如果是,您发现了哪些问题,与标准 CPU 相比,您获得了哪些性能提升?
【问题讨论】:
【参考方案1】:我一直在使用 ATI's stream SDK 而不是 Cuda 进行 gpgpu 开发。 您将获得什么样的性能提升取决于很多因素,但最重要的是数字强度。 (即计算操作与内存引用的比率。)
BLAS 1 级或 BLAS 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 很小,比如 1,000,它几乎肯定会更慢。
对于 BLAS level-3 或 LAPACK 函数,如矩阵的 LU 分解,或查找其特征值,有 O(N^3) 次计算和 O(N^2) 次内存引用,因此 NI 为 O(N )。对于非常小的数组,假设 N 是几个分数,这在 cpu 上仍然会更快,但是随着 N 的增加,算法很快从内存限制到计算限制,并且 gpu 上的性能提升非常很快。
任何涉及复杂算术的计算都比标量算术多,这通常会使 NI 加倍并提高 gpu 性能。
(来源:earthlink.net)
这是 CGEMM 的性能——在 Radeon 4870 上完成的复杂单精度矩阵-矩阵乘法。
【讨论】:
在浮点数学中使用 ATI 优于 CUDA 有什么优势?我认为 CUDA 更好。【参考方案2】:我写了一些简单的应用程序,如果你可以并行化浮点计算,那真的很有帮助。
我发现以下由伊利诺伊大学厄巴纳香槟分校教授和 NVIDIA 工程师共同教授的课程在我刚开始学习时非常有用:http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html(包括所有讲座的录音)。
【讨论】:
绝对是一个非常好的链接,但它似乎被破坏了。请改用courses.ece.illinois.edu/ece498/al/Archive/Spring2007/…。 链接好像过期了【参考方案3】:我已将 CUDA 用于多种图像处理算法。当然,这些应用程序非常适合 CUDA(或任何 GPU 处理范例)。
IMO,将算法移植到 CUDA 时有三个典型阶段:
-
初始移植:即使对 CUDA 有非常基本的了解,您也可以在几个小时内移植简单的算法。如果幸运的话,您的性能会提高 2 到 10 倍。
琐碎优化:这包括使用纹理输入数据和填充多维数组。如果您有经验,这可以在一天内完成,并且可能会使您的性能提高 10 倍。生成的代码仍然可读。
硬核优化:这包括将数据复制到共享内存以避免全局内存延迟,将代码翻过来以减少使用的寄存器数量等。您可以在此步骤中花费数周时间,但性能在大多数情况下,收益并不值得。在这一步之后,您的代码将变得如此模糊,以至于没有人(包括您)理解它。
这与为 CPU 优化代码非常相似。然而,GPU 对性能优化的响应甚至比 CPU 更难预测。
【讨论】:
我同意这些步骤。然而,第一步必须特别小心,因为如果你做了太多的条件,或者在内核上循环并且不首先分析你的问题(如果它非常适合在那个实现中并行运行)你会被淘汰运气 这也模仿了我的经验。我知道我的问题(n-body)会并行。一个简单的实现并没有花那么长时间来实现,并且比 i7 920 CPU 上的 C++ 实现快 10 倍。重新考虑算法以更好地利用共享内存等已经给了我 3-4 倍的加速,但需要更多。 +1 表示“没有人理解它(包括你)”。【参考方案4】:我一直在使用 GPGPU 进行运动检测(最初使用 CG,现在使用 CUDA)和图像处理稳定化(使用 CUDA)。 在这些情况下,我的速度提高了大约 10-20 倍。
根据我的阅读,这对于数据并行算法来说是相当典型的。
【讨论】:
【参考方案5】:虽然我还没有任何使用 CUDA 的实际经验,但我一直在研究这个主题并发现了许多论文,这些论文记录了使用 GPGPU API 取得的积极成果(它们都包括 CUDA)。
这个paper 描述了如何通过创建许多可以组合成有效算法的并行原语(map、scatter、gather 等)来并行化数据库连接。
在此paper 中,创建了 AES 加密标准的并行实现,其速度与谨慎的加密硬件相当。
最后,paper 分析了 CUDA 在结构化和非结构化网格、组合逻辑、动态规划和数据挖掘等众多应用中的应用情况。
【讨论】:
【参考方案6】:我在 CUDA 中实现了蒙特卡洛计算以用于某些财务用途。优化的 CUDA 代码比“本可以更努力但不是真的”多线程 CPU 实现快约 500 倍。 (此处将 GeForce 8800GT 与 Q6600 进行比较)。众所周知,蒙特卡洛问题是平行的。
遇到的主要问题涉及由于 G8x 和 G9x 芯片对 IEEE 单精度浮点数的限制而导致的精度损失。随着 GT200 芯片的发布,这可以通过使用双精度单元在一定程度上缓解,但会牺牲一些性能。我还没试过。
此外,由于 CUDA 是 C 扩展,因此将其集成到另一个应用程序中并非易事。
【讨论】:
我觉得集成一点也不难。毕竟,使用简单的“外部“C””只是标准的 C 样式链接。大多数东西都应该能够处理这个问题。与 Qt 应用程序相关联的快速测试运行时间不到 20 分钟。 (无论如何,在安装 SDK 并编译示例之后)如果您的意思是托管代码......好吧......恕我直言,方形钉圆孔。【参考方案7】:我在 GPU 上实现了遗传算法,并获得了大约 7 的速度提升。正如其他人指出的那样,更高的数值强度可能会带来更多的收益。所以是的,如果应用是正确的,收益就在那里
【讨论】:
【参考方案8】:我编写了一个复值矩阵乘法内核,它在我使用它的应用程序中比 cuBLAS 实现高出约 30%,以及一种矢量外积函数,它比乘法跟踪解决方案运行几个数量级剩下的问题。
这是最后一年的项目。我花了整整一年的时间。
http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf
【讨论】:
【参考方案9】:我已经实现了 Cholesky 分解,用于使用 ATI Stream SDK 在 GPU 上求解大型线性方程。我的观察结果是
性能提升高达 10 倍。
通过将其扩展到多个 GPU 来解决相同的问题以进一步优化它。
【讨论】:
【参考方案10】:是的。我已经使用 CUDA api 实现了Nonlinear Anisotropic Diffusion Filter。
这相当简单,因为它是一个过滤器,必须在给定输入图像的情况下并行运行。我在这方面没有遇到很多困难,因为它只需要一个简单的内核。加速大约是 300 倍。这是我在 CS 上的最后一个项目。该项目可以在here 找到(它是用葡萄牙语写的)。
我也尝试过编写Mumford&Shah 分割算法,但写起来很痛苦,因为CUDA 还处于起步阶段,所以会发生很多奇怪的事情。我什至看到通过在代码 O_O 中添加 if (false)
来提高性能。
这种分割算法的结果并不好。与 CPU 方法相比,我的性能损失了 20 倍(但是,由于它是 CPU,因此可以采用产生相同结果的不同方法)。它仍在进行中,但不幸的是我离开了我正在研究的实验室,所以也许有一天我会完成它。
【讨论】:
以上是关于您是不是成功使用了 GPGPU? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章