29

現在、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が私が思っているものであるかどうかを知り、その関数が実際に呼び出されているかどうかを確認したいと思います。

4

4 に答える 4

77

CUDAprintfはカーネルで s を直接サポートするようになりました。正式な説明については、 CUDA C プログラミング ガイドの付録 B.16 を参照してください。

于 2011-07-05T17:10:57.277 に答える
17

編集

M. Tibbits が指摘しているように、人々の誤解を避けるために、printf は計算能力 2.0 以上の GPU で利用できます。

編集の終わり

次の選択肢があります。

  • GPU デバッガーを使用します。つまり、Linux では cuda-gdb、Windows では Nexus を使用します。
  • 登録済みの開発者が利用できる cuprintf を使用します (サインアップはこちら) 。
  • 見たいデータを手動でコピーし、カーネルの完了後にそのバッファをホストにダンプします (同期することを忘れないでください)。

コードスニペットについて:

  • Matrixポインタを介して構造体を渡すことを検討してください(つまり、デバイスに構造体を渡しcudaMemcpyてから、デバイス ポインタを渡します)。現時点では問題ありませんが、関数シグネチャが非常に大きくなると、256 バイトの制限に達する可能性があります。
  • Ad からの読み取りが非効率的であり、Melement への読み取りごとに 32 バイトのメモリへのトランザクションが発生します。共有メモリをステージング領域として使用することを検討してください (SDK のtransposeNewサンプルを参照)。
于 2010-02-01T08:46:45.847 に答える
4

ところで..

于 2010-02-09T00:00:26.130 に答える