2013-07-10 47 views
0

我想CUDA编程模型和编程一般都很新。我试图并行化一个期望最大化算法。我正在研究具有计算能力2.0的gtx 480。起初,我认为设备没有理由启动自己的线程,但当然,我很遗憾错误。我遇到这个pdf。CUDA动态并行的替代方案

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

不幸的是,动态并行只适用于最新和最伟大的GPU,计算能力3.5。没有深入研究太多的细节,动态平行的另一种选择是什么? CPU EM算法中的循环具有很多依赖性并且高度嵌套,这似乎使动态并行性成为一种有吸引力的能力。我不确定我的问题是否有意义,所以请询问是否需要澄清。

谢谢!

+0

在动态并行机制中,内核中有内核调用。如果你规定内核调用可以用'for'循环交换,那么粗略地说你应该用'for'循环交换嵌套的内核调用。 – JackOLantern

+0

@RobertCrovella你们应该真的对GPU的命名做些事情。一个GT 640来作为2.1,3.0和3.5?https://developer.nvidia.com/cuda-gpus –

+0

@RobertCrovella GT 640不再显示为计算3.5。也许你想收回那条评论。 –

回答

0

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

你做的期望一步在内核中,__syncthreads(),做到最大化步骤,并再次__syncthreads()。从这个距离看,期望看起来像是一个简化原语,最大化是一个过滤器。

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

+0

让我事先说明我对期望最大化不是很熟悉。尽管如此,在我看来,除了特殊情况之外,最大化应该作为优化问题来处理,在每个迭代步骤中计算期望值。根据您必须优化的参数数量,GPU大规模并行可用于计算要优化的功能及其衍生工具,以实现快速和准确的收敛。 – JackOLantern

+0

@Kristof,我正在使用的当前实现使用开放式MPI,但它并不像我正在开发的那样快。 – user2529048