1

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ベースの畳み込みを実行し、実装を抽象化するコードを探しています。そして、確かに、私はいくつかのことを見つけました:

    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ベースの画像畳み込みを行うビルド済みコードに関して他に何がありますか?

4

1 に答える 1

3

arrayfireを試すことができます。

ArrayFireでは、次のことができます。

array image(rows, columns, h_image);
array filter(frows, fcols, h_filter);
array res = convolve(image, filter); 

フィルタのサイズに応じて、conolveコマンドはcufftまたはより高速な手動で調整されたカーネルを使用します。を使用fft2したい場合は、次のようにすることができます

array res = ifft2(fft2(image) * fft2(filter));

convolveただし、カフから最高のパフォーマンスを引き出すように最適化されているため、代わりに使用することを強くお勧めします。

より便利なリンク:

  1. フーリエ変換
  2. 畳み込みとフィルタリング

免責事項:

  • ArrayFireはオープンソースではありません。ただし、無料で使用できるバージョンがあります。
  • 私はAccelerEyesで働いており、arrayfireを開発しています。@solvingPuzzlesが、arrayfireが実行しているのと同様のライブラリを具体的に要求したため、私は私たちの製品にリンクしています。
于 2012-11-26T07:32:41.967 に答える