3

printfcudaコードのカーネル内では機能しないようです

#include "Common.h"
#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\n", idx, idy, size);


    for(int i =1 ; i<size ;i++) {
            if((idy + i) < size) { // NO Thread divergence here
                    float var1 =(-1)*( temp[i-1][i-1]/temp[i+idy][i-1]);
                    temp[i+idy][idx] = temp[i-1][idx] +((var1) * (temp[i+idy ][idx]));
            }
            __syncthreads(); //Synchronizing all threads before Next iterat ion
    }
    b_d[idy*(size+1) + idx] = temp[idy][idx];
}

コンパイルすると、次のようになります。

 error: calling a host function("printf") from a __device__/__global__ function("Kernel") is not allowed

cudaバージョンは4です

4

2 に答える 2

7

CUDAプログラミングガイドの引用「フォーマットされた出力は、コンピューティング機能2.x以降のデバイスでのみサポートされます」。詳細については、プログラミングガイドを参照してください。

計算能力が2.x未満のデバイスは、cuPrintfを使用できます。

2.x以降のデバイスを使用していて、printfを使用しようとしている場合は、arch = sm_20(またはそれ以降)を指定していることを確認してください。デフォルトはsm_10で、printfをサポートするのに十分な機能がありません。

NVIDIAは、CUDA用に3つのソースレベルデバッガーを提供しています。これらは、変数を検査するためにprintfよりも便利な場合があります。-Nsight Visual StudioEditionCUDAデバッガー-NsightEclipseEditionCUDAデバッガー-cuda-gdb

于 2012-11-10T00:30:35.033 に答える
4

この例のように、cuPrintfを使用する必要があります。printfはかなり限定されたデバッグ方法であることに注意してください。NsightまたはNsightEclipseエディションのIDEの方がはるかに優れています。

于 2012-11-09T21:12:19.990 に答える