运行时执行策略不同
Different execution policies at runtime
在 C++17 中,algorithm
标头中的许多函数现在可以采用执行策略。例如,我可以定义和调用这样的函数:
template <class ExecutionPolicy>
void f1(const std::vector<std::string>& vec, const std::string& elem, ExecutionPolicy&& policy) {
const auto it = std::find(
std::forward<ExecutionPolicy>(policy),
vec.cbegin(), vec.cend(), elem
);
}
std::vector<std::string> vec;
f1(vec, "test", std::execution::seq);
但是,我还没有找到在运行时使用不同策略的好方法。例如,当我想根据某些输入文件使用不同的策略时。
我玩弄了变体,但最终问题始终是不同类型的std::execution::seq
,std::execution::par
和std::execution::par_unseq
。
一个有效但繁琐的解决方案如下所示:
void f2(const std::vector<std::string>& vec, const std::string& elem, const int policy) {
const auto it = [&]() {
if (policy == 0) {
return std::find(
std::execution::seq,
vec.cbegin(), vec.cend(), elem
);
}
else if (policy == 1) {
return std::find(
std::execution::par,
vec.cbegin(), vec.cend(), elem
);
}
else{
return std::find(
std::execution::par_unseq,
vec.cbegin(), vec.cend(), elem
);
}
};
}
f2(vec, "test", 0);
还有我忽略的更优雅的解决方案吗?
编辑:也许我应该更精确。假设目标是将策略保存在可以具有三个策略之一的变量中。该变量应该是函数的参数。
这里的标准方法是将类型的选择与类型的使用分开:后者采用函数模板的形式,由前一个非模板函数(或具有较少模板参数的函数模板(多次实例化。
为避免在这两个层之间重复正常参数,请使用通用 lambda 作为模板。 为避免重复选择逻辑,请创建一个函数模板,该模板使用适当的策略调用任何 lambda:
enum Policy {seq,par,par_unseq};
template<class F>
auto maybe_parallel(F f,Policy p) {
switch(p) {
case seq: return f(std::execution::seq);
case par: return f(std::execution::par);
default: return f(std::execution::par_unseq);
}
}
auto f2(const std::vector<std::string>& vec,
const std::string& elem,Policy p) {
return maybe_parallel
([&](auto &pol) {return std::find(pol,vec.begin(),vec.end(),elem);},p);
}
另一种方法是为此目的使用std::variant
和std::visit
。
using parallel_policy = std::variant
<
std::execution::sequenced_policy,
std::execution::parallel_policy,
std::execution::parallel_unsequenced_policy,
std::execution::unsequenced_policy
>;
void f2(const std::vector<std::string>& vec,
const std::string& elem,
const parallel_policy policy
)
{
std::visit
(
[&](auto policy_real)
{
f1(vec, elem, policy_real);
},
policy
);
}
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- C++17中的并行执行策略
- 运行时执行策略不同
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- C++ 中的执行策略
- 动态控制C++的执行策略类型
- 访问执行策略for_each函数对象中的迭代器
- 执行策略如何用于C++中的顺序遍历算法
- 选择零件的策略要执行C
- 如何使用 CUDA 推力执行策略覆盖推力的低级设备内存分配器
- 游戏有时不会执行随机选择的策略