私は新しいOpenCLプログラマーで、GPGPUコンピューティングを始めたばかりで、Nvidia Quadro 600を使用しています。GPUプログラミングに基づいて研究を行っています。目的は、SIMTを使用してOpenCL用の単純なカルマンフィルターカーネルを作成することです。アプローチ。CUDAでどのように実行できるかによって原理を説明しているこのドキュメントを見つけました。これは、OpenCLの場合と同様のアプローチだと思います。
線形システムでカルマンフィルターによって実行される基本的な操作は3つの方程式であり、それぞれが行列操作を含み、カルマンゲイン行列(K)、状態推定(x〜)を計算し、の誤差共分散行列(P)を更新します。次の状態推定。これらの3つのステップは、実際のシステムから取得した測定ごとに繰り返されます。SIMTアプローチを考慮して、スレッドブロック内の各gpuスレッドでカルマンフィルターの1つの反復を実行することを考えました。反復を計算するために必要な値を各スレッドに送信します(実際のシステム測定からの入力と出力、線形システムマトリックス) 。
このアルゴリズムをOpenCLで実行するために検討できるより良い設計がいくつかありますか?別のカーネルで並列に行列演算を行うことは可能です(そして便利ですか?)
別の質問:k回の反復があると仮定します。各反復kについて、ステップk + 1のPを計算し、入力として反復k-1からのステップkのPを取ります...各トレッドは1回の反復を計算するため、次のことが可能です。スレッドkを同期して、スレッドk-1からのP行列を待機しますか?
更新:何度も検索して試した結果、この問題の実装(上記のとおり)をOpenCLの動作原理に適合させることは不可能だと思いました。私がそれを行うために見つけた唯一の方法は、各単一の行列演算を並列化することです。おそらく、より多くのGPUを使用して、各行列演算を同時に計算します。この実装の実際の効率は、フィルタリングする大きな線形システムで達成できます(つまり、大きな行列でうまく機能します)。