CUDAカーネルからいくつかの値を出力する必要があり、cuPrintfを使用してみました。私の計算能力は1.1なので、printfを使用できません。プログラムは正しくコンパイルされ、ランタイムエラーも発生しません。ただし、cuPrintf行はまったく何もしていないようです。これが私が試したことのいくつかです:
- -archsm_11でコンパイルします
- 各カーネル呼び出しをcudaPrintfInitとcudaPrintfEndで囲みます
- 文字数がデフォルトのバッファサイズで機能するのに十分小さいことを確認してください
- cudaPrintfInitとcudaPrintfDisplayがcudaSuccessを返すことを確認します
私のプログラムでは、通常のものに加えて次のものを使用しています。
- CUBLASライブラリ
- ページロック(固定)+マップトメモリ
cuPrintfへの呼び出しが何もしないのはなぜですか?
編集
コードからのいくつかの関連するスニペットは次のとおりです。
__global__ void swap_rows(float *d_A, int r1, int r2, int n)
{
int i = r1;
int j = blockDim.x*blockIdx.x + threadIdx.x;
cuPrintf("(%d,%d) ", i, j);
if(j >= n) return;
float tmp;
tmp = d_A[L(i,j)];
d_A[L(i,j)] = d_A[L(r2,j)];
d_A[L(r2,j)] = tmp;
}
extern "C" float *someFunction(float *_A, float *_b, int n)
{
int i, i_max, k, n2 = n*n;
dim3 lblock_size(32,1);
dim3 lgrid_size(n/lblock_size.x + 1, 1);
float *d_A, *d_b, *d_x, *h_A, *h_b, *h_x, tmp, dotpdt;
cublasStatus status;
cudaError_t ret;
if((ret = cudaSetDeviceFlags(cudaDeviceMapHost)) != cudaSuccess) {
fprintf(stderr, "Error setting device flag: %s\n",
cudaGetErrorString(ret));
return NULL;
}
// Allocate mem for A and copy data
if((ret = cudaHostAlloc((void **)&h_A, n2 * sizeof(float),
cudaHostAllocMapped)) != cudaSuccess) {
fprintf(stderr, "Error allocating page-locked h_A: %s\n",
cudaGetErrorString(ret));
return NULL;
}
if((ret = cudaHostGetDevicePointer((void **)&d_A, h_A, 0)) != cudaSuccess) {
fprintf(stderr, "Error getting devptr for page-locked h_A: %s\n",
cudaGetErrorString(ret));
return NULL;
}
if((ret = cudaMemcpy(h_A, _A, n2 * sizeof(float), cudaMemcpyHostToHost)) !=
cudaSuccess) {
fprintf(stderr, "Error copying A into h_A: %s\n", cudaGetErrorString(ret));
return NULL;
}
// Some code to compute k and i_max
if(cudaPrintfInit() != cudaSuccess)
printf("cudaPrintfInit failed\n");
swap_rows<<<lgrid_size,lblock_size>>>(d_A, k, i_max, n);
if((ret = cudaThreadSynchronize()) != cudaSuccess)
fprintf(stderr, "Synchronize failed!\n", cudaGetErrorString(ret));
if(cudaPrintfDisplay(stdout, true) != cudaSuccess)
printf("cudaPrintfDisplay failed\n");
cudaPrintfEnd();
// Some more code
}
言及するのを忘れました:これらのメソッドは、動的にリンクされたモジュール(共有オブジェクト)として(main()関数とは別に)個別にコンパイルされます。