c++ - Intel Tbb 开销问题

标签 c++ parallel-processing intel tbb overhead

我正在使用英特尔 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)开销。我的猜测(因为没有提供具体细节)是它与以下之一有关:

  1. 如果仅测量第一次调用,则它包括工作线程创建的开销。请注意,TBB 不像 OpenMP 那样有障碍,因此只需调用 parallel_for可能不足以创建所有线程)
  2. 由于缺乏并行工作,工作线程进入休眠状态后也会发生相同的情况。唤醒的开销比线程创建的开销低几个数量级,但仍然会影响测量并得出错误的结论。
  3. 由于显式(例如互斥)或隐式(例如错误共享)原因,存在并行处理 (A) 和 (B) 的争用。但无论如何,它不是 TBB 特有的。

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

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

关于c++ - Intel Tbb 开销问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32496207/

相关文章:

python - 我可以从多个进程/线程写入 HDF5 文件吗?

multithreading - atomic.Load 和atomic.Store 的意义是什么

compiler-construction - 目前哪些编译器支持 Haswell 事务内存?

c++ - 如何在 C++ 中重载一元和二元减号运算符?

c - 我想使用 OpenMP 并行化 C 代码片段,但得到错误的输出

x86 - 英特尔处理器中内存 Controller 和缓存之间的数据路径宽度是多少?

assembly - 是否有使用 AT&T 语法的完整 x86 汇编语言引用?

iphone - Objective c 将 block 转换为选择器

C++ 线程安全 : If only one thread can write to a non-atomic variable but multiple threads read from it.。可以遇到问题吗?

c++ - 查找导致链接库函数的函数