标题不能解决整个问题:我有一个内核正在进行流压缩,之后它继续使用较少数量的线程。
我知道一种避免执行未使用线程的方法:返回并执行块大小较小的第二个内核。
我要问的是,如果未使用的线程发散并结束(返回),如果它们在完整的经线中对齐,我能否安全地假设它们不会浪费执行?
除了拆分两个连续的内核执行外,还有一个常见的做法吗?
非常感谢!
答案 0 :(得分:3)
SM中执行调度和资源调度的单位是32个线程的warp组。
在内核代码中使用return
以任何顺序淘汰线程是完全合法的。但至少有两个注意事项:
设备代码中__syncthreads()
的使用取决于块中的每个线程是否参与。因此,如果某个线程遇到return
语句,该线程可能无法参与未来的__syncthreads()
语句,因此在一个或多个线程退出后使用__syncthreads()
是非法的。
从执行效率的角度来看(以及从资源调度的角度来看,尽管后一个概念没有很好地记录并且有些涉及到证明),但是warp仍会消耗执行(和其他)资源,直到所有线程在经线已退休。
如果您可以在warp单元中停用线程,并且不需要使用__syncthreads()
,那么即使在退出某些warp的线程块中也应该能够相当有效地使用GPU资源。
为了完整性,在内核启动时定义了一个threadblock的维度,并且它们之后的任何时候都不能也不会改变。所有线程块都有最终退出的线程。在我的使用中,退休线程的概念不会改变线程块的维度(并且与__syncthreads()
的使用一致)。
虽然可能与您的问题没有直接关系,但CUDA Dynamic Parallelism可能是允许线程块“管理”动态变化的执行资源的另一种方法。但是对于给定的线程块本身,所有上述注释也适用于CDP情况。