我有10000个任务,我试图用tbb跨N个线程调度。9900个任务的执行时间为O(1)个单位,其余100个任务的执行时间为O(100)-O(1000)个单位。我希望tbb对这些任务进行调度,使前100个最长的任务首先在线程上调度,以便我们最大化效率。如果一些线程完成得更快,那么它们可以在最后运行较短的作业。
我有一个(假设的)例子:在10000个任务中,我有一个超长任务,占用1111个单位,其余9999个任务都只占用1个单位,我有10个线程。我想让线程j在1111个单位时间内运行这个超长任务,其他9个线程运行剩下的9999个任务,每个任务占用1个单位时间,所以这9个线程在1111个单位时间内运行9999/9=1111个任务。这意味着我正在以100%的效率使用线程(忽略任何开销)。
我得到的是这样一个函数:
bool run( Worker& worker, size_t numTasks, WorkerData& workerData ) {
xtbbTaskData<Worker,WorkerData> taskData( worker, workerData, numThreads);
arena.execute( [&]{ tbb::parallel_for( tbb::blocked_range<size_t>( 0, numTasks ), xtbbTask<Worker,WorkerData>( taskData ) ); } );
}
,我有一个xtbb::arena
竞技场与numThreads
创建。Worker是我的Worker类,有10000个任务,workerData
是运行每个任务所需数据的类,我有一个模板类xtbbTaskData
,它接受Worker,workerdata
,最终有operator()
调用在Worker中的每个任务上运行。
我应该使用什么语法来调度这些任务,以便最长的任务首先得到调度?有任务优先级,tbb区域,查询等,我遇到过,但我没有找到如何编码的好例子。
我需要创建多个竞技场吗?还是多个工人?或者把最长的任务放在worker
的向量的末尾?还是别的什么?
如果有人能给我指出已经这样做的例子或模板,那就太好了。
task_group_context表示一组任务,这些任务可以被取消,也可以设置它们的优先级。
参考第378页的专业TBB c++并行编程与线程构建模块示例教材。
我们还可以将优先级定义为任务域的一个属性。
参考第494页的专业TBB c++并行编程与例如Threading Building Blocks教材