英特尔Tbb开销问题
Intel Tbb overhead issue
我使用英特尔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)的开销。我的猜测(因为没有提供具体细节)是它与以下之一有关:
- 如果您只度量第一次调用,则它包含了创建工作线程的开销。注意,TBB没有像OpenMP那样的障碍,所以对
parallel_for
的一次调用可能不足以创建所有线程) - 由于没有并行工作,工作线程进入睡眠状态后也会发生同样的情况。唤醒的开销比创建线程的开销低几个数量级,但仍然会影响测量并产生错误的结论。
- TBB调度器可以将任务从外部级别窃取到嵌套级别(阻塞调用),因此测量看起来只在忙于额外工作时才处理嵌套部分需要太长时间。
- 由于显式(例如互斥)或隐式(例如虚假共享)原因,并行处理(a)和(B)存在争用。但无论如何,它不是结核特异性的。
因此,使用TBB进行性能测量的建议是只考虑足够长的计算序列的总时间,这将隐藏初始化开销。
当然,正如建议的那样,首先在外层平行。TBB为tbb::parallel_pipeline
和tbb::flow::graph
提供了足够多的不同模式
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 实现无开销push_back的最佳方法是什么
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- C++constexpr数组查找:内存开销?其他问题
- 英特尔Tbb开销问题