1

Visual Studio 2010 と計算機能 2.0 の GTX480 を使用しています。

sm を 2.0 に設定しようとしましたが、カーネルで printf() を使用しようとすると、次のようになります。

エラー : __device__/__global__ 関数 ("test") からホスト関数 ("printf") を呼び出すことは許可されていません

これは私のコードです:

#include "util\cuPrintf.cu"
#include <cuda.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <cuda_runtime.h>

__global__ void test (void)
{
  printf("Hello, world from the device!\n");
}

void main(void)
{
    test<<<1,1>>>();
    getch();
}

ここで例を見つけます: "CUDA_C_Programming_Guide" 'page _106' "B.16.4 Examples" ついに、それは私の仕事です:Dありがとう。

#include "stdio.h"
#include <conio.h>

// printf() is only supported
// for devices of compute capability 2.0 and higher

  #if defined(__CUDA_ARCH__) && (__CUDA_ARCH__ < 200)
      #define printf(f, ...) ((void)(f, __VA_ARGS__),0)
  #endif


__global__ void helloCUDA(float f)
{
    printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}

int main()
{
    helloCUDA<<<1, 5>>>(1.2345f);
    cudaDeviceSynchronize();
    getch();
    return 0;
}
4

3 に答える 3

3

カーネル コードで使用するprintfには、次の 3 つのことを行う必要があります。

  1. cstdioまたはstdio.hがカーネル コンパイル ユニットに含まれていることを確認します。CUDA はオーバーロードによってカーネルを実装するprintfため、そのファイルを含める必要があります
  2. 計算機能 2.x または 3.x 用にコードをコンパイルし、サポートされている GPU で実行します (したがって-arch=sm_20、nvcc のようなものを渡すか、Visual Studio または Nsight Eclipse エディションの IDE に相当します)。
  3. ホスト コードに明示的または暗黙的な同期ポイントを含めることで、カーネルの実行が完了していることを確認します (cudaDeviceSynchronizeたとえば)。
于 2013-02-12T14:08:15.893 に答える
1

おそらく、printf() をサポートしないアーキテクチャ用にコンパイルしています。デフォルトでは、プロジェクトはコンピューティング アーキテクチャ 1.0 用にコンパイルされます。これを変更するには、VS でプロジェクト プロパティ -> CUDA C/C++ -> デバイスを開き、"コード生成" プロパティを "compute_20,sm_20" に変更します。

必要ありません#include "util\cuPrintf.cu"。printf の使用方法と出力をフラッシュして実際に結果を表示する方法の詳細については、こちらを参照してください。

于 2013-02-12T13:50:29.923 に答える
0

そのエラーが発生する場合は、GPUにコンピューティング機能2.x以降がないことを意味している可能性があります。 このスレッドでは、カーネル関数内で印刷するためのオプションについて詳しく説明します。

于 2013-02-12T13:37:11.380 に答える