TBB与Homegrown Workqueue

Car*_*s00 2 c c++ parallel-processing tbb linux-kernel

我知道TBB(Thread Building Blocks)声称拥有一个复杂的引擎,但从算法的角度来看:

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

Kon*_*lph 15

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

  • 不要编写自己的调度程序(此处的工作队列计数).
  • 你要么效率低下,要么做错了.

实际上,编写正确的调度程序并不困难.不幸的是,如果你想有效地做到这一点很难.有效的调度程序有效地排除了锁的使用(除非在非常具体的,明确指定的情况下),并且无锁的跨线程通信是一个痛苦的世界.

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

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