【发布时间】:2012-09-03 13:17:43
【问题描述】:
我需要加速我现在使用 PyLab 进行的许多计算。我想到了使用 CUDA。整个计算单元 (A) 包括执行几个(数千个)完全独立的较小计算 (B)。它们中的每一个在初始阶段都涉及进行 40-41 次独立的、甚至更小的计算 (C)。所以并行编程应该真的有帮助。使用 PyLab,总体 (A) 需要 20 分钟,(B) 需要十分之一秒。
作为这个领域的初学者,我的问题是我应该在哪个级别并行计算,无论是在 (C) 还是在 (B)。
我应该澄清一下,(C)阶段包括获取在所有(C)进程之间共享的一堆数据(数千个浮点数),并执行各种任务,其中最耗时的任务之一是线性的回归,这也是可并行的!每个过程 (C) 的输出是一个浮点数。每个计算 (B) 基本上包括多次执行过程 (C) 并对输出的数据进行线性回归。同样,它的输出是一个浮点数。
我不熟悉 CUDA 编程,所以我基本上是在问最明智的策略是什么。
【问题讨论】:
-
在您使用 CUDA 之前,您可能需要考虑利用多个 CPU 内核、SIMD 等。
-
@PaulR,如果 SIMD 编码意味着在汇编中为 SIMD 指令集之一手动编码,那么我不同意您可能希望在 CUDA 之前考虑 SIMD。在这种情况下,为 CUDA 编写代码要容易得多(因为您使用 C/C++ 编写代码)并产生更快的代码(如果您的系统异常平衡,CPU 速度非常快而 GPU 速度很慢,则可能会例外)。 Microsoft PPL 或 AMP 之类的技术可以生成 SIMD 代码,但它们有自己的学习曲线,上手可能并不容易(尽管我没有检查过)。
-
@Roger Dahl:SIMD 和 GPGPU 各有利弊,“最佳”解决方案将取决于应用程序的性质,例如对于广泛分布和长生命周期的生产代码,参数将与在单台机器上运行的研发代码有很大不同。话虽如此,根据我的经验,SIMD 比 GPGPU 适用于更大的问题域,具有更容易的学习曲线,更便携,并且比 GPGPU 具有更少的约束。请注意,C/C++ 参数并不真正适用,因为 SIMD 可以使用内在函数进行编码。
-
@PaulR:我同意一般来说,最佳解决方案取决于应用程序的性质。我的评论是基于希望加速我认为是内部应用程序的 OP(因为它在 PyLab 下运行)。内在函数仍然是汇编,所以我不明白它是如何否定 C/C++ 参数的。我很想了解更多关于你在这方面的想法,所以我在聊天中设置了频道。如果你有时间,请进来! chat.*.com/rooms/16201/simd-vs-gpgpu
-
@Roger:当然 - 我会在那个聊天线程上发布 cmets...
标签: optimization parallel-processing cuda