【发布时间】:2019-02-23 10:27:30
【问题描述】:
我正在尝试并行化以循环计算个人的适应度值。对于整个算法,我使用的是 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 创建飞蛾搜索算法的并行优化包。
与std::function 基本相同的c++ 代码运行良好。 Rcpp 代码在没有并行的情况下也能正常工作。
【问题讨论】:
-
Rcpp::Function来自哪里?如果它是 R 函数,则不能使其线程保存。如果Xptr是您为传输而包装的 C++ 函数,您可以使用它。 -
这是我的代码应该优化的函数。由 R 的用户提供。但似乎这个问题在 Rcpp 中是不可能解决的。除非我会强制用户使用 c++。所以看来我要么在 R 中用并行部分重写它,要么在 Rcpp 中保持单线程,然后看看什么运行得更快。
-
如果您在 R 级别进行并行化,则可以使用 Rcpp::Function,因为您需要与多个 R 进程进行交互。
-
公平点,虽然它仍然以 R 速度运行 ...
标签: r rcpp rcppparallel