首页 > 解决方案 > Rcpp::Function in parellel for section

问题描述

我正在尝试并行化个人的循环计算适应度值。对于整个算法,我使用的是 Rcpp,但适应度函数是从 R 传递的。

所以我正在尝试做这样的事情:

#pragma omp parallel for
  for (int i = 0; i < population.size(); i++)
  {
    population[i].computeFitness(FitnessFunction);
  }

where FitnessFunctionisRcpp::Function和 computeFitness 只是类函数,本质上是将计算值分配给成员变量。

void computeFitness(Rcpp::Function optFunction)
  {
    this->_fitness = Rcpp::as<double>(optFunction(this->_coords));
  }

但这会崩溃,因为据我所知,R 是单线程的,我不能在并行部分中使用任何底层 R 实例。

那么有什么方法可以转换Rcpp::Functionstd::function, functor 或类似的东西吗?有没有其他方法可以将函数从 R 传递到 Rcpp,这将允许我并行计算这个适应度值?

整个工作是为 CRAN 创建飞蛾搜索算法的并行优化包。

c++ 中基本相同的代码std::function效果很好。Rcpp 代码可以在没有并行的情况下正常工作。

标签: rrcpprcppparallel

解决方案


您是否知道Rcpp::Function()仅调用 R 函数,因此

  1. 违反了您声明在(OpenMP 或 pthread)并行代码中使用底层 R 实例的原则,并且
  2. 当然也只能作为 R 函数以 R 速度运行?

您可以在 R 级别更轻松地实现 R 代码的并行调用。

如果你想要 C++ 并行的速度,你需要编写可以并行调用的 C++ 代码——例如,参见RcppParallel包和它的小插图作为介绍性示例。


推荐阅读