カーネル内のMalloc

私はカーネル内でmalloc関数を持つコードをコンパイルしようとしています と私はこのエラーが表示されます:

Error   5   error : calling a host function("malloc") from a __device__/__global__ function("bitapS") is not allowed    C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\str_bit\main.cu    36  1   str_bit

私のコマンドラインは:

Error   6   error MSB3721: The command ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\bin\nvcc.exe" -gencode=arch=compute_10,code=\"sm_10,compute_10\" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2010 -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64" -I"../../common/inc" -I"../../../shared/inc" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\include"  -G0  --keep-dir "x64\Debug" -maxrregcount=0  --machine 64 --compile  -D_NEXUS_DEBUG -g    -Xcompiler "/EHsc /nologo /Od /Zi  /MTd " -o "x64/Debug/main.cu.obj" "C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\src\str_bit\main.cu"" exited with code 2.   C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 4.0.targets  357 10  str_bit

助言がありますか?私はあなたが割り当てることができるsm_20を有効にすると思った...私のカードは460 GTXです ありがとう!

1
-gencode を使用して、 nvcc は提供されたアーキテクチャのすべてのコードをコンパイルし、 'fat binary'を作成します。したがって、 sm_10malloc を含むコードをコンパイルするとエラーが発生します。
追加された 著者 Jared Hoberock,
私は潜在的な問題を参照してください-gencode = arch = compute_10、コード= \ "sm_10、compute_10 \"宣言、あなたはそれが優先されないことは確かですか?
追加された 著者 Erbureth,

3 答え

カーネル内にメモリを割り当てるべきではありません。これまでこれは、CUDAカーネルが設計されておらず、性能が悪いという明確な兆候です。

3
追加された
+1しましたCUDAカーネル内に割り当てることは決して良い考えではありません...
追加された 著者 anonymous coward,
あなたはできる!スペックをお読みください!あなたのファイルにもsm_20、compute_20を指定する必要があります!とにかくありがとう!
追加された 著者 Yannis Assael,
@iassael:onitは正しく、間違っています。コンピューティング機能2.0のデバイスでは、実行時にカーネル内で動的にメモリを割り当てることができないという誤った記述です。パフォーマンスについて気にするなら、本当に、本当に本当にすべきではないと言っているのは間違いありません.CUDAとGPUを最初に使用しているという合理的な仮定のようです。
追加された 著者 Patrick87,
@iassaelあなたはできるかもしれませんが、私はまだ悪いアイデアのパフォーマンスを賢明と賭けました。カーネルへのすべての入力は、ホストからのものでなければならない(または静的でなければならない)ので、ホスト側ですべての計算を行い、適切な量のメモリを割り当てることができます。
追加された 著者 onit,
私の投稿を編集しました。これを可能にすることは、私が知らなかった比較的新しい機能でなければなりません。私はまだあなたがこれをしてはいけないという私のコメントによって立っています。
追加された 著者 onit,

あなたがそれをしてはならないのは本当ですが、もしそれが有効になっていれば、おそらくいくつかの用途があります。 アーキテクチャ1.0と2.0用にコンパイルしているため、コードにエラーがあります。それをコンパイルするには削除することができます

-gencode=arch=compute_10,code=\"sm_10,compute_10\"

fermiデバイス上でコードを実行するだけの場合はコマンドラインから、古いデバイスの場合はソースコードに代替コードを指定する必要があります。 NVCCプリプロセッサマクロを使用して実行できます。

__CUDA_ARCH__

このような:

#if (__CUDA_ARCH__ < 200)
/* code for 1.x arch */
#else
/* code for 2.x arch */
#endif

Visual Studioを使用しているようですので、プロジェクトのプロパティでcudaセクションに移動して、構築したくないアーキテクチャを指定できます。

3
追加された

見つけた.... 指定する必要があります sm_20、compute_20 また、プロジェクトの属性だけでなく、ファイルのプロパティにも!

とにかくありがとう!

1
追加された