うまくいけば処理速度を上げるために、書いたプログラムをCUDAに変換しようとしています。
明らかに、私の古いプログラムは多くの関数を次々に実行します。これらの関数をメイン プログラムで分離し、それぞれを順番に呼び出します。
void main ()
{
*initialization of variables*
function1()
function2()
function3()
print result;
}
関数 2 は関数 1 の結果に依存するため、これらの関数は本質的にシリアルです。
さて、これらの関数をカーネルに変換し、関数内のタスクを並列で実行したいと思います。
各関数を並列に書き直してから、メイン プログラムで各カーネルを次々と呼び出すのと同じくらい簡単ですか? これは必要以上に遅いですか?たとえば、次のカーネルを初期化するために CPU に戻ることなく、GPU に次の並列操作を直接実行させることはできますか?
実行中のデータ転送量を制限するために、すべてのランタイム変数を GPU メモリに保持することは明らかですが、カーネル呼び出し間の時間についても心配する必要がありますか?
この質問が明確であることを願っています。そうでない場合は、詳しく教えてください。ありがとう。
そして、私の正気を確認できるように、追加の質問があります。最終的に、このプログラムの入力はビデオ ファイルであり、さまざまな機能を通じて、各フレームが結果につながります。私の計画は、一度に複数のフレーム (たとえば、8 つの一意のフレーム) を取得し、これらの 8 つのフレームの間でブロックの総数を分割することです。その後、ブロック内の複数のスレッドが画像データに対してさらに並列操作を実行します。 、ベクトル加算、フーリエ変換など。
これは問題にアプローチする正しい方法ですか?