TBB vs. Homegrown Workqueue

时间:2011-11-11 09:04:37

标签: c++ c linux-kernel parallel-processing tbb

我知道TBB(线程构建块)声称拥有一个复杂的引擎,但从算法的角度来看:

如果我们(比如在Linux上)有一个工作队列,其N个工作线程(POSIX线程,N是核心数)和一个互斥的同步任务队列,每个工作线程然后在空闲时从队列中获取任务,还有一些同步调用,TBB提供的还有什么,不计算好的C++语法?我没有看到比贪婪地将任务分配到核心更好的算法。

2 个答案:

答案 0 :(得分:15)

作为开发了自己的工作窃取调度程序的人,我可以说以下内容:

  • 不要编写自己的调度程序(这里计算工作队列)。
  • 你要么效率低下,要么你做错了。

事实上,编写正确的调度程序并不困难。不幸的是,如果您想有效地执行它, 很难。一个有效的调度程序有效地排除了锁的使用(可能在非常具体的,明确指定的情况下),无锁的跨线程通信是一个痛苦的世界。

作为一个轶事,我实际上实现了一个调度程序,我基本上必须现有算法复制到代码中,我仍然设法将几乎任何可以想象的竞争条件引入代码中。调试此代码是

的混合
  • 编写巨大的,错综复杂的测试用例(只是为了发现仅在<1%的运行中发生的偶然故障),
  • 花费数小时只是盯着代码,试图通过应用逻辑找出错误
  • 跟踪调试器中的每一行(一旦发生错误,将在没有堆栈跟踪的情况下崩溃),手动跟踪所有线程中所有变量的状态确保程序的实际状态符合预期状态
  • 将代码多次减少到零并重建,注释出单行或成对行以查看效果(巨大的组合空间),
  • 靠墙跑,先走。

答案 1 :(得分:3)

不知道TBB的确切实施,我不能说它究竟提供了什么,但是因为你说“可以提供什么”......

其中,

  • 它可以提供无锁排队和排队,而不是每个任务一个系统调用和上下文切换。这比听起来更难实现。
  • 如果队列为空,它还可以阻止工作线程。再次,这比听起来更难实施。
  • 它可以提供偷工作。
  • 它可以提供与Windows完成端口相同的LIFO任务到线程分配(提高缓存效率)。
  • 它可能没有错误。再次,这比你想象的更难实施。