在CUDA中推出最有效的块数?

时间:2013-05-08 22:33:48

标签: cuda gpgpu

  • 我有一个非常大的数组N0元素。
  • 每个线程都将循环并对m元素进行操作。
  • 我已经修复了每个块TBP个线程。
  • CUDA约束每格网格BPG < 65535 =: BPG_max

现在,让我们缩小规模,并考虑使用N0 = 90的{​​{1}}元素数组。

  • 我可以解雇TBP = 32,这意味着3 blocks of 32 threads each looping once (m = 1)元素可以被操作 - 即浪费6
  • 或者我可以解雇3 x 32 x 1 = 96,这意味着2 blocks of 32 with m = 2元素可以被操作,这是浪费的38

对于大型阵列(100MB +)和大量循环(10,000+),因素会变得更大,因此浪费会变得非常大,所以如何最大限度地减少浪费?也就是说,我想要一个优化程序(其中2 x 32 x 2 = 128表示已完成的实际工作):

enter image description here

3 个答案:

答案 0 :(得分:2)

我不会担心“浪费”的线程 - GPU线程很轻。

您可能实际上想要增加块大小,因为这可能会增加GPU的占用率。请注意,SMX(在GeForce 6xx系列中)只能执行16个并发块。使块更大可以让您安排更多线程来隐藏内存访问延迟。

答案 1 :(得分:0)

这实际上是一个非常复杂的问题,我怀疑它有一个O(1)解决方案。 但我猜你可以在CPU上花费一些线性时间来计算最小值。

This is wolfram alpha's opinion.

答案 2 :(得分:0)

根据您在内核中所做的一切,答案可能会或可能不会像您引用的优化问题一样简单。例如。如果您要遇到延迟问题,线程等待彼此完成等等,那么还有更多问题需要考虑。

site有一些很好的启发式方法。一些一般亮点:

每格选择块

  • 每个网格的块数应为> =多个处理器的数量。
  • 内核中__syncthreads()的使用越多,块越多(一个块可以运行而另一个块等待同步)

每个块选择线程

  • 以经线大小的倍数(即一般为32)的线程

  • 通常可以选择线程数,这样每个块的最大线程数(基于硬件)是线程数的倍数。例如。最大线程数为768,每块使用256个线程往往优于512,因为多个线程可以在块上同时运行。

  • 考虑一下你的线程是否会分享内存,如果是,你想分享多少内存。