2012-05-06 1 views
3

何が良いですか?カーネルがある前にいくつかの待ち時間があり、各ステップ大きなカーネルまたはcudaストリームを使用する方が良いですか?

のために1つのカーネルで 1)を使用し、一つの大きなカーネル 2)を使用したスト​​リーム:私はいくつかのステップでデータを処理する必要があり、それは私が2つのオプションをしたように私には見えますこの場合は本当に問題になるのでしょうか?大きなカーネルの待ち時間は、いくつかの小さなカーネルの待ち時間の合計と同じですか?

他の方法と比べて利点がありますか?

ありがとうございます。

答えて

3

Fermiカードのカーネルの起動遅延は10usのオーダーであるため、心配はありません。ゲームでシーンをレンダリングするには、さまざまなシェーダ(カーネル)を実行する必要があります。

カーネルは、グローバルメモリから処理するデータを読み込み、結果をグローバルメモリに書き戻す必要があります。したがって、それぞれのカーネルは、完全な読み取り/書き込みサイクルを意味します。大きなカーネルで複数のステップを連鎖させることができ、それでも単一の読み書きサイクルで囲まれていれば、速度を上げることができます。

たとえば、オペレーションA、B、Cを実行する必要がある場合、それらを連鎖すると、READ-A-B-C-WRITEが得られ、別のカーネルがREAD-書き込み - 読み出し - 書き込み - 書き込み。

カーネルを1つでも実行しても、別々のステップを分割してデバイス機能を分離することで、コードを読み込み可能にすることができます。

+3

大きなカーネルには大きなレジスタフットプリントもあり、パフォーマンスに大きな影響を及ぼします。 – talonmies

+3

私はチェックしていませんが、理論的には、チェーン内のステップ間で変数が共有されていない場合、コンパイラはレジスタの再使用を維持して、レジスタ使用量の合計が使用するステップの使用量と同じになるようにします。それでも、それは良い点であり、共有メモリの使用はおそらく同じ方法で考慮されるべきです。つまり、チェーン内の1ステップのリソース使用率が他のステップよりもはるかに高い場合、他のステップで占有率が低下する可能性があるため、別々に実行するほうがよいでしょう。 –

+0

ありがとう、私はデバイス機能と1つの大きなカーネルを使用します。 – zitmen

関連する問題