Rcpp::Function 并行部分

Rcpp::Function in parellel for section

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

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

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

其中 FitnessFunctionRcpp::Function 而 computeFitness 只是 class 函数,本质上是将计算值分配给成员变量。

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

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

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

这整个工作是为了创建CRAN的Moth Search Algoritm并行优化包。

std::function 基本相同的 c++ 代码运行良好。 Rcpp 代码在没有并行的情况下工作正常。

您是否知道 Rcpp::Function() 只是调用了一个 R 函数,因此

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

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

如果您想要并行执行 C++ 速度,则需要编写可以并行调用的 C++ 代码——例如,请参阅 RcppParallel 程序包及其简介示例。