我知道块同步不可能,唯一的方法是启动一个新的内核。
但是,假设我启动了X个块,其中X对应于我的GPU上的SM数量。我应该期望调度程序将分配一个块到每个SM……对吗?如果GPU作为二级图形卡被利用(完全专用于CUDA),这意味着理论上没有其他进程使用它…对吗?
我的想法是:隐式同步。
假设有时候我只需要一个块,而有时候我需要所有的X个块。在那些只需要一个块的情况下,我可以配置我的代码使第一个块(或第一个SM)处理“真实”数据,而其他X-1个块(或SM)处理一些“虚拟”的数据,执行完全相同的指令,只是有一些其他偏移量。
这样,它们将继续同步,直到我再次需要它们全部。
在这种情况下,调度程序可靠吗?还是永远无法确定?
但是,假设我启动了X个块,其中X对应于我的GPU上的SM数量。我应该期望调度程序将分配一个块到每个SM……对吗?如果GPU作为二级图形卡被利用(完全专用于CUDA),这意味着理论上没有其他进程使用它…对吗?
我的想法是:隐式同步。
假设有时候我只需要一个块,而有时候我需要所有的X个块。在那些只需要一个块的情况下,我可以配置我的代码使第一个块(或第一个SM)处理“真实”数据,而其他X-1个块(或SM)处理一些“虚拟”的数据,执行完全相同的指令,只是有一些其他偏移量。
这样,它们将继续同步,直到我再次需要它们全部。
在这种情况下,调度程序可靠吗?还是永远无法确定?
__syncthread()
,因为我每个块只有32个线程。如果你不确定是否相信我的话,你可以查看《CUDA示例:通用GPU编程入门》的附录A,其中讨论了原子操作、互斥和块之间的同步。 - Pedro