替代CUDA的动态并行性

时间:2013-07-10 16:11:49

标签: parallel-processing cuda expectation-maximization

我想,我对CUDA编程模型和编程很新。我尝试并行化期望最大化算法。我正在研究具有计算能力2.0的gtx 480。起初,我有点假设设备没有理由启动自己的线程,但当然,我很遗憾地错了。我偶然发现了这个pdf。

http://docs.nvidia.com/cuda/pdf/CUDA_Dynamic_Parallelism_Programming_Guide.pdf

不幸的是,动态并行仅适用于最新且最好的GPU,计算能力为3.5。如果没有深入细节,动态并行的替代方案是什么? CPU EM算法中的循环具有许多依赖性并且是高度嵌套的,这似乎使动态并行性成为一种有吸引力的能力。我不确定我的问题是否有意义,请询问您是否需要澄清。

谢谢!

2 个答案:

答案 0 :(得分:2)

如@JackOLantern所示,动态并行可以简单地描述为从设备代码(__global____global__调用内核(即__device__函数)的能力功能)。

由于内核调用是机器为响应单个函数调用而旋转多个线程的主要方法,因此实际上没有 direct 替代方法可以提供动态并行的所有功能。不支持它的设备(即pre cc 3.5设备)。

如果没有动态并行性,您的整体代码几乎肯定会涉及CPU代码和GPU代码之间的更多同步和通信。

主要方法是将代码的某些单元实现为可并行化,将其转换为内核,并以非嵌套方式处理代码。可以通过在内核中循环来完成重复功能,或者在调用内核的主机代码中循环。

有关我想要描述的图片示例,请参阅this deck的幻灯片14,其中介绍了CUDA 5的一些新功能,包括动态并行性。右边的代码架构是用动态并行实现的算法。左侧的体系结构是在没有动态并行性的情况下实现的相同功能。

答案 1 :(得分:0)

我已经在维基百科检查了你的算法,我不确定你是否需要动态并行性。

您在内核中执行期望步骤__syncthreads(),执行最大化步骤,然后再次执行__syncthreads()。从这个距离来看,期望看起来像一个简化原语,而最大化是一个过滤器。

如果它不起作用,并且您需要真正的任务并行性,GPU可能不是最佳选择。虽然Kepler GPU可以在某种程度上做到这一点,但这不是这种架构的设计目标。在这种情况下,您可能最好使用多CPU系统,例如办公室网格,超级计算机或Xeon Phi加速器。您还应该检查OpenMP和MPI,这些是用于任务并行编程的语言(实际上,OpenMP在大多数情况下只是少数几个pragma)。