簡體   English   中英

printf里面有CUDA __global__函數

[英]printf inside CUDA __global__ function

我目前正在GPU上編寫矩陣乘法並希望調試我的代碼,但由於我不能在設備函數中使用printf,我還能做些什么來查看該函數內部的內容。 這是我目前的功能:

__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;
}

我很想知道Ad和Bd是否是我認為的,看看是否真的被調用了。

CUDA現在直接在內核中支持printf 有關形式描述,請參閱“ CUDA C編程指南”的附錄B.16。

編輯

為了避免誤導人們,正如M. Tibbits所指出的,printf可用於任何計算能力2.0及更高版本的GPU。

編輯結束

你有選擇:

  • 使用GPU調試器,即Linux上的cuda-gdb或Windows上的Nexus
  • 使用cuprintf,可供注冊開發人員使用(在此處注冊)
  • 手動復制要查看的數據,然后在內核完成后將該緩沖區轉儲到主機上(記得同步)

關於你的代碼片段:

  • 考慮在via指針中傳遞Matrix結構(即cudaMemcpy它們到設備,然后傳入設備指針),現在你沒有問題,但如果函數簽名變得非常大,那么你可能會達到256字節的限制
  • 你從Ad讀取效率低,每次讀入Melement時你都會有一個32字節的內存事務 - 考慮使用共享內存作為暫存區域(參見SDK中的transposeNew示例)

順便說說..

請參閱“CUDA C編程指南”的“格式化輸出”(當前為B.17)部分。

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM