我想清除CUDA 共享内存的执行状态,并根据每个块使用的共享内存量进行 块执行。
状态
我的目标是 GTX480 nvidia 卡,它每块有 48KB共享内存和 15 个流式多处理器。因此,如果我声明一个包含 15 个块的内核,每个块使用 48KB 的共享内存,并且没有达到其他限制(寄存器、每个块的最大线程数等),每个块都运行到一个 SM(15 个)直到结束。在这种情况下,只需要在同一块的 warp 之间进行调度。
问题
所以,我的误解是:
我调用一个有 30 个块的内核,以便每个 SM 上驻留 2 个块。现在每个 SM 上的调度程序必须处理来自不同块的扭曲。但只有当一个块完成执行时,另一个块的扭曲才会在 SM 上执行,因为共享内存总量(每个 SM 48KB)使用。如果这没有发生并且不同块调度在同一个 SM 上执行的扭曲,结果可能是错误的,因为一个块可以读取从另一个块加载到共享内存中的值。我对吗?