Cuda 利用GPU值得吗?

Cuda 利用GPU值得吗?,cuda,gpu,simulation,Cuda,Gpu,Simulation,我想计算粒子在一定势下的轨迹,一个典型的N体问题。我一直在研究利用GPU(例如CUDA)的方法,它们似乎有利于大N(20000)的模拟。这是有道理的,因为最昂贵的计算通常是找到力 然而,我的系统将具有“低”N(小于20)、许多不同的电位/因子和许多时间步长。把这个系统移植到GPU值得吗 根据这篇文章,对于不同的计算(如加速度和力),使用不同的内核似乎是有效的。对于低N的系统,似乎从设备复制到设备的成本实际上是巨大的,因为对于每个时间步骤,必须为每个内核从设备复制和检索数据 如果您有任何想法,我们

我想计算粒子在一定势下的轨迹,一个典型的N体问题。我一直在研究利用GPU(例如CUDA)的方法,它们似乎有利于大N(20000)的模拟。这是有道理的,因为最昂贵的计算通常是找到力

然而,我的系统将具有“低”N(小于20)、许多不同的电位/因子和许多时间步长。把这个系统移植到GPU值得吗

根据这篇文章,对于不同的计算(如加速度和力),使用不同的内核似乎是有效的。对于低N的系统,似乎从设备复制到设备的成本实际上是巨大的,因为对于每个时间步骤,必须为每个内核从设备复制和检索数据


如果您有任何想法,我们将不胜感激。

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

对于多少种不同的电位,您需要运行模拟?足够使用N-body示例中的结构并仍然加载整个GPU吗

如果不是,并且假设势计算是昂贵的,我认为最好对每对粒子使用一个线程,以便使问题足够平行。如果使用“每个电势一个块”设置,则可以将力写入共享内存,\uuu syncthreads(),并使用块线程的子集(每个粒子一个)对力求和__再次执行syncthreads(),并继续执行下一个时间步骤


如果潜在的计算成本不高,那么可能值得首先探讨一下模拟的主要成本在哪里。

如果需要并行模拟的实体不到20个,我只会在普通多核CPU上使用并行处理,而不用担心使用GPU

使用多核CPU将更容易编程,并避免将所有操作转换为GPU操作的步骤


此外,正如您所建议的,使用GPU的性能增益将很小(甚至是负的),因为进程数量很少。

GFOR循环正是针对这类问题(数据量小但迭代次数多)。在ArrayFire中查看它(我是其中的一员):请注意,在即将推出的C++17中,您可能可以在
parallel_for
中使用相同的代码和不同的属性来试验这两个选项。