500x500 の画像 (ただし、サイズを変更することもできます) と非常に小さな 2D カーネル (ラプラシアン 2D カーネルなので、3x3 カーネルです。小さすぎる) の間で高速な 2D 畳み込みを実行するために、CUDA カーネルを数日間試してきました。すべての cuda スレッドで大きなアドバンテージを得るために)。
CPU の従来の実装 (2 つの for ループ、ご想像のとおり簡単です) を作成してから、CUDA カーネルの作成を開始しました。
より高速な畳み込みを実行するためのいくつかの残念な試みの後、私はこのコードに行き着きました: http://www.evl.uic.edu/sjames/cs525/final.html (共有メモリのセクションを参照)。共有メモリに必要なすべての畳み込みデータをブロックロードし、畳み込みを実行します。
何もありません、CPUはまだずっと高速です。CUDA SDK は、大きなカーネル サイズで効率的であると述べているため、FFT アプローチは試しませんでした。
私が書いたものをすべて読んだかどうかにかかわらず、私の質問は次のとおりです。
CUDA を使用して、比較的大きな画像と非常に小さなカーネル (3x3) の間で高速な 2D 畳み込みを実行するにはどうすればよいですか?