我正在分析我的CUDA应用程序,并且我遇到了一些我不了解Visual Profiler中存在的“控制流发散”指标。
根据用户指南:
控制流差异给出了warp中所有线程未执行的线程指令的百分比,从而导致分歧。
我的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没有发生任何事情。 这是否意味着度量标准考虑了所有内核的指令,即使是没有被任何线程执行的指令? (所以实际上没有扭曲分歧)
在两种情况下,Divergent Branches指标均为0%。
答案 0 :(得分:1)
您使用的是哪个版本?听起来你使用的是旧版本,因此可能值得更新到更新版本(例如4.2或5.0 - 后者目前是候选版本)。
如果您能够更新到CUDA 5.0 Visual Profiler,那么您可以通过分析特定内核,让分析器突出显示内核中存在分歧的特定行(非合并内存访问也是如此) 。您需要使用debug(-G)编译代码,或者,如果要编译发布代码,则需要使用行信息(-lineinfo)来实现此功能。