为啥 HPX 要求未来的“那么”成为 DAG(有向无环图)的一部分?

Posted

技术标签:

【中文标题】为啥 HPX 要求未来的“那么”成为 DAG(有向无环图)的一部分?【英文标题】:Why HPX requires future's "then" to be part of a DAG (directed acyclic graph)?为什么 HPX 要求未来的“那么”成为 DAG(有向无环图)的一部分? 【发布时间】:2019-05-03 15:56:33 【问题描述】:

在 HPX 介绍教程中,您了解到您可以使用 future 的 then() 方法,该方法允许您在 future 准备好时将一些要计算的操作排入队列。

在本手册中,有一句 "Used to build up dataflow DAGs (directed acyclic graphs)" 在解释如何使用 thens 时。

我的问题是,这个队列必须是非循环的是什么意思?我可以制作一个在 then 中重新计算未来的函数吗?这看起来像myfuture.then( recompute myfuture ; myfuture.then() )

【问题讨论】:

【参考方案1】:

您可以认为hpx::future(非常相似,如果与std::experimental::future 不同,请参阅https://en.cppreference.com/w/cpp/experimental/future)是匿名生产者和消费者之间的一次性管道。它不代表任务本身,而只是产生的结果(可能尚未计算)。

因此“重新计算”未来(如您所说)只能意味着从异步提供程序(hpx::asyncfuture<>::then 等)重新初始化未来。

hpx::future<int> f = hpx::async([] return 42; );

hpx::future<int> f2 = f.then(
    [](hpx::future<int> r) 
    
        // this is guaranteed not to block as the continuation 
        // will be called only after `f` has become ready (note:
        // `f` has been moved-to `r`)
        int result = r.get();

        // 'reinitialize' the future
        r = hpx::async([] return 21; );

        // ...do things with 'r'

        return result;
    );

// f2 now represents the result of executing the chain of the two lambdas
std::cout << f2.get() << '\n';        // prints '42'

我不确定这是否能回答您的问题以及您为什么要这样做,但您可以这样做。

【讨论】:

如果我理解正确,这个重新初始化会创建一个全新的 r 对象,它与前一个对象无关。虽然这种区别在这里没有影响,但当您拥有 hpx::shared_future 并有多个后续任务等待它时,它可能会产生影响。这种重新初始化不会对这些后续任务产生任何影响,即使 hpx 调度程序在很久以后启动这些任务,它们仍会看到存储的旧值 (42)。我读对了吗?

以上是关于为啥 HPX 要求未来的“那么”成为 DAG(有向无环图)的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何将有向无环图 (DAG) 存储为 JSON?

图论——拓扑排序

图论——拓扑排序

(QR14)带权的DAG节点排序

Equivalent Sets HDU - 3836 2011多校I tarjan强连通分量

算法详解之拓扑排序