【问题标题】:Utilizing GPU worth it?使用 GPU 值得吗?
【发布时间】:2018-01-07 10:06:13
【问题描述】:

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

但是,我的系统将具有“低”N(小于 20)、许多不同的潜力/因素以及许多时间步长。将此系统移植到 GPU 是否值得?

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

任何想法将不胜感激。

【问题讨论】:

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

标签: cuda gpu simulation


【解决方案1】:

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

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

此外,正如您已经建议的那样,使用 GPU 的性能增益将很小(甚至是负数),而进程数量如此之少。

【讨论】:

    【解决方案2】:

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

    运行模拟需要多少种不同的电位?仅使用 N 体示例中的结构并仍然加载整个 GPU 就够了吗?

    如果不是,并且假设潜在的计算成本很高,我认为最好为每个 pair 粒子使用一个线程,以使问题充分并行。如果每个潜在设置使用一个块,则可以将力写入共享内存 __syncthreads(),并使用块线程的子集(每个粒子一个)来对力求和。 __syncthreads() 再次,并继续下一个时间步。

    如果潜在的计算成本不高,则可能值得首先探索模拟的主要成本在哪里。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2011-08-03
      • 1970-01-01
      • 2011-02-01
      • 2017-05-24
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多