我正在使用英特尔 TBB 并行处理图像处理算法的某些部分。虽然每个像素的处理取决于数据,但在某些情况下可以并行处理 2 个连续像素,如下所示。
ProcessImage(image)
for each row in image // Create and wait root task for each line here using allocate_root()
ProcessRow(row)
for each 2 pixel
if(parallel())
ProcessPixel(A) and ProcessPixel(B) in parallel // For testing, create and process 2 tbb::empty_task() here as child tasks
else
ProcessPixel(A)
ProcessPixel(B)
但是,由于处理速度非常快,因此会产生开销。对于每个输入图像(大小为 512x512),处理时间约为 5-6 毫秒。 当我实验性地使用 Intel TBB 作为上面的注释 block 时,处理成本超过 25 ms。
那么有没有更好的方法使用英特尔 TBB 而没有开销问题或其他更有效的方法来提高像这样的简单快速处理程序的性能?
最佳答案
TBB 不会为并行算法的调用增加如此大的(~20ms)开销。我的猜测(因为没有提供具体细节)是它与以下之一有关:
- 如果仅测量第一次调用,则它包括工作线程创建的开销。请注意,TBB 不像 OpenMP 那样有障碍,因此只需调用
parallel_for
可能不足以创建所有线程) - 由于缺乏并行工作,工作线程进入休眠状态后也会发生相同的情况。唤醒的开销比线程创建的开销低几个数量级,但仍然会影响测量并得出错误的结论。
- 由于显式(例如互斥)或隐式(例如错误共享)原因,存在并行处理 (A) 和 (B) 的争用。但无论如何,它不是 TBB 特有的。
因此,使用 TBB 进行性能测量的建议是仅考虑足够长的计算序列的总时间,这将隐藏初始化开销。
当然,正如所建议的,首先在外层平行。 TBB 提供了足够的不同模式,包括 tbb::parallel_pipeline
和tbb::flow::graph
关于c++ - Intel Tbb 开销问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496207/