0

IPP と TBB を組み合わせて、画像サイズ変更アルゴリズムをさらに改善しようとしています。このタスクを達成するには、次の 2 つの方法があります。

  1. TBB なしで IPP を使用する
  2. parallel_for ループ内で TBB を使用して IPP を使用する

私の質問は、アプリケーションをコーディングしたことであり、正しい結果が得られます。しかし驚くべきことに、それらを組み合わせると私の計算時間は長くなります。混乱を避けるために、コードの一部のみをここに貼り付けます。ただし、必要に応じてコード全体を提供できます。IPP のみを使用する最初のケースでは、コードは次のようになります。

ippiResizeSqrPixel_8u_C1R(src, srcSize, srcStep, srcRoi, dst, dstStep, dstRoi, 
m_nzoom_x,m_nzoom_y,0, 0, interpolation, pBufferWhole);

そして、parallel_for ループは次のようになります。

parallel_for(
    blocked_range<size_t>(0,CHUNK),
    [=](const blocked_range<size_t> &r){
        for (size_t i= r.begin(); i!= r.end(); i++){
            ippiResizeSqrPixel_8u_C1R(src+((int)(i*srcWidth*srcHeight)), srcSize, 
srcStep, srcRoi, dst+((int)(i*dstWidth*dstHeight)), dstStep, dstRoi, 
m_nzoom_x,m_nzoom_y,0, 0, interpolation, pBuffer);
        }
    }
);

srcdstは、ソース イメージと宛先イメージへのポインターです。TBB を使用すると、イメージがパーツに分割されCHUNKS、parallel_for がすべてをループしCHUNKS、IPP 関数を使用して各 CHUNK を個別にサイズ変更します。dstHeightsrcHeightsrcRoi、およびの値はdstRoi、イメージの分割に対応するように変更され、ソース イメージsrc+((int)(i*srcWidth*srcHeight))dst+((int)(i*dstWidth*dstHeight))宛先イメージの各パーティションの先頭を指します。

どうやら、IPP と TBB はこのように組み合わせることができます (正しい結果が得られるため)。ただし、IPP を単独で使用した場合と比較して、それらを組み合わせた場合に計算時間が悪化することは私を困惑させます。何が原因であるか、またはこの問題をどのように解決できるかについて何か考えはありますか?

ありがとう!

4

2 に答える 2

0

一部のIPP関数はマルチスレッドを自動的に使用することがわかりました。このような機能の場合、TBBを使用しても改善は得られません。どうやらippiResizeSqrPixel_8u_C1R( ... )関数はそれらの関数の1つです。1つを除くすべてのコアを無効にした場合、両方のバージョンで同じように機能しました。

于 2012-10-31T20:50:41.630 に答える
0

コードでは、並列化された各タスクparallel_forは複数のippiResizeSqrPixel呼び出しで構成されています。これは、1 回だけ呼び出すシリアル バージョンと比較すると、無意味なオーバーヘッドになる可能性があります。これは、このような関数には準備フェーズ (たとえば、補間係数テーブルのセットアップ) が含まれる場合があり、通常、実行時の効率のために一度に大きなメモリ ブロックを処理するように設計されているためです。(ただし、IPP が実際にどのように機能するかはわかりません。)

並列構造に従うことをお勧めします。

parallel_for(
  // Range = src (or dst) height of image.
  blocked_range<size_t>(0, height),
  [=](const blocked_range<size_t> &r) {
    // 'r' = vertical range of image to process in this task.
    // You can calculate src/dst region from 'r' here,
    // and call ippiResizeSqrPixel once per task.
    ippiResizeSqrPixel_8u_C1R( ... );
  }
);
于 2012-10-25T02:16:04.483 に答える