HPX transform_reduce - PullRequest
       20

HPX transform_reduce

0 голосов
/ 03 февраля 2019

Я пытался использовать transform_reduce из hpx, как указано в Ответе https://stackoverflow.com/a/54481320/11008404, но не могу его скомпилировать.Мой код до сих пор:

#include <hpx/hpx_main.hpp>
#include <hpx/hpx.hpp>
#include <hpx/include/parallel_transform_reduce.hpp>
#include <hpx/include/iostreams.hpp>

#include <vector>

class A {
public:
  double residual() {
    // Calculate actual local residual
    double i = 1.0;
    return i;
  }
};

int main() {

  std::vector<A> vec(300);
  double res = hpx::parallel::transform_reduce(hpx::parallel::execution::par,        
                      vec.begin(), vec.end(),                         // (1)
                      [](A& a_ref){ return a_ref.residual(); },       // (2)
                      0, [](double a, double b){ return a + b; });    // (3)

  hpx::cout << "residual: " << res << hpx::endl;

  return 0;
}

Компилятор выдает следующие ошибки:

hpx.cpp:23:65: error: no matching function for call to ‘transform_reduce(const hpx::parallel::execution::parallel_policy&, std::vector<A>::iterator, std::vector<A>::iterator, main()::<lambda(A&)>, int, main()::<lambda(double, double)>)’
                   0, [](double a, double b){ return a + b; });    // (3)

.../include/hpx/parallel/algorithms/transform_reduce.hpp:255:22: error: no type named ‘type’ in ‘struct hpx::util::invoke_result<main()::<lambda(double, double)>, A>’

Есть кто-то предложение, что не так или другое решение для вопроса, заданного в Параллельное уменьшение (например, сумма) вектор hpx :: futures ?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Если я изменю ответ hkaiser на

#include <hpx/hpx_main.hpp>
#include <hpx/hpx.hpp>
#include <hpx/include/parallel_transform_reduce.hpp>
#include <hpx/include/iostreams.hpp>

#include <vector>

class A {
public:
  double residual() const {
    // Calculate actual local residual
    double i = 1.0;
    return i;
  }
};

int main() {

  std::vector<A> vec(300);
  double res = hpx::parallel::transform_reduce(hpx::parallel::execution::par,        
                      vec.begin(), vec.end(),
                      0.,
                      [](double a, double b){ return a + b; },
                      [](const A& a_ref){ return a_ref.residual(); }); // note: const!

  hpx::cout << "residual: " << res << hpx::endl;

  return 0;
}

, код компилируется.Он также компилируется, если вы передаете A по значению или в качестве указателя.

Я не знаю, предназначено ли это поведение, поэтому я открыл проблему на github HPX (https://github.com/STEllAR-GROUP/hpx/issues/3651)

0 голосов
/ 04 февраля 2019

Сигнатура transform_reduce менялась несколько раз в процессе ее стандартизации (посмотрите, что на самом деле стандартизировалось: https://en.cppreference.com/w/cpp/algorithm/transform_reduce). Я думаю, что для компиляции вам просто нужно получить последовательность аргументовсправа:

#include <hpx/hpx_main.hpp>
#include <hpx/hpx.hpp>
#include <hpx/include/parallel_transform_reduce.hpp>
#include <hpx/include/iostreams.hpp>

#include <vector>

class A {
public:
  double residual() {
    // Calculate actual local residual
    double i = 1.0;
    return i;
  }
};

int main() {

  std::vector<A> vec(300);
  double res = hpx::parallel::transform_reduce(hpx::parallel::execution::par,        
                      vec.begin(), vec.end(),
                      0.,
                      [](double a, double b){ return a + b; },
                      [](A& a_ref){ return a_ref.residual(); });

  hpx::cout << "residual: " << res << hpx::endl;

  return 0;
}
...