Taskflow:运行时交互(Interact with the Runtime)

文章介绍了如何在Taskflow中利用Runtime对象与调度运行时交互,实现条件任务的动态调度。此外,还展示了如何通过Runtime重用图形并利用工作窃取机制运行多个任务。
摘要由CSDN通过智能技术生成

Taskflow允许您通过将运行时对象作为任务的参数与调度运行时进行交互。这主要用于设计从Taskflow的现有设施扩展的专用并行算法。

创建Runtime对象

Taskflow允许静态任务和条件任务接受引用的tf::Runtime对象,该对象提供一组方法与调度运行时交互。以下示例创建一个静态任务,该任务利用tf::Runtime来显式调度在正常调度环境中永远不会运行的条件任务:

#include <taskflow/taskflow.hpp>
void print_str(char const* str) {
    std::cout << str << std::endl;
}
int main() {
    tf::Executor executor;
    tf::Taskflow taskflow;
    auto [A, C, D] = taskflow.emplace(
        [](){ return 0; },  // 条件任务
        [](){ print_str("C"); },
        [](){ print_str("D"); }
    );

    auto B = taskflow.emplace(
        [&C](tf::Runtime& rt){ 
            print_str("B"); 
            rt.schedule(C); // Runtime对象显式调用Task C
        }
    );
    A.precede(B, C, D);
    executor.run(taskflow).wait();

}

在这里插入图片描述

当条件任务A完成并返回0时,executor会移动到任务B。在正常情况下,任务C和D不会运行,因为它们的条件依赖性永远不会发生。这可以通过通过驻留在同一图中的任务的Runtime对象强制调度C或D来打破。在这里,任务B调用tf::Runtime::schedule来强制运行任务C,即使A和C之间的弱依赖性永远不会基于图结构本身发生。

同时,Runtime还可以用来复用一个Graph:

// create a custom graph
tf::Taskflow graph;
graph.emplace([](){ std::cout << "independent task 1\n"; });
graph.emplace([](){ std::cout << "independent task 2\n"; });

taskflow.emplace([&](tf::Runtime& rt){ 
  // this worker coruns the graph through its work-stealing loop
  rt.corun(graph);
});
executor.run_n(taskflow, 10000);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值