【问题标题】:Minimum number of GPU threads to be effective有效的最小 GPU 线程数
【发布时间】:2011-08-11 17:12:20
【问题描述】:

我将在 CUDA 上并行处理一些优化问题的本地搜索算法。这个问题非常难,所以实际可解决的问题的规模很小。 我担心的是,计划在一个内核中运行的线程数量不足以在 GPU 上获得任何加速(即使假设所有线程都已合并,没有银行冲突,非分支等)。 假设为 100 个线程启动了一个内核。期望从使用 GPU 中获利是否合理?如果线程数是 1000 怎么办?分析案例还需要哪些额外信息?

【问题讨论】:

  • 拥有 100 个线程可能不会带来太多好处 - 如果你有数千个线程,CUDA 编程通常会变得实用,尤其是如果它们都做同样的事情。
  • 准确地说,你的意思是同一条经线的线要做同样的事情,不是吗?
  • 编写一个能正确完成您需要的原型,然后担心加快速度。如果有与您需要的类似的东西,请查看推力。
  • @AdelNick:好吧,至少,是的,如果这种区别有帮助的话。一般来说,任何形式的分支都是不好的。
  • 如果你有一个难题并且你能想出的最好的方法是 100 线程并行化,那么要么 (a) 你没有认真思考或者 (b) 这不是很好- 适合 GPU。对于您的问题和环境,真正回答您的问题的唯一方法是微不足道的……编写、测试、分析、修改、重复。

标签: cuda gpu


【解决方案1】:

100 个线程是不够的。理想情况下,您需要一个可以划分为至少与 GPU 上的多处理器 (SM) 一样多的线程块的大小,否则您将让处理器处于空闲状态。出于同样的原因,每个线程块应该有不少于 32 个线程。理想情况下,每个块应该有 32 个线程的小倍数(比如 96-512 个线程),如果可能的话,每个 SM 应该有多个这些块。

至少,您应该尝试有足够的线程来覆盖 SM 的算术延迟,这意味着在 Compute Capability 2.0 GPU 上,每个 SM 需要大约 10-16 个 warp(32 个线程组)。不过,它们并不都需要来自同一个线程块。这意味着,例如,在具有 14 个 SM 的 Tesla M2050 GPU 上,您将需要至少 4480 个线程,至少分为 14 个块。

也就是说,比这更少的线程也可以提供加速 - 这取决于许多因素。例如,如果计算受带宽限制,并且您可以将数据保存在设备内存中,那么您可以获得加速,因为 GPU 设备内存带宽高于 CPU 内存带宽。或者,如果它受计算限制,并且有很多指令级并行性(来自同一线程的独立指令),那么您将不需要那么多线程来隐藏延迟。后一点在 GTC 2010 的 Vladimir Volkov 的"Better performance at lower occupancy" talk 中得到了很好的描述。

主要是确保您使用所有 SM:如果不这样做,您并没有使用 GPU 可以提供的所有计算性能或带宽。

【讨论】:

  • @harrism:编程指南中是否有一个地方讨论了为了使任务有效而使用的线程数
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多