私が遭遇している問題は、Matlab の GPU プログラミングの組み込み機能が並列実行のためにデータを正しく分割するようにコードを記述することです。具体的には、N 個の「粒子」画像を GPU のメモリに送信し、各画像を 3 次元で表す 3 次元配列に編成し、N 個の画像のそれぞれをターゲットを表す 1 つの画像と比較しようとしています。 GPUメモリに。
私の現在の実装は、実際に多かれ少なかれ実装したい方法ですが、1行のコードで構成されています。
particle_ifft = ifft2(particle_fft.*target_fft);
これは、アップロードされた各画像の fft を取得した後であることに注意してください。ここにインデックスの問題があります。このステートメントでは、'.*' 演算子を使用するために、同じサイズの "particle_fft" と "target_fft" マトリックスが必要です。各粒子画像と比較するために、同じターゲット画像の複数のコピーを持つことは、メモリ使用量の点で非効率的です。私はこの非効率的な方法を使用して良好なパフォーマンス結果を得ましたが、GPU にアップロードできる粒子画像の数に大きな影響を与えました。
粒子画像の3次元配列(各画像)の各2次元要素を単一のターゲット画像のみと比較するようにmatlabに指示できる方法はありますか?
for ループを使用して 3d 配列にインデックスを付け、単一のターゲットと比較するために各粒子画像に個別にアクセスしようとしましたが、Matlab は GPU でこのタイプの操作を並列化しません。つまり、同等のコードよりも 1000 倍近く遅く実行されます。メモリ効率の悪いターゲット配列を使用しています。
このインデックス作成の問題を解決する独自のカーネルを作成できることはわかっていますが、matlab の既存の機能を活用する方法を見つけることに興味があります (具体的には fft2 および ifft2 関数を書き直さないため)。アイデア?