我们正在考虑C/C++
使用哪个并行框架。我们有一些非常特殊的条件并且不能 100% 确定,例如TBB
可以添加“更多”的东西。
- 有正在
N
运行的线程和一个同步的工作队列(使用pthread
互斥锁)。 - 我们的工作是优先的(
int
)。 - 作业被放入队列中,空闲线程接受具有最高优先级的作业。
如此重复直到队列为空。
好吧,现在,我想知道从算法的角度来看,像TBB
(线程构建块)这样的框架是否可以为这种特殊场景提供更多?(所以,内部...)
我们正在考虑C/C++
使用哪个并行框架。我们有一些非常特殊的条件并且不能 100% 确定,例如TBB
可以添加“更多”的东西。
N
运行的线程和一个同步的工作队列(使用pthread
互斥锁)。int
)。如此重复直到队列为空。
好吧,现在,我想知道从算法的角度来看,像TBB
(线程构建块)这样的框架是否可以为这种特殊场景提供更多?(所以,内部...)
TBB 4 提供了 concurrent_priority_queue(在参考手册中搜索“优先级” )。此外,如果您可以在设计程序时考虑到任务而不是线程,那么使用 TBB 会很好。事实上,它提供了很多东西来描述任务之间的依赖关系。此外,如果 TBB 对您很重要,它似乎是相当便携的。
在我看来,你可以通过用更强大的东西替换沉重的互斥锁来获得收益,比如 spin_rw_mutex:http ://threadingbuildingblocks.org/files/documentation/a00163.html 。由于最有可能的插入/删除操作很快,您可以从非阻塞锁中受益更多。
我建议您查看TBB 模块摘要页面,看看是否有任何对您有用的内容。
例如,在Containers部分下,没有concurrent_queue< T, A >
“A high-performance thread-safe non-blocking concurrent queue”。它不是优先级队列,因此无论如何您都必须自己构建它。
另一方面,在Synchronization下,有一些互斥体变体可能会让您的生活更轻松。
底线:TBB 并不是那么神奇,但它可能会有所帮助。
TBB 可以为您提供:
请注意,即使正确地使用 TBB 并密集地使用 TBB,与您自己的实施相比,您也可能不会注意到任何性能提升。它在很大程度上取决于您的系统,尤其是在线程间通信,尤其是同步成为瓶颈的情况下。通常是在您的任务很小并且数量很多的情况下。
我曾使用过包括 OpenMP、Cilk 在内的并行化框架。这提供了一个很好的抽象并使并行化相对容易。但是,我怀疑这些是否直接支持优先级队列,或者即使您可以修改他们的任务队列。
您可以使用此自定义任务队列来执行基于优先级的队列。
如果你想使用 TBB,我已经将它与 OpenMP 一起使用,它似乎很好地融合在一起。另外,您无需担心并发容器。与人们可用的其他实现相比,它非常可靠。
希望这可以帮助。