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);
}
其中 FitnessFunction
是 Rcpp::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 函数,因此
- 违反了您声明的在(OpenMP 或 pthread)并行代码中使用底层 R 实例的原则,
- 当然也只能以R速度运行作为R功能?
在R级别可以更轻松的实现R代码的并行调用。
如果您想要并行执行 C++ 速度,则需要编写可以并行调用的 C++ 代码——例如,请参阅 RcppParallel 程序包及其简介示例。
我正在尝试并行化循环计算个体的适应度值。对于整个算法,我使用的是 Rcpp,但适应度函数是从 R 传递的。
所以我正在尝试做这样的事情:
#pragma omp parallel for
for (int i = 0; i < population.size(); i++)
{
population[i].computeFitness(FitnessFunction);
}
其中 FitnessFunction
是 Rcpp::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 函数,因此
- 违反了您声明的在(OpenMP 或 pthread)并行代码中使用底层 R 实例的原则,
- 当然也只能以R速度运行作为R功能?
在R级别可以更轻松的实现R代码的并行调用。
如果您想要并行执行 C++ 速度,则需要编写可以并行调用的 C++ 代码——例如,请参阅 RcppParallel 程序包及其简介示例。