Rcpp :: Parallel中的函数

时间:2019-02-23 10:27:31

标签: r rcpp rcppparallel

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

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

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

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

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

但是这崩溃了,因为,正如我现在所知,R是单线程的,并且我不能在并行节中使用任何底层的R实例。

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

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

在c ++中,带有std::function的基本相同的代码效果很好。 Rcpp代码无需并行就可以正常工作。

1 个答案:

答案 0 :(得分:2)

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

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

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

如果想要并行C ++速度,则需要编写可以并行调用的C ++代码-例如,请参见RcppParallel软件包及其插图作为示例。