В настоящее время мы пытаемся реализовать красно-черный решатель Гаусса-Зейделя для численного моделирования.
Для этого мы разделили нашу область моделирования на подсетки одинакового размера.Мы можем асинхронно выполнять красно-черные циклы для уравнения давления на каждой подсети с правильными зависимостями и объектом hpx::dataflow
.
Но теперь у нас есть следующая проблема: после каждого n-го цикла мы должны выполнить остаточный расчет, чтобы определить, сходятся ли мы уже.
Таким образом, оптимальным решением будет то, что мызапускать каждый локальный остаточный расчет отдельно / асинхронно, а затем суммировать по вектору hpx::future<double>
.С идеей HPX-фьючерсов, которая может привести к оптимальному решению, то есть мы суммируем все элементы как можно скорее.
Но до сих пор нам удалось придумать только следующий код:
#include <hpx/hpx_main.hpp>
#include <hpx/hpx.hpp>
#include <memory>
#include <iostream>
class A {
public:
double residual() {
// Calculate actual local residual
return 1.0;
}
};
int main() {
// Create instances
std::vector<A> vec(3);
std::vector<hpx::shared_future<double>> res(vec.size());
// asynchronous launch resdiual calculation
for (size_t i = 0; i < res.size(); ++i) {
res[i] = hpx::async( &A::residual, &vec[i] );
}
double residual = 0.0;
for (size_t i = 0; i < res.size(); ++i) {
residual += res[i].get();
}
std::cout << "residual: " << residual << std::endl;
return 0;
}
Это далеко не оптимально.В худшем случае это производительность как глобальный барьер, за которым следует чистая последовательная сумма по всем элементам.
Итак, наш вопрос, как мы можем реализовать этот «HPX», как параллельно?
Обновление 02.02.2019:
Мы уже переписали наш код, так что мы не можем начать наш остаточный расчет полностью асинхронно, но на основе зависимостей данных через объект hpx::dataflow
.
// asynchronous launch resdiual calculation
for (size_t i = 0; i < res.size(); ++i) {
res[i] = hpx::dataflow( hpx::util::unwrapping(&A::residual), &vec[i], *DEPENDENCIES* );
}
Можно ли также вызвать код @Mike van Dyke с объектами потока данных или есть другое решение?
(Подсказка: ваш код не работает из-за template argument deduction/substitution failed
ошибка)