私は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でのプログラミングを使用しています。ご協力いただきありがとうございます。
Compute Capability> = 2.0のデバイスでプレーンなprintf()
の使用を有効にするには、少なくともCC 2.0のCC用にコンパイルし、CC1.0のビルドを含むデフォルトを無効にすることが重要です。
プロジェクト内の.cu
ファイルを右クリックし、Properties
を選択し、Configuration Properties
|を選択します。 CUDA C/C++
| Device
。 Code Generation
行をクリックし、三角形をクリックして、Edit
を選択します。 [コード生成]ダイアログボックスで、[Inherit from parent or project defaults
]のチェックを外し、上部のウィンドウにcompute_20,sm_20
と入力して、[OK]をクリックします。
このコードを記述して、CUDAカーネル内から必要なものを印刷できます。
# if __CUDA_Arch__>=200
printf("%d \n", tid);
#endif
<stdio.h>を含めます
この問題を解決する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にアップグレードすることが真実で絶対に必要な場合は、誰かが私に光を見せてくれると非常に役立ちます。ご協力ありがとうございます
Visual Studio2015にGeForceGTX1060を搭載したcudav10.0.130を使用していますが、次のincludeステートメントを追加するだけで済みました。
#include <helper_cuda.h>
その後、問題なくprintfステートメントを使用することができました。