并行编程实战——TBB中Task Scheduler的执行

一、Task Scheduler默认执行

在TBB中,一般情况下,默认会允许任务调度器使用所有的可用计算资源 。这种情况当然是为了更大化的利用计算机的资源,但这也有可能在一些场合下,导致与其它任务的资源竞争。所以,TBB也允许对任务调度器进行控制,从而只使用其中的一部分资源。
但需要提醒的是,在对任务调度器进行配置控制时,可能导致一些问题。需要加以认真对待。

二、TBB配置任务调度器

TBB中,提供了task_arena接口作为控制任务管理器的引导。task_arena其实就是一个并行资源的管理器或者说并行的环境管理器,它允许创建一个隔离的线程池,同时它还支持嵌套的使用。
task_arena 应用的主要目的是:
1、控制并行度:指定 task_arena 中的线程数,控制并行任务的执行。
2、资源隔离:不同的 task_arena 可以运行在不同的 CPU 核心上,实现资源的隔离和优化。
3、优先级调度:不同的任务集分配可分配不同的 task_arena,实现优先级调度。
它可以通过下面两种方式来控制任务调度:
1、设置首选计算单元
2、限制部分计算单元

三、任务调度配置的内容

在知道任务管理器提供的接口task_arena后,就可以看看其如何应用 。这些任务的控制一般封装在task_arena::constraints中,它包括对下面几部分的控制:
1、首选NUMA节点
其实是就NUMA架构上,任务被随机调度到不同的节点上时,可能产生性能的损失,所以可以将任务分配到指定的NUMA节点,即可以在task_arena::constraints::numa_id域上进行标记节ID,见下面的代码:

std::vector<tbb::numa_node_id> numa_indexes = tbb::info::numa_nodes();
std::vector<tbb::task_arena> arenas(numa_indexes.size());
std::vector<tbb::task_group> task_groups(numa_indexes.size()</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值