【问题标题】:Intel Tbb overhead issueIntel Tbb 开销问题
【发布时间】:2015-12-06 09:44:24
【问题描述】:

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

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

【问题讨论】:

  • 如果它这么快,你为什么关心它有多快?如果答案是“因为我需要处理很多图像”,那么在图像级别(甚至可能是多图像级别)并行化,而不是像素级别。
  • @T.C 不,我只需要改进单个图像。我只是对这种情况下英特尔 TBB 的可能性感到好奇。谢谢。

标签: c++ parallel-processing intel tbb overhead


【解决方案1】:

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

  1. 如果您只测量第一次调用,它包括创建工作线程的开销。请注意,TBB 没有像 OpenMP 这样的障碍,因此一次调用 parallel_for 可能不足以创建所有线程)
  2. 由于缺少并行工作,工作线程进入睡眠状态后会发生同样的情况。唤醒的开销比线程创建的开销低几个数量级,但仍会影响测量并得出错误的结论。
  3. TBB 调度程序可以将任务从外层窃取到嵌套层(阻塞调用),因此测量结果看起来似乎只在嵌套部分忙于那里的额外工作时才需要很长时间。
  4. 由显式(例如互斥锁)或隐式(例如错误共享)原因导致并行处理 (A) 和 (B) 的争用。但无论如何,它不是 TBB 特有的。

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

当然,按照建议,首先在外层平行。 TBB 提供了足够多的不同模式,包括tbb::parallel_pipelinetbb::flow::graph

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2011-10-10
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多