我想通过结合IPP和TBB在我的图像调整大小算法中获得进一步的改进。我可以完成这个任务的两种方法是:结合英特尔IPP和TBB
- 使用IPP没有TBB
- 使用IPP与TBB一个parallel_for时循环
我的问题是,我已经编写的应用程序中,我得到正确的结果。但令人惊讶的是,当他们合并时,我的计算时间更长。为了避免混乱,我只在这里粘贴了部分代码。但是如果需要,我可以提供整个代码。对于当我只用IPP第一种情况下,该代码是这样的:(该算法的基础是从用于图像大小调整英特尔TBB示例代码借用)
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
,和dstRoi
的值进行修改以适应图像的分区,并且src+((int)(i*srcWidth*srcHeight))
和dst+((int)(i*dstWidth*dstHeight))
将指向源和目标图像中每个分区的开始。
显然,IPP和TBB可以以这种方式结合 - 因为我得到了正确的结果 - 但令我感到困惑的是,与单独使用IPP时相比,当它们结合时,计算时间会恶化。任何关于可能是什么原因的想法,或者我如何解决这个问题?
谢谢!
我假设图像尺寸太小而不能利用并行性。你测试了多大的输入/输出图像? – yohjp
这是我最初的想法,但即使在我测试了比原尺寸大几倍的大尺寸图像后,我也没有看到任何改进。 – SMir
您是否尝试分析此问题?你在哪个平台上。 – Rick