2010-01-31 116 views
17

我目前正在GPU上編寫一個矩陣乘法,並希望調試我的代碼,但由於我無法在設備函數中使用printf,是否還有其他方法可以用來查看要執行的操作在那個函數裏面。這我目前的功能:CUDA中的printf __global__函數

__global__ void MatrixMulKernel(Matrix Ad, Matrix Bd, Matrix Xd){ 

    int tx = threadIdx.x; 
    int ty = threadIdx.y; 

    int bx = blockIdx.x; 
    int by = blockIdx.y; 

    float sum = 0; 

    for(int k = 0; k < Ad.width ; ++k){ 
     float Melement = Ad.elements[ty * Ad.width + k]; 
     float Nelement = Bd.elements[k * Bd.width + tx]; 
     sum += Melement * Nelement; 
    } 

    Xd.elements[ty * Xd.width + tx] = sum; 
} 

我想知道如果廣告和Bd是我認爲它,並看看是否實際上被稱爲該功能。

+0

爲什麼不使用cuda-gdb? – Bear 2010-01-31 23:08:27

回答

15

編輯

爲了避免誤導人,因爲M.蒂比茨指出的printf是在計算能力2.0及以上的任何GPU可用。編輯

END

你必須選擇:

  • 使用GPU調試器,即CUDA-GDB在Linux或Nexus在Windows
  • 使用cuprintf,這是可以註冊的開發(註冊here
  • 手動複製要查看的數據,然後在內核完成後將該緩衝區轉儲到主機上(記住要同步)

關於您的代碼段:

  • 考慮經由指針傳遞Matrix結構中(即cudaMemcpy他們到設備,然後傳遞設備指針),現在你將沒有問題,但如果功能簽名變得非常大,那麼你可能會達到256字節的限制
  • 你有廣告效率低下,你會有一個32字節的事務處理對每個所述存儲器讀入Melement - 考慮使用共享存儲器作爲一個臨時區域(CF SDK中transposeNew樣品)
62

CUDA現在支持printf小號直接在內核。有關正式描述,請參閱CUDA C Programming Guide的附錄B.16。

+1

這很漂亮。 – 2011-08-05 22:19:47

+9

我認爲這個鏈接不再指向正確的地方。以下是備用鏈接:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#formatted-output – cyang 2013-01-28 00:55:12

+11

注意:「now」意味着計算能力2.x或更高。 – colgur 2013-02-22 16:08:46