2012-09-11 33 views
0

我正在分析我的CUDA應用程序,並且我遇到了一些我不瞭解Visual Profiler中存在的「控制流分歧」度量標準的內容。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上沒有任何事情發生。 這是否意味着該度量考慮到了所有內核的指令,即使是沒有被任何線程執行的指令? (所以實際上沒有扭曲分支)

在這兩種情況下,發散分支度量都是0%。

回答

1

您使用的是哪個版本?聽起來您使用的是舊版本,因此可能需要更新到更新的版本(例如4.2或5.0--後者目前是候選版本)。

如果您可以更新到CUDA 5.0 Visual Profiler,那麼通過分析特定的內核,您可以讓探查器突出顯示您的內核中正在發散的具體行(對於非合併內存訪問也是如此)。你需要用debug(-G)編譯你的代碼,或者,如果你想剖析發佈代碼,使用行信息(-lineinfo)來運行它。

+0

我正在使用4.0。我會嘗試更新到5.0。 –