2013-04-02 21 views
3

基本上,我很難明白到底發生了什麼問題。CUDA共享內存不是唯一阻止調試

在調試過程中,共享內存看起來不是以塊獨佔方式運行。正常運行代碼時,不會打印任何內容。但是,如果我嘗試調試它,共享內存在塊之間共享並且達到打印語句。

這是一個例子,顯然這不是非常有用的代碼,但它重現了我的系統上的問題。難道我做錯了什麼?這是來自調試器的錯誤或預期行爲?

__global__ 
void test() 
{ 
    __shared__ int result[1]; 
    if (blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0) 
     result[0] = 4444; 
    else 
    { 
     if (result[0] == 4444) 
      printf("This should never print if shared memory is unique\n"); 
    } 
} 

並啓動它:

test<<<dim3(8,8,1), dim3(8,8,1)>>>(); 

這也是完全可能的,我已經完全誤解了共享內存。

感謝您的幫助。

其他信息: 我正在使用GTX 460.爲項目設置了Compute_20和sm_20。我正在使用nsight 3.0預覽版在Visual Studio 2010中編寫代碼。

回答

6

共享內存之間的微妙但重要的區別是塊和print語句之間共享的 達到

共享內存被重複使用通過連續的塊和打印語句是 達到

你假設前者,但後者是真正發生的事情。

除了第一個塊之外,您的代碼正在從未初始化的內存中讀取數據。這本身就是未定義的行爲。 C++(和CUDA)不保證靜態聲明的內存在進入或超出範圍時被設置爲任何值。您不能指望result的值不會爲4444,尤其是當它可能存儲在與之前可能已將其設置爲值4444的塊相同的共享暫存空間中時。

整個前提的代碼和這個問題是有缺陷的,你不應該從結果中得出結論,你會發現其他未定義的行爲是未定義的。

+0

啊,這很有道理。 我想我很困惑,因爲它似乎通常從0開始內核調用時開始。我不應該認爲它是有保證的。感謝您的解釋! – Gurrgg