本土工作队与英特尔TBB

时间:2011-12-05 14:17:53

标签: c++ c multithreading gcc tbb

我们正在考虑使用C/C++的并行框架。我们有一些非常特殊的条件,并不是100%肯定,例如TBB可以添加“更多”内容。

  • N个正在运行的线程和一个同步的工作队列(使用pthread互斥锁)。
  • 我们的工作优先(int)。
  • 将作业放入队列,空闲线程将获得具有最高优先级的作业。

重复此操作直到队列为空。

嗯,现在,我想知道像TBB(线程构建模块)这样的框架能否为算法提供更多算法强>观点?? (所以,内部......)

5 个答案:

答案 0 :(得分:5)

TBB 4提供concurrent_priority_queue(reference manual中的搜索'优先级')。此外,如果您可以设计具有任务而不是线程的程序,那么使用TBB是很好的。实际上,它提供了很多东西来描述任务之间的依赖关系。此外,TBB似乎相当便携,如果它对你很重要。

答案 1 :(得分:3)

在我看来,你可以通过用更强大的东西替换重型互斥体来获得收益,比如spin_rw_mutex:http://threadingbuildingblocks.org/files/documentation/a00163.html。由于最有可能的插入/删除操作很快,因此您可以从非阻塞锁中获益更多。

答案 2 :(得分:1)

我建议您查看TBB module summary pages并查看是否有任何对您有用的内容。

例如,在Containers部分下,没有concurrent_queue< T, A >,“高性能线程安全的非阻塞并发队列”。它不是优先级队列,所以无论如何你都必须自己构建它。

另一方面,在Synchronization下,有一些互斥变体可能会让您的生活更轻松。

结论:TBB并不是那么神奇,但它可能会有所帮助。

答案 3 :(得分:0)

TBB可以为您提供:

  • 无锁的concurrent_queue。我不记得有关优先队列的任何事情,但正如詹姆斯在评论中建议的那样,你可以通过cocurrent_queue自己构建它。
  • 内存分配器针对多线程环境中的性能进行了调整。
  • 同步原语,如原子变量
  • 只是好主意如何有效实施多线程的东西

请注意,即使使用TBB正确而集中地执行所有操作,您也不会注意到与您自己的强制措施相比的任何性能提升。它在很大程度上取决于您的系统,特别是如果通信和特别是同步是一个瓶颈。通常情况下,如果你的任务很小并且有很多任务。

答案 4 :(得分:0)

我使用过并行化框架,包括OpenMP,Cilk。这提供了一个很好的抽象,并使并行化相对容易。但是,我怀疑它们是否直接支持优先级队列,或者即使您可以修改其任务队列。

您可以使用this自定义的TaskQueue来执行基于优先级的队列。

如果你想使用TBB,我已经将它与OpenMP一起使用,它看起来很融洽。另外,您不必担心并发容器。与人们可用的其他实现相比,它非常可靠。

希望这有帮助。