web-dev-qa-db-ja.com

CUDA __global__関数内のprintf

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

24
Jose Vega

[〜#〜] edit [〜#〜]

M. Tibbitsが指摘するように、誤解を招く人々を避けるために、printfはコンピューティング機能2.0以上のGPUで使用できます。

編集終了

次の選択肢があります。

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

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

  • Matrix構造体をポインター経由で渡すことを検討してください(つまり、cudaMemcpyそれらをデバイスに渡してから、デバイスポインターに渡します)、今は問題ありませんが、関数シグネチャが非常に大きくなる場合256バイトの制限に達する可能性があります
  • Adからの非効率的な読み取りがあり、Melementへの読み取りごとにメモリへの32バイトトランザクションがあります-ステージングエリアとして共有メモリを使用することを検討してください(transposeNewサンプルを参照してくださいSDK)
16
Tom

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

72
M. Tibbits

ところで..

4
Juan Leni

CUDA Cプログラミングガイドの「フォーマットされた出力」(現在はB.17)セクションを参照してください。

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

2