12

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

4

3 に答える 3

10

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

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

#endif  

< stdio.h >を含めます

于 2013-05-15T23:24:49.337 に答える
9

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

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

于 2013-01-01T01:16:12.487 に答える
6

この問題を解決する 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上記の方法で問題を解決しましたが、デバイス機能から使用する解決策はまだありません。機能を有効にするために nvcc コンパイラを sm_10 から sm_21 にアップグレードすることが本当に必要であるprintf場合、誰かが私に光を見せてくれると非常に役に立ちます。ご協力ありがとうございました

于 2012-12-31T23:40:45.080 に答える