英特尔Tbb开销问题



我使用英特尔TBB并行处理图像处理算法的某些部分。虽然对每个像素的处理取决于数据,但在某些情况下,两个连续的像素可以并行处理,如下所示。

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 ms。当我实验使用英特尔TBB作为上面的注释块时,处理成本超过25毫秒。

那么有没有更好的方法使用英特尔TBB没有开销问题或其他更有效的方法来提高性能的简单和快速的处理程序像这样?

TBB不会为并行算法的调用增加这么大(~20ms)的开销。我的猜测(因为没有提供具体细节)是它与以下之一有关:

  1. 如果您只度量第一次调用,则它包含了创建工作线程的开销。注意,TBB没有像OpenMP那样的障碍,所以对parallel_for的一次调用可能不足以创建所有线程)
  2. 由于没有并行工作,工作线程进入睡眠状态后也会发生同样的情况。唤醒的开销比创建线程的开销低几个数量级,但仍然会影响测量并产生错误的结论。
  3. TBB调度器可以将任务从外部级别窃取到嵌套级别(阻塞调用),因此测量看起来只在忙于额外工作时才处理嵌套部分需要太长时间。
  4. 由于显式(例如互斥)或隐式(例如虚假共享)原因,并行处理(a)和(B)存在争用。但无论如何,它不是结核特异性的。

因此,使用TBB进行性能测量的建议是只考虑足够长的计算序列的总时间,这将隐藏初始化开销。

当然,正如建议的那样,首先在外层平行。TBB为tbb::parallel_pipelinetbb::flow::graph提供了足够多的不同模式

相关内容

  • 没有找到相关文章

最新更新