我想基于每个块使用的共享内存量,使用 CUDA共享内存和块执行来清除执行状态。
我的目标是每块有48KB 共享内存的GTX480 nvidia卡和15个流式多处理器。因此,如果我声明一个包含15个块的内核,每个块使用48KB的共享内存,并且没有达到其他限制(寄存器,每个块的最大线程数等),每个块运行到一个SM(15个)直到结束。在这种情况下,仅需要在同一块的warp之间进行调度。
所以,我的误解情景是:
我调用一个包含30个块的内核,这样每个SM上就有2个块。现在每个SM上的调度程序必须处理来自不同块的warp。但只有当一个块完成其执行时,另一个块的warp才会在SM上执行,因为共享内存的总量(每个SM 48KB)使用。如果没有发生这种情况并且调度在同一SM上执行的不同块的变形,则结果可能是错误的,因为一个块可以读取在共享存储器中从另一个块加载的值。我是对的吗?
答案 0 :(得分:1)
您无需担心这一点。正如您所说的那样,如果由于使用的共享内存量,每个SM只有一个块适合,则任何时候都只会安排一个块。因此,过度使用共享内存不会导致内存损坏。
BTW出于性能原因,每个SM至少运行两个块通常会更好,因为
当然,可能有理由为每个块提供更多的共享内存比每个SM运行多个块提供更大的加速。