Почему HPX требует, чтобы «тогда» будущего было частью DAG (направленный ациклический граф)? - PullRequest
0 голосов
/ 03 мая 2019

В вводных руководствах по HPX вы узнаете, что можете использовать метод будущего then(), который позволяет ставить в очередь некоторую операцию для вычисления, когда будущее будет готово.

В этом руководстве есть предложение «Используется для создания DAG (ориентированных ациклических графов) потока данных» при объяснении того, как использовать затем.

Мой вопрос: что означает, что эта очередь должна быть ациклической?Могу ли я сделать функцию, которая пересчитывает будущее внутри тогда?Это будет выглядеть как myfuture.then( recompute myfuture ; myfuture.then() )?

1 Ответ

0 голосов
/ 04 мая 2019

Можно вспомнить hpx::future (очень похоже, если не идентично std::experimental::future, см. https://en.cppreference.com/w/cpp/experimental/future) - это однократный конвейер между анонимным производителем и потребителем. Он не представляет задачусам по себе, но только полученный результат (который, возможно, еще не был вычислен).

Таким образом, «пересчет» будущего (как вы его выразили) может означать только повторную инициализацию будущего от асинхронного поставщика (hpx::async,future<>::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'

Я не уверен, что это ответит на ваш вопрос и почему вы хотели бы это сделать, но вот, пожалуйста.

...