我正在分析我的 CUDA 应用程序,我遇到了一些我不理解的关于 Visual Profiler 中存在的“控制流分歧”指标的内容。
根据用户指南:
控制流发散给出了线程指令未由经线中的所有线程执行的百分比,从而导致发散。
我的 CUDA 内核中有以下代码:
int var;
var = tex2D(texture, x, y); // texture fetch
if(var < 0) {
var *= -1;
results[(blockIdx.x*blockDim.x) + threadIdx.x] = var; // global memory array
}
以下是发生的情况:没有一个线程进入分支(我检查了全局内存中的值),但分析器指出控制流分歧为 34%。如果在同一个分支上插入 printf,则该值会跳到 43%(奇怪的是,执行时间也会增加),尽管 stdout 上没有发生任何事情。这是否意味着该指标考虑了内核的所有指令,甚至是那些未被任何线程执行的指令?(因此有效地没有经线发散)
在这两种情况下,发散分支指标都是 0%。