我正在尝试并行化以计算个人的适应度值。对于整个算法,我使用的是Rcpp,但是适应度函数是从R传递的。
所以我正在尝试做这样的事情:
#pragma omp parallel for
for (int i = 0; i < population.size(); i++)
{
population[i].computeFitness(FitnessFunction);
}
其中FitnessFunction
是Rcpp::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代码无需并行就可以正常工作。
答案 0 :(得分:2)
您知道Rcpp::Function()
只是调用R函数,因此
您可以在R级别更轻松地实现R代码的并行调用。
如果想要并行C ++速度,则需要编写可以并行调用的C ++代码-例如,请参见RcppParallel软件包及其插图作为示例。