我需要加速我正在使用PyLab进行的许多计算。我想过使用CUDA。总计算单位(A)包括进行几个(数千个)完全独立的较小计算(B)。它们中的每一个都在初始阶段涉及40-41个独立的,甚至更小的计算(C)。所以并行编程应该真的有帮助。使用PyLab,总体(A)需要20分钟,(B)需要十分之一秒。
作为这个领域的初学者,我的问题是我应该在什么级别并行计算,无论是在(C)还是在(B)。
我应该澄清一下,(C)阶段包括获取一堆数据(数千个浮点数),这些数据在所有(C)进程之间共享,并执行各种任务,其中最耗时的一个是线性的回归,也是可并行化的!每个过程(C)的输出是一个浮点数。每个计算(B)基本上包括多次执行过程(C)并对出来的数据进行线性回归。它的输出再次是一个浮点数。
我不熟悉CUDA编程,所以我基本上都在问什么是最明智的策略。
答案 0 :(得分:0)
在决定如何(以及如何)将项目转换为CUDA时,一个重要的考虑因素是代码所需的内存访问模式类型。 GPU以32个为一组运行线程,称为warp,为了获得最佳性能,warp中的线程应以某些基本模式访问内存,这些模式在CUDA编程指南(包含在CUDA中)中有所描述。通常,访问模式越随机,内核越有可能成为内存绑定。在这种情况下,GPU中的计算能力无法得到充分利用。
GPU中的计算能力无法充分利用的另一个主要情况是,是否存在条件逻辑和循环导致warp中的线程运行不同的代码路径,因为GPU必须运行所有线程经过每个代码路径的扭曲。
如果您发现这些点可能会导致代码出现问题,您还应该进行一些研究,看看是否有已知的替代方法来实现您的代码以便在GPU上运行得更好(通常就是这种情况)。
如果根据上述考虑因素看到关于在哪个级别上并行计算的问题,可能会明确选择哪个。