CUDA:关于活动warp(活动块)以及如何选择块大小的问题

时间:2011-03-21 13:55:34

标签: multithreading cuda

假设一个CUDA GPU在一个多处理器上可以有48个同时有效的warp,即一个warp的48个块,或者2个warp的24个块,...,因为来自多个块的所有活动warp都被安排执行,它似乎块的大小对GPU的占用率并不重要(当然它应该是32的倍数),无论是32,64还是128都没有区别,对吧?那么块的大小只取决于计算任务和资源限制(共享内存或寄存器)?

2 个答案:

答案 0 :(得分:3)

有许多因素需要考虑,你可以省略。

  • SM上的活动块数量有限制。电流限制为8(所有器件),因此如果要实现完全占用,则块不应小于:3-warps(器件1.0,1.1),4-warps(1.2,1.3)和6-warps (2.X)
  • 根据设备的不同,每个多处理器可以使用8K,16K或32K寄存器。块越大,块需要多少寄存器的“粒度”就越大。对于大块,如果无法实现完全占用,那么你会失去很多。对于较小的块,损失可能较小。这就是个人原因,我更喜欢2x256而不是1x512。
  • 如果确实需要块中warp之间的同步,则较大的块允许您进行更广泛的同步。
  • 保证在单个多处理器上安排单个块。如果所有warp都有一些常见数据(例如控制变量),则可以减少全局内存提取次数。另一方面,当您创建大量小块时,每个小块可能需要单独加载相同的数据。在Fermi上有一些缓存,它没有GF-200系列那么重要。但请记住,由于有多个多处理器,1MB L2缓存仍然非常非常小!

答案 1 :(得分:-1)

否。 块大小很重要。

如果您拥有32个线程的块大小,则占用率非常低。 如果您的块大小为256,则占用率很高。这意味着所有256个都同时处于活动状态。 超过256个线程/块很少会产生一些差异。

由于涉及的架构很复杂,使用您的软件进行测试始终是最好的方法。