2012-05-10 16 views
1

Nvida CUDA Cプログラミングガイド4.0のセクション3.2.5.5.4では、デバイス間のメモリコピーが発行された場合、異なるストリームからの2つのコマンドを同時に実行することはできませんそれらの間にある。私はそれが正確に何を意味するのか分かりません。誰かが私の混乱を明確にすることを望みます。同時のカーネルの "暗黙の同期"の理解方法

私のプログラムは、ストリーム0とストリーム1の2つのストリームを持っているとしましょう。以下は、これらのストリームに起動されるカーネルの順序です。

カーネル0.0(ストリーム0;実行時間が10ミリ秒であると仮定する();実行時間が1ミリ秒であると仮定ストリーム1)

カーネル1.1(ストリーム1、

カーネル1.0の実行時間をとります3 MS)

カーネル1.2(ストリーム1であり、実行時間が6であると仮定し、このカーネルは、デバイス間のメモリコピーを引き起こすが、実行時間を仮定すると、1ミリ秒)

カーネル1.3(ストリーム1でありますms)

プログラムに他のオーバーヘッドがなく、GPUにこれらのカーネルを同時に実行するのに十分なSMがあるとします。私の質問は、カーネル0.0がカーネル1.2とカーネル1.3と同時に実行できるかどうかです。プログラム全体の実行時間はどのくらいですか?

+1

カーネル1.2では、デバイス間のメモリコピーを「引き起こす」ことができますか?これを行うには、cudaMemcpyのようなホストAPIコールを使用する必要があります。 – talonmies

+0

クイック返信をありがとう。それは私が混乱したところです。私のカーネル1.2では、いくつかのメモリ位置から別のメモリ位置にいくつかのデータをコピーするいくつかの命令があります。それは私が「カーネル1.2はデバイス間のメモリコピーを引き起こす」という意味です。私はストリーム0のカーネルとストリーム1のカーネルが並行して実行できると言うでしょうか? – xhe8

+0

おそらくあなたのすべてがグローバルメモリを読み書きします。そうでなければ、あなたはそれらを実行しますか?それはデバイスからデバイスへのメモリコピーではありません。 – talonmies

答えて

1

前述のように、デバイスからデバイスへのメモリコピーは、ホストからのcudaMemcpy()を使用して行われます。カーネルは自由にグローバルメモリを読み書きできます。カーネルmayが異なるストリームに含まれていても保証はありません。正確なスピードアップは、カーネルごとのSM使用率によって異なります。 Nvidiaは、オーバーラップするバージョンがシーケンシャルよりも速いかどうかを判断するために、イベントを使用してカーネルの実行を開始することを推奨します(開始および停止タイマー)。この出力をカーネルを切り替えてストリーム0にするか、プロファイラでアプリを実行することで、カーネルの実行をシリアライズすることができます。

関連する問題