2011-01-28 40 views
2

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

  • を使用して、フーリエ領域で補間を行う浮動および固定小数点バージョン
  • の上の両方で、MMX/SSEストリーム処理を使用して

    • ベクトルOpenCLなどを使用したGPU

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

  • +0

    私たちの話はいかがですか?比較的速い操作を何度もやっているのか、それとも期待していたよりもずっと遅いので遅いですか? – Neil

    +0

    私はそれが比較的速いと思いますが、私はそれをたくさん行う必要があります。外部ライブラリは約27us(SSE)でそれを引き出し、私の最善の実装は約50usを引き出します。 – neuviemeporte

    +0

    GPUを使用する場合、アルゴリズムの出力はどうしますか?メインメモリに戻る必要がありますか?それ自体がボトルネックになる可能性はありますか? –

    答えて

    5

    私はGPUが行く方法だと思います。このタイプのハードウェアにとっては、おそらく最も自然な仕事です。まず、CUDAまたはOpenCLを調べてみましょう。単純なDirectX/OpenGLピクセル/フラグメントシェーダのような古い技法もうまくいくはずです。

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

    3

    は、より高速な処理のために内部的にSIMDを使用Intel IPP libraries、あります。インテル®IPPもOpenMPを使用しています。構成すれば、比較的簡単なマルチプロセッシングの利点を得ることができます。

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

    +1

    +1:インテルICCコンパイラを購入するとIPPライセンスを取得できます(ランタイムライセンスの問題はありません)。 ICCだけでgccやVisual Studioよりもパフォーマンスが向上するはずです。カスタムSIMDコードを書く前にIPPを試してみるのは間違いありません。 –

    +0

    @Paul R、このヒントをありがとう、私はこのコンパイラを真剣に見ていきます。 –

    +0

    @ChrisO IPPはキュービック補間をサポートしていますが、バイキュービックはサポートしていません。彼らは同じと見なされますか? –

    3

    GPUルートには注意してください。畳み込みカーネルが速すぎると、最終的にIOバウンドになります。両方を実装しない限り、どちらが最速であるかはわかりません。

    GPU Gems 2には、Fast Third-Order Texture Filteringに関する章があります。これは、GPUソリューションの出発点になるはずです。

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

    0

    ないバイキュービックのための答え、多分代替:
    私はあなたを理解していれば、あなたは32×32のxy、1024×768の画像を持っている、とimage[xy]を補間したいです。
    xy、image[ int(xy)]を四捨五入すると粒が粗すぎます。
    —を待つと、平滑化された2枚の画像を1回2k x 1.5k作ることができます。
    image2[ int(2*xy)]:ざらつきが少なく、非常に高速です。または、同様に、平滑化された4k×3k画像で
    image4[ int(4*xy)]
    どれくらいうまくいくのですか...

    +0

    実際、これは逆です。私は1024x768の画像を持っており、 "画像"からの非均一に分散したデータポイントに基づいて補間された32x32のxyを作成したい。 – neuviemeporte

    +0

    はい、image [xy]は画像から32x32です。 1kポイントでx0 .. x31で1d、32の値を考えてみましょう:1つの画像から多くの異なるxyを補間したい場合(あなたの場合ですか?)、画像を2kまたは4kにスムーズに吹き込み、32 xyの値は整数に丸められます。これらは元のイメージを半分/四分の一ピクセル高速でサンプリングします。 – denis

    関連する問題