计算GPU上并行程序的一部分的可能选项

时间:2015-12-09 14:10:28

标签: c++ cuda parallel-processing opencl gpu-programming

嗨,我对gpu并不熟悉,我只是有一个理论问题。

所以我正在开发一个名为Sassena的应用程序,它可以从分子动力学轨迹计算中子散射。此应用程序与MPI并行编写,非常适合CPU。但是我愿意在GPU上运行这个应用程序以使其更快。当然不是全部,而是部分。当我查看Source Code时,它的工作方式是典型的MPI,这意味着第一级将数据单独发送到每个节点,然后每个节点进行计算。现在,有一部分计算正在使用快速傅立叶变换(FFT),它耗费了大部分时间,我想将这部分发送到GPU。

我看到前面有2个解决方案:

  1. 当节点到达FFT部分时,它们应该将数据发送回主节点,当主节点收集它发送给GPU的所有数据时,GPU会进行FFT,然后将其发送回cpu和cpu完成剩下的工作。

  2. 每个节点都会动态地将数据发送到GPU,在GPU完成FFT之后,它会发送回每个节点并完成其余的工作。

  3. 所以我的问题是这两个中哪一个是可能的。我知道第一个是可行的,但它有很多沟通,这是耗时的。但第二种方式我不知道是否有可能。我知道在第二种情况下它也将依赖于计算机体系结构。但CUDA或OpenCL是否能够做到这一点?

    感谢您的任何想法。

1 个答案:

答案 0 :(得分:1)

据我所知,您不受CUDA的限制。您在此处受限制的是您拥有的GPU数量。您需要创建某种队列,将您的工作分配给可用的GPU并跟踪可用资源。根据CPU数量与GPU数量之间的比率以及每个FFT所花费的时间量,您可能需要等待更长时间才能将每个FFT传递到GPU,而不是仅仅在每个核心上执行此操作。

我的意思是你失去了在每个核心上执行的FFT的异步计算。相反,CPU 2必须等待CPU 1完成其FFT计算才能在GPU上启动新内核。

除了我所说的,可以创建一个简单的互斥锁,当CPU开始计算其FFT时锁定它,并在完成时解锁,以便下一个CPU可以使用GPU。

您可以查看StarPU。它是一个基于任务的api,可以处理向GPU发送任务。它也是为分布式内存模型设计的。