Nvidia Performance Primitives(NPP)の画像畳み込み関数を使用しています。ただし、私のカーネルは画像サイズに関してかなり大きく、NPPの畳み込みはFFTベースの畳み込みではなく直接畳み込みであるという噂を聞いています。(NPPソースコードが利用できるとは思わないので、どのように実装されているかわかりません。)
作業中の画像処理アプリケーションで、 cuFFTベースの畳み込み関数をどれだけ高速に実行できるかを確認したいと思います。
「ねえ、画像をcuFFTに入れて、どれだけ速いか見てみてください」と言うかもしれません。そして、私がMatlabを使用していた場合、あなたは正しいでしょう-それはMatlabでの1行の呼び出しです:
%assuming the images are padded
convolved = ifft2(fft2(image).* fft2(filter));
ただし、cuFFTで画像の畳み込みを行うには、多くの定型文が必要です。そのため、cuFFTベースの畳み込みを実行し、実装を抽象化するコードを探しています。そして、確かに、私はいくつかのことを見つけました:
- このgithubリポジトリには、 cufft_sample.cuというファイルがあります。コードは有望に見えると思いましたが、畳み込みの実装が誤った結果を生成しているというコメントを含む別のファイルをリポジトリで見つけました。
WARNING: GpuFFTConvOp currently don't return the good answer
TODO: extend to cover more case, as in many case we will crash!
Kitware VTK/ITKコードベースがcuFFTベースの画像畳み込みを提供することを頭に浮かびました。残念ながら、(せいぜい)cuFFTベースのルーチンを実行することが将来のリリースで計画されていることがわかりました。
MatlabFileExchangeで2D畳み込みを行うコードを見つけました。重要な部分はC/CUDAに実装されていますが、Matlabラッパーがあります。私は純粋なC/C ++ / CUDAを優先してMatlabラッパーを取り除くことに取り組んでいますが、よりエレガントで実績のあるソリューションがあるかどうかはまだ興味があります。
これらの3つのオプションの中で推奨事項はありますか?
cuFFTベースの画像畳み込みを行うビルド済みコードに関して他に何がありますか?