2

私はIntelのC++でいくつかの画像処理ソフトウェアを開発しています。これは、小さな(約1kpx)画像に対してバイキュービック補間アルゴリズムを何度も実行する必要があります。これにはかなりの時間がかかりますが、私はそれをスピードアップすることを目指しています。私が今持っているのは、文献に基づく基本的な実装です。これは、行列の乗算を行わず、補間多項式の一部に事前に計算された式を使用し、最後に固定された、多少改善された(速度に関して)バージョンです。 -行列乗算コードのポイントバージョン(実際には動作が遅くなります)。実装が最適化された外部ライブラリもありますが、それでも私のニーズには遅すぎます。次に考えていたのは:

  • 浮動小数点バージョンと固定小数点バージョンの両方で、MMX/SSEストリーム処理を使用したベクトル化
  • 畳み込みを使用してフーリエ領域で補間を行う
  • OpenCLなどを使用して作業をGPUにシフトする

これらのアプローチのどれが最大のパフォーマンス向上をもたらすことができますか?別のものを提案してもらえますか?ありがとう。

4

4 に答える 4

5

GPUが進むべき道だと思います。これは、このタイプのハードウェアにとっておそらく最も自然な作業です。まず、 CUDAまたはOpenCLを調べます。単純なDirectX/OpenGLピクセル/フラグメントシェーダーなどの古い手法でも、問題なく機能するはずです。

私が見つけたいくつかのリンク、多分それらはあなたを助けることができます:

于 2011-01-28T16:37:59.070 に答える
3

GPUルートを使用する場合は注意が必要です。畳み込みカーネルが速すぎると、IOバウンドになってしまいます。両方を実装しない限り、どちらが最速かはわかりません。

GPU Gems 2には、GPUソリューションの出発点として適した高速3次テクスチャフィルタリングに関する章があります。

Intel Threading Building BlocksとSSE命令の組み合わせは、まともなCPUソリューションになります。

于 2011-01-28T17:00:45.657 に答える
3

処理を高速化するために内部でSIMDを使用するIntelIPPライブラリがあります。Intel IPPもOpenMPを使用します。構成されている場合は、比較的簡単なマルチプロセッシングのメリットを享受できます。

これらのライブラリはバイキュービック補間をサポートしており、有料です(開発ライセンスを購入しますが、再配布は無料です)。

于 2011-01-28T16:56:19.543 に答える
0

バイキュービックの答えではありませんが、おそらく別の方法です。
私があなたを理解している場合、あなたは32 x 32 xy、1024 x 768の画像を持っており、補間したいですimage[xy]
xyを丸めるだけでimage[ int( xy )]は、粒子が粗くなります。
ただし、待ってください。平滑化された二重画像を2k x 1.5kで一度作成すると、粒子の粗さが
image2[ int( 2*xy )]少なくなり、非常に高速になります。または同様に
image4[ int( 4*xy )]、平滑化された4kx3k画像。
これがどれだけうまく機能するかは...

于 2011-02-04T16:55:50.453 に答える