web-dev-qa-db-ja.com

cudaカーネルからの印刷

私はcudaプログラムを作成していて、printf関数を使用してcudaカーネル内で何かを印刷しようとしています。しかし、プログラムをコンパイルしていると、エラーが発生します

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


 error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\nvcc.exe" -gencode=Arch=compute_10,code=\"sm_10,compute_10\" --use-local-env --cl-version 2008 -ccbin "c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin" -I"C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\common\inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\include"  -G  --keep-dir "Debug" -maxrregcount=0  --machine 32 --compile  -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MDd  " -o "Debug\test.cu.obj" "C:\Users\umdutta\Desktop\SANKHA_ALL_MATERIALS\PROGRAMMING_FOLDER\ABM_MODELLING_2D_3D\TRY_NUM_2\test_proj_test\test_proj\test_proj\test.cu"" exited with code 2.

2.0を超える計算機能を備えたカードGTX560 tiを使用していますが、cudaカーネルからの印刷について少し調べたところ、コンパイラをsm_10からsm_2.0に変更して、最大限に活用する必要があることもわかりました。カード。また、cuPrintfが目的を果たすことを提案する人もいます。私は何をすべきか、そしてコンソール画面にプリントアウトを表示するための最も簡単で迅速な方法は何であるかについて少し混乱しています。 nvccコンパイラを1.0から2.0に変更する必要がある場合は、どうすればよいですか?もう1つ、私はWindows7.0とVisualStudio2010でのプログラミングを使用しています。ご協力いただきありがとうございます。

9
duttasankha

Compute Capability> = 2.0のデバイスでプレーンなprintf()の使用を有効にするには、少なくともCC 2.0のCC用にコンパイルし、CC1.0のビルドを含むデフォルトを無効にすることが重要です。

プロジェクト内の.cuファイルを右クリックし、Propertiesを選択し、Configuration Properties |を選択します。 CUDA C/C++ | DeviceCode Generation行をクリックし、三角形をクリックして、Editを選択します。 [コード生成]ダイアログボックスで、[Inherit from parent or project defaults]のチェックを外し、上部のウィンドウにcompute_20,sm_20と入力して、[OK]をクリックします。

8
Roger Dahl

このコードを記述して、CUDAカーネル内から必要なものを印刷できます。

# if __CUDA_Arch__>=200
    printf("%d \n", tid);

#endif  

<stdio.h>を含めます

6
Heba

この問題を解決する1つの方法は、カーネルからの印刷が可能なcuPrintf関数を使用することです。ファイルをコピーしますcuPrintf.cuおよびcuPrintf.cuhフォルダから

C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\src\simplePrintf

プロジェクトフォルダに移動します。次に、ヘッダーファイルを追加しますcuPrintf.cuhプロジェクトに追加して追加します

#include "cuPrintf.cu"

あなたのコードに。次に、コードを以下の形式で記述する必要があります。

#include “cuPrintf.cu”
__global__ void testKernel(int val)
{
  cuPrintf(“Value is: %d\n”, val);
}

int main()
{
  cudaPrintfInit();
  testKernel<<< 2, 3 >>>(10);
  cudaPrintfDisplay(stdout, true);
  cudaPrintfEnd();
  return 0;
}

上記の手順に従うことにより、デバイス機能からコンソールウィンドウに印刷を取得できます。上記の方法で問題を解決しましたが、デバイス関数からprintfを使用する解決策がまだありません。 printf機能を有効にするためにnvccコンパイラをsm_10からsm_21にアップグレードすることが真実で絶対に必要な場合は、誰かが私に光を見せてくれると非常に役立ちます。ご協力ありがとうございます

5
duttasankha

Visual Studio2015にGeForceGTX1060を搭載したcudav10.0.130を使用していますが、次のincludeステートメントを追加するだけで済みました。

#include <helper_cuda.h>

その後、問題なくprintfステートメントを使用することができました。

0
Travis Jones