我们已成功使用GPGPU吗?

时间:2020-03-05 18:51:06  来源:igfitidea点击:

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

解决方案

回答

我一直在使用GPGPU进行运动检测(最初使用CG,现在使用CUDA)以及通过图像处理进行稳定化(使用CUDA)。
在这种情况下,我的速度提高了10到20倍。

据我了解,这对于数据并行算法来说是相当典型的。

回答

我已经编写了一些琐碎的应用程序,如果可以并行化浮点计算,那将真的很有帮助。

当我入门时,我发现以下课程由伊利诺伊大学厄本那香槟分校教授和NVIDIA工程师开设,非常有用:http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html(包括所有讲座的录音)。

回答

尽管我还没有使用CUDA的任何实践经验,但是我一直在研究该主题,并且发现了许多论文,这些论文使用GPGPU API(都包括CUDA)记录了积极的成果。

本文介绍了如何通过创建许多并行原语(映射,散布,聚集等)来并行化数据库联接,这些原语可以组合成一种有效的算法。

在本文中,以与谨慎加密硬件相当的速度创建了AES加密标准的并行实现。

最后,本文分析了CUDA在许多应用中的应用情况,例如结构化和非结构化网格,组合逻辑,动态编程和数据挖掘。

回答

为了某些财务用途,我已经在CUDA中实现了蒙特卡洛计算。经过优化的CUDA代码比"可能会更努力但不是真的"多线程CPU实现快大约500倍。 (此处将GeForce 8800GT与Q6600进行了比较)。众所周知,蒙特卡洛问题令人尴尬地是并行的。

遇到的主要问题涉及由于G8x和G9x芯片对IEEE单精度浮点数的限制而导致的精度损失。随着GT200芯片的发布,可以通过使用双精度单元在某种程度上减轻这种情况,但会降低性能。我还没有尝试过。

而且,由于CUDA是C扩展,因此将其集成到另一个应用程序中可能并非易事。

回答

我一直在使用ATI的流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 3级或者LAPACK函数(如矩阵的LU分解)或者找到其特征值,存在O(N ^ 3)个计算和O(N ^ 2)个存储引用,因此NI为O(N)。对于非常小的数组,比如说N是几个分数,在cpu上这样做仍然会更快,但是随着N的增加,该算法很快就会从内存限制变为计算范围,并且gpu的性能提高非常快迅速地。

任何涉及复杂算术的事物都比标量算术具有更多的计算量,而标量算术通常使NI翻倍,并提高gpu性能。

http://home.earthlink.net/~mtie/CGEMM%20081121.gif

这是在Radeon 4870上完成的CGEMM复杂单精度矩阵矩阵乘法的性能。

回答

我已经将CUDA用于多种图像处理算法。这些应用程序当然非常适合CUDA(或者任何GPU处理范例)。

IMO,将算法移植到CUDA时有三个典型阶段:

  • 初始移植:即使具有CUDA的非常基础的知识,我们也可以在几个小时内移植简单的算法。如果幸运的话,表现将提高2到10倍。
  • 简单优化:这包括使用纹理输入数据和填充多维数组。如果我们有经验,可以在一天之内完成操作,并且可能会给我们带来10倍的性能提升。结果代码仍然可读。
  • 核心优化:包括将数据复制到共享内存以避免全局内存延迟,将代码内翻以减少使用的寄存器数量,等等。我们可以花几周时间执行此步骤,但是性能提升并不是真正值得的在大多数情况下。完成此步骤后,代码将变得混乱,以至于没人能理解(包括我们在内)。

这与为CPU优化代码非常相似。但是,GPU对性能优化的响应甚至比CPU更难预测。

回答

是的。我已经使用CUDA API实现了非线性各向异性扩散滤波器。

这很容易,因为它是必须在给定输入图像的情况下并行运行的过滤器。我并没有遇到很多困难,因为它只需要一个简单的内核。加速约为300倍。这是我关于CS的最后一个项目。该项目可以在这里找到(用葡萄牙语写)。

我也尝试编写Mumford&Shah分割算法,但是编写起来很痛苦,因为CUDA仍处于起步阶段,因此发生了很多奇怪的事情。我什至通过在代码O_O中添加if(false){}来提高性能。

此分割算法的结果不佳。与CPU方法相比,我的性能损失为20倍(但是,由于它是CPU,因此可以采用产生相同结果的另一种方法)。这项工作仍在进行中,但是不幸的是我离开了我正在研究的实验室,所以也许有一天我可能会完成它。

回答

我在GPU上实现了遗传算法,并加快了大约7倍的速度。正如其他人指出的那样,以更高的数字强度可以获得更多的收益。是的,如果应用正确,收益就在那里

回答

我已经实现了Cholesky分解,以使用ATI Stream SDK在GPU上求解大型线性方程。我的观察是

性能提升高达10倍。

通过将其缩放到多个GPU来处理同一问题,以对其进行更多优化。