嗨,我对gpu并不熟悉,我只是有一个理论问题。
所以我正在开发一个名为Sassena的应用程序,它可以从分子动力学轨迹计算中子散射。此应用程序与MPI并行编写,非常适合CPU。但是我愿意在GPU上运行这个应用程序以使其更快。当然不是全部,而是部分。当我查看Source Code时,它的工作方式是典型的MPI,这意味着第一级将数据单独发送到每个节点,然后每个节点进行计算。现在,有一部分计算正在使用快速傅立叶变换(FFT),它耗费了大部分时间,我想将这部分发送到GPU。
我看到前面有2个解决方案:
当节点到达FFT部分时,它们应该将数据发送回主节点,当主节点收集它发送给GPU的所有数据时,GPU会进行FFT,然后将其发送回cpu和cpu完成剩下的工作。
每个节点都会动态地将数据发送到GPU,在GPU完成FFT之后,它会发送回每个节点并完成其余的工作。
所以我的问题是这两个中哪一个是可能的。我知道第一个是可行的,但它有很多沟通,这是耗时的。但第二种方式我不知道是否有可能。我知道在第二种情况下它也将依赖于计算机体系结构。但CUDA或OpenCL是否能够做到这一点?
感谢您的任何想法。
答案 0 :(得分:1)
据我所知,您不受CUDA的限制。您在此处受限制的是您拥有的GPU数量。您需要创建某种队列,将您的工作分配给可用的GPU并跟踪可用资源。根据CPU数量与GPU数量之间的比率以及每个FFT所花费的时间量,您可能需要等待更长时间才能将每个FFT传递到GPU,而不是仅仅在每个核心上执行此操作。
我的意思是你失去了在每个核心上执行的FFT的异步计算。相反,CPU 2
必须等待CPU 1
完成其FFT计算才能在GPU上启动新内核。
除了我所说的,可以创建一个简单的互斥锁,当CPU开始计算其FFT时锁定它,并在完成时解锁,以便下一个CPU可以使用GPU。
您可以查看StarPU。它是一个基于任务的api,可以处理向GPU发送任务。它也是为分布式内存模型设计的。