0

我正在分析我的 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%。

4

1 回答 1

1

你用的是什么版本?听起来您使用的是旧版本,因此可能值得更新到较新的版本(例如 4.2 或 5.0 - 后者目前是候选版本)。

如果您能够将 Visual Profiler 更新到 CUDA 5.0,那么您可以通过分析特定内核让分析器突出显示内核中遭受分歧的特定行(对于非合并内存访问也是如此)。您需要使用调试 (-G) 编译代码,或者,如果您想分析发布代码,则需要使用行信息 (-lineinfo) 来编译代码。

于 2012-09-11T13:37:05.903 回答