IPP と TBB を組み合わせて、画像サイズ変更アルゴリズムをさらに改善しようとしています。このタスクを達成するには、次の 2 つの方法があります。
- TBB なしで IPP を使用する
- 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);
}
}
);
src
とdst
は、ソース イメージと宛先イメージへのポインターです。TBB を使用すると、イメージがパーツに分割されCHUNKS
、parallel_for がすべてをループしCHUNKS
、IPP 関数を使用して各 CHUNK を個別にサイズ変更します。dstHeight
、srcHeight
、srcRoi
、およびの値はdstRoi
、イメージの分割に対応するように変更され、ソース イメージsrc+((int)(i*srcWidth*srcHeight))
とdst+((int)(i*dstWidth*dstHeight))
宛先イメージの各パーティションの先頭を指します。
どうやら、IPP と TBB はこのように組み合わせることができます (正しい結果が得られるため)。ただし、IPP を単独で使用した場合と比較して、それらを組み合わせた場合に計算時間が悪化することは私を困惑させます。何が原因であるか、またはこの問題をどのように解決できるかについて何か考えはありますか?
ありがとう!