基本イメージ内で約 35 のサブイメージまたはパターンを見つけようとする CUDA プログラムを作成しています。各サブイメージ (パターン) は、ベース イメージの小さな領域 (10x10 ピクセル ウィンドウなど) にのみ存在できます。サブイメージのサイズは 1000 から 10000 ピクセルまでさまざまです。ベース画像は 640x480 ピクセルです。
これは、サブイメージをベース イメージのサブセクションで畳み込み、畳み込みの結果がしきい値よりも小さい場合、それよりも一致していると見なされます。サブイメージごとに約 100 回の畳み込みを行う必要があります (許容位置の 10x10 ウィンドウのみをチェックするため)。
最初の質問: これは実装されており、オープン ソースで利用できますか?
2 番目の質問: どちらがより優れた実装戦略ですか?
- 粗粒度: 各 CUDA スレッドは、ベース イメージ内のサブイメージの完全な畳み込みを行います。サブイメージと位置ごとに 1 つの CUDA スレッドがあります。
- きめの細かい: 各 CUDA スレッドは、畳み込みの 1 つのコンポーネント (ピクセル) を計算します。つまり、CUDA スレッドは、サブイメージのピクセルをベース イメージの適切なピクセルで乗算します。次に、syncblock() を使用してこれらの倍数を合計します。
更新:両方のアプローチを試しました。最良の方法は、大きなサブイメージを小さなサブイメージに分割する方法 1 の変形だと思います。これで、すべてのサブイメージがほぼ同じサイズ (たとえば、1024 ピクセル) になりました。次に、各 CUDA スレッドが 1 つの位置に対して完全な畳み込みを行います。完了したら、すべての結果をホストに送信します。ホストは、中間部分を元に戻す責任があります (小さな部分に分割されたサブイメージの場合)。利点は、すべての CUDA スレッドが同じ量の作業を実行することです。これは、サブイメージのサイズが異なるため、問題となる 2 番目のアプローチの 2 倍の速さのようです。