CUDA-可视化剖面仪和控制流发散

CUDA-可视化剖面仪和控制流发散,cuda,profiler,Cuda,Profiler,我在分析我的CUDA应用程序时,遇到了一些我不了解的关于VisualProfiler中存在的“控制流分歧”度量的问题 根据用户指南: 控制流发散给出了warp中所有线程未执行的线程指令的百分比,从而导致发散 我的CUDA内核中有以下代码: int var; var = tex2D(texture, x, y); // texture fetch if(var < 0) { var *= -1; results[(blockIdx.x*blockDim.x) + thread

我在分析我的CUDA应用程序时,遇到了一些我不了解的关于VisualProfiler中存在的“控制流分歧”度量的问题

根据用户指南:

控制流发散给出了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
}
int-var;
var=tex2D(纹理,x,y);//纹理读取
if(var<0){
var*=-1;
结果[(blockIdx.x*blockDim.x)+threadIdx.x]=var;//全局内存数组
}
发生的情况如下:没有一个线程进入分支(我检查了全局内存中的值),但探查器声明控制流分歧为34%。 如果在同一个分支上插入printf,那么该值会跳到43%(奇怪的是,执行时间也会增加),尽管stdout上没有发生任何事情。 这是否意味着该指标考虑了内核的所有指令,甚至是没有被任何线程执行的指令?(因此实际上没有扭曲发散)


在这两种情况下,分歧分支度量均为0%。

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

如果您能够将可视化探查器更新到CUDA 5.0,那么通过分析特定内核,您可以让探查器突出显示内核中存在分歧的特定行(对于非合并内存访问也是如此)。您需要使用debug(-G)或line info(-lineinfo)来编译代码,如果您想评测发布代码,则需要使用line info(-lineinfo)来编译代码