2011-06-28 17 views
4

CUDA初心者はこちら。CUDA:カーネルに引数を渡すとカーネルの起動が遅くなるのですか?

私のコードでは、私は現在、ホストコードのループで多くの時間カーネルを起動しています。 (私はブロック間の同期が必要なので)。だから私はカーネルの立ち上げを最適化できるかどうか疑問に思った。

私のカーネルが起動したら、このような何かを見て:だから、いくつかの信号は明らかにCPUからGPUに行かなければならないが、引数の受け渡しは、このプロセスを作る場合、私は思ったんだけど、カーネルを起動するために

MyKernel<<<blocks,threadsperblock>>>(double_ptr, double_ptr, int N, double x); 

を著しく遅い。

カーネルへの引数は毎回同じなので、おそらく私は、一度それらをコピーすることで時間を節約

__device__ int N; 
<and somehow (how?) copy the value to this name N on the GPU once> 

によって定義された名前で、カーネルでそれらにアクセスして、単純にしてカーネルを起動することができそのような引数はありません

MyKernel<<<blocks,threadsperblock>>>(); 

私のプログラムはこれより速くなりますか? これを行う最善の方法は何ですか? AFAIK引数はいくつかの定数グローバルメモリに格納されます。手動で転送された値が高速または高速のメモリに格納されていることを確認するにはどうすればよいですか?

ご協力いただきありがとうございます。

答えて

5

私は、このような最適化の利点はやや小さいと期待します。まともなプラットフォーム(つまり、WDDM以外のもの)では、カーネルの起動オーバーヘッドは10-20マイクロ秒程度であるため、改善の余地はあまりありません。

あなたが試したいのであれば、これに影響を与える論理的な方法は定数メモリを使用することです。各引数を変換単位スコープの__constant__シンボルとして定義し、次にcudaMemcpyToSymbol関数を使用してホストからデバイスの定数メモリに値をコピーします。

3

かんたん回答:いいえ。

もっと複雑にするには:カーネル自体を起動するには、ホストからGPUに何らかの信号を送信する必要があります。この時点で、パラメータデータの数バイトはもう重要ではありません。

+0

極端な場合、非常に "タイト"なカーネルを使用している場合、実際には問題になるかもしれませんが、その間に他の高遅延操作が行われていない場合にのみ当てはまります。 – pszilard

+1

非常にタイトなカーネルでも。 1バイトまたは10KBをGPUに送信することは重要ではありません。待ち時間とスループットではないため、同じ時間がかかります。メガバイトのデータを送信すると、スループットが向上する可能性があります... – CygnusX1

関連する問題