Kerel执行配置参数定义了grid及其块的尺寸。blockldx和threadldx中的唯一坐标允许网格的线程识别自己及其数据域。程序员有责任在内核函数中使用这些变量,以便线程能够正确识别要处理的数据部分。这种编程模式迫使程序员将线程及其数据组织到分层和多维组织中。
一旦启动网格,其块可以按任意顺序分配给SM,从而实现CUDA应用程序的透明可扩展性。透明的可扩展性有一个限制:不同块中的线程不能相互同步。为了使内核保持透明的可扩展性,不同块中的线程相互同步的简单方法是终止内核,并在同步点后为活动启动一个新的内核。
**线程被分配给SM,以便逐个块执行。**每个CUDA设备对每个SM的可用资源量施加了潜在的不同限制。每个CUDA设备对每个SM可以容纳的块数量和线程数量设置限制,以先成为限制者为准。对于每个内核,其中一个或多个资源限制可以成为同时驻留在CUDA设备中的线程数量的限制因素。
一旦一个块被分配给一个SM,它就会被进一步分割成warp。warp中的所有线程都具有相同的执行时间。在任何时候,SM只执行其常驻warp的一小部分的指令。这个条件允许其他warp等待长延迟操作,而不会减慢大量执行单元的整体执行吞吐量。