2013-04-13 9 views
5

他の質問やリンクによれば、この機能のシンボル名は使用できなくなりました。機能がなくなりましたので、これをいつでも使いたいと思ったら、cudaMemCpy?いつあなたはいつでもそれを使いたいと思いますか?トレードオフやメリットは何ですか?要するにcudaMemcpyToSymbol対cudaMemcpyなぜそれはまだ周囲(cudaMemcpyToSymbol)

http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group_CUDART_MEMORY_gf268fa2004636b6926fdcd3189152a14.html

答えて

16

cudaMemcpyは追加のAPI呼び出しなしcudaMemcpyToSymbolと同じことを行うことができないため。一定のメモリアレイを考えてみましょう:

__constant__ float coeffs[8]; 

cudaMemcpyToSymbolを使用して、この配列に値をコピーするには、ちょうどcudaMemcpyと同じことを行うには

cudaMemcpyToSymbol(coeffs, hostData, 8*sizeof(float)); 

を行うことは、これを必要とします。

float *dcoeffs; 
cudaGetSymbolAddress((void **)&dcoeffs, coeffs); 
cudaMemcpy(dcoeffs, hostData, 8*sizeof(float), cudaMemcpyHostToDevice); 

直接呼び出し前のシンボルルックアップなしではcudaMemcpyには不正です。

[標準の免責事項:ドキュメントまたはコンパイラにアクセスせずにブラウザに書き込まれたすべてのコード、自身のリスクで使用]

+0

TY、 '__constant__'メモリ及びパラメータ型ポインタとの間の関係は、メソッドシグネチャにCONSTするものです。 '__constant__'はconst型へのポインタを持っていますか?また、なぜアドレスを取得するために&coeffsを取ることができないのですか? – rubixibuc

+2

'__constant__'はCUDAのストレージクラス指定子で、シンボルがGPU DRAMのキャッシュ専用の読み取り専用部分にあるとしています。 constから完全に独立しています。あなたは、API呼び出しが必要とするものではない、ホストメモリ*のシンボル*のアドレスを暗示するので、 '&coeffs'を使用することができます。 – talonmies

+0

ポインタ変数coeffsのアドレスはどこにありますか?直接メモリにアドレスする?これは '__device__'で宣言された変数にも当てはまりますか? – rubixibuc

関連する問題