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

Possible options to calculate a part of paralleled Program over GPU

本文关键字:一部分 选项 程序 GPU 计算 并行 通过      更新时间:2023-10-16

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

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

我看到两个解决方案摆在我面前:

  1. 当节点到达FFT部分时,它们应该将数据发送回主节点,当主节点收集所有数据时,它将其发送给GPU,然后GPU进行FFT,将其发送回cpu,cpu进行其余操作。

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

所以我的问题是这两者中哪一个是可能的。我知道第一个是可行的,但它需要大量的沟通,这很耗时。但第二种方式,我不知道这是否可能。我知道在第二种情况下,它也将取决于计算机体系结构。但是CUDA或OpenCL能做到这一点吗??

谢谢你的任何想法。

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

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

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

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