1

私はCUDAプログラミングに不慣れで、パフォーマンス上の理由から、ほとんどの場合、ブロックごとに共有メモリを使用しています。現在のプログラムの構造では、1つのカーネルを使用して共有メモリをロードし、別のカーネルを使用して事前にロードされた共有メモリを読み取ります。しかし、私が理解しているように、共有メモリは2つの異なるカーネル間で永続化することはできません。

私は2つの解決策を念頭に置いています。私は最初のものについてはよくわかりません、そして2番目は遅いかもしれません。

最初の解決策:2つのカーネルを使用する代わりに、1つのカーネルを使用します。共有メモリをロードした後、カーネルはホストからの入力を待機し、操作を実行してから、値をホストに返す場合があります。カーネルがホストからのシグナルを待つことができるかどうかはわかりません。

2番目の解決策:共有メモリをロードした後、共有メモリの値をグローバルメモリにコピーします。次のカーネルが起動したら、値をグローバルメモリから共有メモリにコピーして戻し、操作を実行します。

2つのソリューションの実現可能性についてコメントしてください。

4

1 に答える 1

2

提案された最初のソリューションのバリエーションを使用します。すでにお察しのとおり、カーネルへのホスト入力を待つことはできませんが、ある時点でカーネルを同期することはできます。「__syncthreads();」を呼び出すだけです。データを共有メモリにロードした後、カーネルで。

2番目の解決策がよくわかりません。最初のカーネルのグローバルメモリにデータをコピーして戻すためだけに、データを共有メモリにコピーするのはなぜですか。それとも、この最初のカーネルも何かを計算しますか?この場合、最初に予備的な結果を共有メモリに保存することは役に立たないと思います。むしろ、グローバルメモリに直接保存したいと思います(ただし、これはアルゴリズムによって異なる場合があります)。

于 2012-06-22T17:30:28.507 に答える