英特尔TBB并行化开销

Nor*_*löw 4 c++ parallel-processing tbb overhead lock-free

为什么英特尔线程构建模块(TBB)parallel_for有如此大的开销?根据第3.2.2 自动分块Tutorial.pdf其周围半毫秒.这是教程中的一个重点:

注意:对于parallel_for,循环通常需要至少一百万个时钟周期才能提高其性能.例如,在2 GHz处理器上占用至少500微秒的环路可能会受益于parallel_for.

从我到目前为止所读到的内容,TBB在内部使用了线程池(工作线程池)模式,它通过最初只生成工作线程(这需要数百微秒)来防止这种不良开销.

那么花时间呢?使用互斥锁进行数据同步并不是那么慢吗?此外,TBB不使用无数据结构进行同步吗?

min*_*ang 11

从我到目前为止所读到的内容,TBB在内部使用了线程池(工作线程池)模式,它通过最初只生成工作线程(这需要数百微秒)来防止这种不良开销.

是的,TBB预先分配线程.它看不到它在物理上创建和连接工作线程parallel_for.OpenMP和其他并行库都进行预分配.

但是,从池中唤醒线程并将逻辑任务分配给线程仍然存在开销.是的,TBB利用无锁数据结构来最小化开销,但它仍然需要一些并行开销(即串行部分).这就是为什么TBB手册建议避免非常短的循环.

通常,您必须有足够的工作才能获得并行加速.我认为即使是1毫秒(= 1,000微秒)也太小了.根据我的经验,为了看到有意义的加速,我需要将执行时间增加大约100毫秒.

如果TBB的并行开销parallel_for确实是您关注的问题,那么尝试简单的静态调度可能是值得的.我不太了解TBB的静态调度实现.但是,您可以轻松尝试OpenMP的:omp parallel for schedule(static).我相信这个开销将是并行的最小成本.但是,由于它使用静态调度,动态调度的好处(特别是当工作负载不均匀时)将会丢失.