利用GPU值得吗?

3
我希望计算受特定势能影响的粒子的轨迹,这是一个典型的N体问题。我一直在研究利用GPU(例如CUDA)的方法,并且它们似乎有益于具有大N(20000)的模拟。这是有道理的,因为最昂贵的计算通常是找到力。然而,我的系统将具有“低”N(少于20),许多不同的势能/因素和许多时间步骤。将此系统移植到GPU是否值得?

根据使用CUDA进行快速N-Body模拟文章,似乎为不同的计算(如加速度和力)使用不同的内核是有效的。对于低N系统,由于每个时间步骤都需要为每个内核从设备复制和检索数据,因此从设备复制和检索数据的成本实际上是相当显著的。

非常感谢您的任何想法。


2
GFOR循环正是针对这类问题(数据规模小但迭代次数多)而设计的。在ArrayFire中查看它(我是其中一位开发人员):http://www.accelereyes.com/arrayfire/c/page_gfor.htm - arrayfire
请注意,随着即将到来的C++17,您可以使用相同的代码和不同的parallell_for属性尝试两个选项。 - einpoklum
2个回答

3
如果你需要并行模拟少于20个实体,我建议使用普通的多核CPU进行并行处理,不必考虑使用GPU。使用多核CPU编程更容易,避免将所有操作转换为GPU操作的步骤。此外,正如你已经提到的,使用GPU在这种小规模进程中性能收益很小(甚至可能是负面的)。

1

在时间步骤之间,无需将结果从设备复制到主机再返回。只需在GPU上运行整个模拟,并在计算了几个时间步骤后才将结果复制回来。

您需要运行多少不同的电位模拟?是否足够使用N体示例中的结构并仍然加载整个GPU?

如果不是,并且假设电位计算很昂贵,我认为最好使用每对粒子一个线程,以使问题足够并行化。如果您为每个潜力设置使用一个块,则可以将力写入共享内存,__syncthreads(),并使用块的线程子集(每个粒子一个)来求和力。再次使用__syncthreads(),并继续下一个时间步骤。

如果电位计算不昂贵,可能值得先探索您的模拟的主要成本在哪里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接