0

我需要加速我现在使用 PyLab 进行的许多计算。我想到了使用 CUDA。整个计算单元 (A) 包括执行几个(数千个)完全独立的较小计算 (B)。它们中的每一个在初始阶段都涉及进行 40-41 次独立的、甚至更小的计算 (C)。所以并行编程应该真的有帮助。使用 PyLab,总体 (A) 需要 20 分钟,(B) 需要十分之一秒。

作为这个领域的初学者,我的问题是我应该在哪个级别并行计算,无论是在 (C) 还是在 (B)。

我应该澄清一下,(C)阶段包括获取在所有(C)进程之间共享的一堆数据(数千个浮点数),并执行各种任务,其中最耗时的一个是线性回归,其中也是可并行的!每个过程 (C) 的输出是一个浮点数。每个计算 (B) 基本上包括执行多次程序 (C) 并对输出的数据进行线性回归。同样,它的输出是一个浮点数。

我不熟悉 CUDA 编程,所以我基本上是在问最明智的策略是什么。

4

1 回答 1

0

在决定如何(以及是否)将项目转换为 CUDA 时,一个重要的考虑因素是您的代码需要哪种类型的内存访问模式。GPU 以 32 个一组的线程运行,称为 warp,为了获得最佳性能,warp 中的线程应该以一些基本模式访问内存,这些模式在 CUDA 编程指南(包含在 CUDA 中)中进行了描述。一般来说,访问模式越随机,内核就越有可能成为内存绑定。在这种情况下,GPU 中的计算能力无法得到充分利用。

无法充分利用 GPU 中的计算能力的另一个主要情况是,是否存在条件逻辑和循环导致 warp 中的线程运行通过不同的代码路径,因为 GPU 必须运行 warp 中的所有线程通过每个代码路径。

如果您发现这些点可能会导致您的代码出现问题,您还应该进行一些研究,看看是否有已知的替代方法可以实现您的代码以在 GPU 上更好地运行(通常是这种情况)。

如果您根据上述考虑看到关于在哪个级别并行化计算的问题,则可能会清楚做出哪个选择。

于 2012-09-03T05:17:43.150 回答