Cuda 您是否已成功使用GPU?

Cuda 您是否已成功使用GPU?,cuda,gpgpu,hpc,Cuda,Gpgpu,Hpc,我很想知道是否有人编写了一个应用程序,通过使用,例如。如果是这样,您发现了什么问题?与标准CPU相比,您取得了哪些性能提升?我一直在使用GPGPU进行运动检测(最初使用CG,现在使用CUDA)和稳定(使用CUDA)以及图像处理。 在这种情况下,我得到了大约10-20倍的加速 据我所知,这对于数据并行算法来说是相当典型的 我已经编写了一些简单的应用程序,如果您可以并行化浮点计算,这将非常有帮助 我发现以下课程是由伊利诺伊大学Urrina MangaPange教授和NVIDIA工程师在我开始的时候非

我很想知道是否有人编写了一个应用程序,通过使用,例如。如果是这样,您发现了什么问题?与标准CPU相比,您取得了哪些性能提升?

我一直在使用GPGPU进行运动检测(最初使用CG,现在使用CUDA)和稳定(使用CUDA)以及图像处理。 在这种情况下,我得到了大约10-20倍的加速


据我所知,这对于数据并行算法来说是相当典型的

我已经编写了一些简单的应用程序,如果您可以并行化浮点计算,这将非常有帮助


我发现以下课程是由伊利诺伊大学Urrina MangaPange教授和NVIDIA工程师在我开始的时候非常有用的:(包括所有课程的录音)。

P>但我还没有任何关于CUDA的实践经验,我一直在研究这个主题,发现了一些使用GPGPU API记录积极结果的论文(它们都包括CUDA)

这描述了如何通过创建大量并行原语(映射、散布、聚集等)并行化数据库连接,这些原语可以组合成一个高效的算法

在这种情况下,AES加密标准的并行实现以与离散加密硬件相当的速度创建


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

我在CUDA中实现了蒙特卡罗计算,用于一些金融用途。经过优化的CUDA代码比“本可以更努力,但不是真的”多线程CPU实现快约500倍。(此处将GeForce 8800GT与Q6600进行比较)。众所周知,蒙特卡罗问题是令人尴尬的平行问题

遇到的主要问题包括由于G8x和G9x芯片对IEEE单精度浮点数的限制而导致的精度损失。随着GT200芯片的发布,可以通过使用双精度单元在一定程度上缓解这一问题,但要牺牲一些性能。我还没有试过


此外,由于CUDA是一个C扩展,因此将其集成到另一个应用程序中是非常重要的。

我一直在用gpgpu而不是CUDA进行开发。 您将获得何种性能增益取决于许多因素,但最重要的是数值强度。(即计算操作与内存引用的比率。)

BLAS level-1或BLAS level-2函数(如添加两个向量)仅对每3个内存引用执行1次数学运算,因此NI为(1/3)。与仅在cpu上运行相比,使用CAL或Cuda运行速度总是较慢。主要原因是将数据从cpu传输到gpu和gpu所需的时间

对于像FFT这样的函数,有O(N logn)计算和O(N)内存引用,因此NI是O(logn)。如果N非常大,比如1000000,那么在gpu上执行它可能会更快;如果N很小,比如说1000,它几乎肯定会慢一些

对于BLAS 3级或LAPACK函数,如矩阵的LU分解,或查找其特征值,有O(N^3)计算和O(N^2)内存引用,因此NI为O(N)。对于非常小的阵列,假设N是几分,这在cpu上仍然会更快,但随着N的增加,算法会很快从内存边界转到计算边界,gpu上的性能增长也会很快

任何涉及复杂算术的运算都比标量算术要多,标量算术通常使NI增加一倍并提高gpu性能


(来源:)


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

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

在我看来,将算法移植到CUDA有三个典型阶段:

  • 初始移植:即使具备CUDA的基本知识,您也可以在几个小时内移植简单的算法。如果幸运的话,你的表现会提高2到10倍
  • 琐碎的优化:这包括使用纹理输入数据和填充多维数组。如果你有经验,这可以在一天内完成,并可能会给你另一个10倍的表现。生成的代码仍然可读
  • 核心优化:这包括将数据复制到共享内存以避免全局内存延迟、将代码从内到外以减少使用的寄存器数量等。您可以花几个星期完成此步骤,但在大多数情况下,性能提升并不值得。在这一步之后,您的代码将变得非常模糊,以至于没有人理解它(包括您)

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

    是的。我已经使用CUDAAPI实现了

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

    我也试过写分割算法,但写起来很痛苦,因为CUDA还处于起步阶段,所以发生了很多奇怪的事情。我甚至在代码O_O中添加了
    if(false){}
    ,从而提高了性能

    这种分割算法的结果并不理想。与CPU方法相比,我的性能损失了20倍(然而,因为它是一个CPU,不同的方法使用相同的结果)