内核可以更改其块大小吗?

时间:2015-11-03 15:07:36

标签: cuda

标题不能解决整个问题:我有一个内核正在进行流压缩,之后它继续使用较少数量的线程。

我知道一种避免执行未使用线程的方法:返回并执行块大小较小的第二个内核。

我要问的是,如果未使用的线程发散并结束(返回),如果它们在完整的经线中对齐,我能否安全地假设它们不会浪费执行?

除了拆分两个连续的内核执行外,还有一个常见的做法吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

SM中执行调度和资源调度的单位是32个线程的warp组。

在内核代码中使用return以任何顺序淘汰线程是完全合法的。但至少有两个注意事项:

  1. 设备代码中__syncthreads()的使用取决于块中的每个线程是否参与。因此,如果某个线程遇到return语句,该线程可能无法参与未来的__syncthreads()语句,因此在一个或多个线程退出后使用__syncthreads()是非法的。

  2. 从执行效率的角度来看(以及从资源调度的角度来看,尽管后一个概念没有很好地记录并且有些涉及到证明),但是warp仍会消耗执行(和其他)资源,直到所有线程在经线已退休。

  3. 如果您可以在warp单元中停用线程,并且不需要使用__syncthreads(),那么即使在退出某些warp的线程块中也应该能够相当有效地使用GPU资源。

    为了完整性,在内核启动时定义了一个threadblock的维度,并且它们之后的任何时候都不能也不会改变。所有线程块都有最终退出的线程。在我的使用中,退休线程的概念不会改变线程块的维度(并且与__syncthreads()的使用一致)。

    虽然可能与您的问题没有直接关系,但CUDA Dynamic Parallelism可能是允许线程块“管理”动态变化的执行资源的另一种方法。但是对于给定的线程块本身,所有上述注释也适用于CDP情况。