如何使用TBB先执行最长的任务



我有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教材

相关内容

  • 没有找到相关文章

最新更新