你成功使用过GPGPU吗?

mut 发布于 2018-04-28 cuda 最后更新 2018-04-28 20:38 157 浏览

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

已邀请:

est_et

赞同来自:

我一直在使用GPGPU进行运动检测(最初使用CG和现在的CUDA)以及使用图像处理进行稳定(使用CUDA)。 在这些情况下,我已经获得了10-20倍的加速比。 从我读过的内容来看,这对于数据并行算法来说相当典型。

wanimi

赞同来自:

我已经写了一些简单的应用程序,如果你可以平行浮点计算,这真的很有帮助。 当我开始使用http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html(包括所有讲座的录音)时,我发现由伊利诺伊大学香槟分校教授和NVIDIA工程师非常有用的以下课程非常有用。

jquia

赞同来自:

虽然我还没有CUDA的实际经验,但我一直在研究这个主题,并发现了许多使用GPGPU API(它们都包含CUDA)记录积极结果的论文。 这个paper描述了如何通过创建大量并行基元(映射,分散,聚集等)将数据库连接组合成一个高效的算法,从而实现数据库连接的并置。 在这个paper中,AES加密标准的并行实现以与离散加密硬件相当的速度创建。 最后,paper分析了CUDA如何应用于许多应用程序,如结构化和非结构化网格,组合逻辑,动态规划和数据挖掘。

ysit

赞同来自:

我已经在CUDA中实施了一些蒙特卡罗计算,用于某些财务用途。经过优化的CUDA代码比“可以尝试更难但不是真正的”多线程CPU实现的速度快大约500倍。 (在这里比较GeForce 8800GT和Q6600)。然而,蒙特卡洛问题虽然同样令人尴尬,但我们都知道。 由于G8x和G9x芯片对IEEE单精度浮点数的限制,遇到的主要问题包括精度损失。随着GT200芯片的发布,这可以通过使用双精度单元在一定程度上减轻,但要牺牲一些性能。我还没有尝试过。 另外,由于CUDA是C扩展,因此将其集成到另一个应用程序中可能不是微不足道的。

tquod

赞同来自:

我一直在用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,它肯定会变慢。 对于矩阵LU分解或找到其特征值的BLAS级别3或LAPACK函数,有O(N ^ 3)个计算和O(N ^ 2)个内存引用,所以NI是O(N)。对于非常小的数组,如果N是几分,那么在cpu上执行的速度仍然会更快,但是随着N的增加,该算法很快会从内存绑定到计算绑定,并且gpu上的性能提升会非常快很快。 任何涉及复杂的arithemetic的算法都比标量算法更多,它通常使NI增加一倍,并提高gpu的性能。 http://home.earthlink.net/~mtie/CGEMM%20081121.gif 这是CGEMM的性能 - 在Radeon 4870上完成复杂的单精度矩阵 - 矩阵乘法。

in_ut

赞同来自:

我已经使用CUDA处理多种图像处理算法。当然,这些应用程序非常适合CUDA(或任何GPU处理范例)。 IMO,将算法移植到CUDA有三个典型阶段:

  1. 初始移植:即使拥有CUDA的基础知识,您也可以在几个小时内移植简单的算法。如果你幸运的话,你的表现会得到2到10分。
  2. 简单优化:这包括为多维数组的输入数据和填充使用纹理。如果你有经验,这可以在一天内完成,并可能会给你另一个10的因素。生成的代码仍然可读。
  3. 核心优化:这包括将数据复制到共享内存以避免全局内存延迟,将代码从内部转出以减少使用的寄存器的数量等。您可以花费数周的时间进行此步骤,但性能增益并不是真的在大多数情况下都值得。完成此步骤后,您的代码将会变得模糊不清,以至于无人理解(包括您)。
这与优化CPU代码非常相似。但是,GPU对性能优化的响应甚至比CPU更难以预测。

overo

赞同来自:

是。我已经使用CUDA api实现了Nonlinear Anisotropic Diffusion Filter。 这很容易,因为它是一个过滤器,必须在给定输入图像的情况下并行运行。我没有遇到过很多困难,因为它只需要一个简单的内核。加速时间大约是300x。这是我在CS上的最后一个项目。该项目可以找到here(它是用葡萄牙语写的)。 我也尝试过编写Mumford&Shah分割算法,但这一直是一个痛苦的写法,因为CUDA还处于初始阶段,所以发生了很多奇怪的事情。我甚至在代码O_O中增加了一个if (false){},从而提高了性能。 这种分割算法的结果并不好。与CPU方法相比,我的性能损失是20倍(但是,由于它是一个CPU,所以可以采用不同的方法来获得相同的结果)。这仍然是一项正在进行的工作,但不幸的是我离开了我正在研究的实验室,所以也许有一天我可能会完成它。

daut

赞同来自:

我在GPU上实现了遗传算法,并获得了7左右的加速。如其他人指出的那样,更高的数字强度可能带来更多收益。所以是的,如果申请是正确的,收益就在那里

zfugit

赞同来自:

我使用ATI Stream SDK在GPU上实现了Cholesky分解法来求解大线性方程。我的观察是

alt text 性能提升达10倍。 通过扩展到多个GPU来处理同样的问题,以更好地优化它。

wqui

赞同来自:

我写了一个复数值矩阵乘法内核,该函数在我使用它的应用程序中击败了cuBLAS实现约30%,以及一种向量外积函数,其运行几个数量级比其余部分的乘法跟踪解决方案问题。 这是最后一年的项目。我花了整整一年。 http://www.maths.tcd.ie/~oconbhup/Maths_Project.pdf