cuda共享内存和块执行调度

时间:2012-09-29 10:28:08

标签: cuda shared-memory warp-scheduler

我想基于每个块使用的共享内存量,使用 CUDA共享内存块执行来清除执行状态。

国家

我的目标是每块有48KB 共享内存的GTX480 nvidia卡和15个流式多处理器。因此,如果我声明一个包含15个块的内核,每个块使用48KB的共享内存,并且没有达到其他限制(寄存器,每个块的最大线程数等),每个块运行到一个SM(15个)直到结束。在这种情况下,仅需要在同一块的warp之间进行调度。

问题

所以,我的误解情景是:
我调用一个包含30个块的内核,这样每个SM上就有2个块。现在每个SM上的调度程序必须处理来自不同块的warp。但只有当一个块完成其执行时,另一个块的warp才会在SM上执行,因为共享内存的总量(每个SM 48KB)使用。如果没有发生这种情况并且调度在同一SM上执行的不同块的变形,则结果可能是错误的,因为一个块可以读取在共享存储器中从另一个块加载的值。我是对的吗?

1 个答案:

答案 0 :(得分:1)

您无需担心这一点。正如您所说的那样,如果由于使用的共享内存量,每个SM只有一个块适合,则任何时候都只会安排一个块。因此,过度使用共享内存不会导致内存损坏。


BTW出于性能原因,每个SM至少运行两个块通常会更好,因为

  • 在__syncthreads()期间,SM可能空闲不必要,因为来自块的更少和更少的warp仍然可以运行。
  • 同一块的warp倾向于紧密耦合,因此有时候所有warp都会等待内存,有时候所有warp都会执行计算。有了更多的块,这可能会更好,从而提高整体的资源利用率。

当然,可能有理由为每个块提供更多的共享内存比每个SM运行多个块提供更大的加速。