5

printf()CUDA プログラムにいくつかのステートメントを追加しました

__device__ __global__ void Kernel(float *, float * ,int );
void DeviceFunc(float *temp_h , int numvar , float *temp1_h)
{ .....
    //Kernel call
    printf("calling kernel\n");
    Kernel<<<dimGrid , dimBlock>>>(a_d , b_d , numvar);
    printf("kernel called\n");
  ....
}

int main(int argc , char **argv)
{   ....
    printf("beforeDeviceFunc\n\n");
    DeviceFunc(a_h , numvar , b_h); //Showing the data
    printf("after DeviceFunc\n\n");
    ....
}

Kernel.cu にも次のように書いています。

#include<cuda.h>
#include <stdio.h>
__device__ __global__ void Kernel(float *a_d , float *b_d ,int size)
{
    int idx = threadIdx.x ;
    int idy = threadIdx.y ;
    //Allocating memory in the share memory of the device
    __shared__ float temp[16][16];

    //Copying the data to the shared memory
    temp[idy][idx] = a_d[(idy * (size+1)) + idx] ;
    printf("idx=%d, idy=%d, size=%d", idx, idy, size);
    ....
}

-arch=sm_20次に、次のようにコンパイルします。

nvcc -c -arch sm_20 main.cu
nvcc -c -arch sm_20 Kernel.cu
nvcc -arch sm_20 main.o Kernel.o -o main

プログラムを実行すると、次のように表示されます。

beforeDeviceFunc

calling kernel
kernel called
after DeviceFunc

printf()そのため、カーネルの内部は出力されません。どうすれば修正できますか?

4

2 に答える 2

14

printf()出力はカーネルが正常に終了した場合にのみ表示されるため、すべての CUDA 関数呼び出しのリターン コードをチェックし、エラーが報告されていないことを確認してください。

さらにprintf()、出力はプログラムの特定のポイントでのみ表示されます。プログラミング ガイドの付録 B.32.2 には、これらが次のようにリストされています。

  • <<<>>>orを介したカーネルの起動cuLaunchKernel()(起動の開始時、および CUDA_LAUNCH_BLOCKING 環境変数が 1 に設定されている場合は、起動の終了時も)、
  • cudaDeviceSynchronize()cuCtxSynchronize()cudaStreamSynchronize()cuStreamSynchronize()cudaEventSynchronize()、またはcuEventSynchronize()による同期
  • cudaMemcpy*()またはcuMemcpy*()のブロッキング バージョンを介したメモリ コピー
  • cuModuleLoad()またはcuModuleUnload()によるモジュールのロード/アンロード
  • cudaDeviceReset()またはによるコンテキストの破棄cuCtxDestroy()
  • cudaStreamAddCallback()またはによって追加されたストリーム コールバックを実行する前cuStreamAddCallback()

これが問題であることを確認するには、カーネル呼び出しの後に次のコードを追加します。

{
    cudaError_t cudaerr = cudaDeviceSynchronize();
    if (cudaerr != cudaSuccess)
        printf("kernel launch failed with error \"%s\".\n",
               cudaGetErrorString(cudaerr));
}

その後、カーネルの出力またはエラー メッセージが表示されます。

より便利にcuda-memcheckは、実行可能ファイルをその下で実行すると、すべてのリターン コードが自動的にチェックされます。とにかく常にエラーをチェックする必要がありますが、これは具体的な問題を解決するときに役立ちます。

于 2012-11-10T10:33:12.280 に答える