【发布时间】:2014-05-30 00:12:58
【问题描述】:
对于 CUDA 中的简单内部扭曲线程发散,我所知道的是 SM 选择一个重新收敛点(PC 地址),并在两条/多条路径中执行指令,同时禁用尚未执行的线程的执行效果走上了这条路。
例如,在下面的代码中:
if( threadIdx.x < 16 ) {
A:
// do something.
} else {
B:
// do something else.
}
C:
// rest of code.
C 是重新收敛点,warp 调度程序在A 和B 上调度指令,同时在A 处禁用上半部分的指令,在B 处禁用下半部分的指令经。当它到达C 时,将为经线内的所有线程启用指令。
我的问题是 SM 是否能够像上面一样正确处理包含goto 指令的代码?还是不能保证选择的再收敛点是最佳的?
例如,如果我在使用 goto 实现的 CUDA 代码中具有以下控制流
A:
// some code here.
B:
// some code here too.
if( threadIdx.x < 16 ) {
C:
// do something.
goto A;
}
// do something else.
goto B;
SM 是否足够聪明地决定 B 作为 if 指令引起的经线内分歧的重新收敛点?
【问题讨论】: