【发布时间】:2026-01-05 17:20:02
【问题描述】:
我很想知道是否有人编写了一个利用GPGPU 的应用程序,例如使用nVidia CUDA。如果是,您发现了哪些问题,与标准 CPU 相比,您获得了哪些性能提升?
【问题讨论】:
我很想知道是否有人编写了一个利用GPGPU 的应用程序,例如使用nVidia CUDA。如果是,您发现了哪些问题,与标准 CPU 相比,您获得了哪些性能提升?
【问题讨论】:
我一直在使用 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 上完成的复杂单精度矩阵-矩阵乘法。
【讨论】:
我写了一些简单的应用程序,如果你可以并行化浮点计算,那真的很有帮助。
我发现以下由伊利诺伊大学厄巴纳香槟分校教授和 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 分解,用于使用 ATI Stream SDK 在 GPU 上求解大型线性方程。我的观察结果是
性能提升高达 10 倍。
通过将其扩展到多个 GPU 来解决相同的问题以进一步优化它。
【讨论】:
是的。我已经使用 CUDA api 实现了Nonlinear Anisotropic Diffusion Filter。
这相当简单,因为它是一个过滤器,必须在给定输入图像的情况下并行运行。我在这方面没有遇到很多困难,因为它只需要一个简单的内核。加速大约是 300 倍。这是我在 CS 上的最后一个项目。该项目可以在here 找到(它是用葡萄牙语写的)。
我也尝试过编写Mumford&Shah 分割算法,但写起来很痛苦,因为CUDA 还处于起步阶段,所以会发生很多奇怪的事情。我什至看到通过在代码 O_O 中添加 if (false){} 来提高性能。
这种分割算法的结果并不好。与 CPU 方法相比,我的性能损失了 20 倍(但是,由于它是 CPU,因此可以采用产生相同结果的不同方法)。它仍在进行中,但不幸的是我离开了我正在研究的实验室,所以也许有一天我会完成它。
【讨论】: