HPX transform_reduce
HPX transform_reduce
我已经尝试使用答案 中给出的 hpx 中的 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(), // (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>’
有人对 中提出的问题提出了错误的建议或其他解决方案吗?
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;
}
如果我把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,它也会编译。
我不知道这种行为是否有意,所以我在 HPX github 上打开了一个问题
(https://github.com/STEllAR-GROUP/hpx/issues/3651)
我想补充一点,并行 STL 已通过 -std=c++17
进入 gcc 9,只需要与 -ltbb
链接(即是 Intel's Thread Building Blocks,可轻松安装在 Linux 上,例如使用 apt
)。
#include <numeric>
#include <execution>
#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 = std::transform_reduce(std::execution::par,
vec.begin(), vec.end(),
0.,
[](double a, double b){ return a + b; },
[](A& a_ref){ return a_ref.residual(); });
std::cout << "residual: " << res << std::endl;
return 0;
}
我已经尝试使用答案
#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>’
有人对
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;
}
如果我把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,它也会编译。
我不知道这种行为是否有意,所以我在 HPX github 上打开了一个问题 (https://github.com/STEllAR-GROUP/hpx/issues/3651)
我想补充一点,并行 STL 已通过 -std=c++17
进入 gcc 9,只需要与 -ltbb
链接(即是 Intel's Thread Building Blocks,可轻松安装在 Linux 上,例如使用 apt
)。
#include <numeric>
#include <execution>
#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 = std::transform_reduce(std::execution::par,
vec.begin(), vec.end(),
0.,
[](double a, double b){ return a + b; },
[](A& a_ref){ return a_ref.residual(); });
std::cout << "residual: " << res << std::endl;
return 0;
}