r - Rcpp::Function in parellel for section
问题描述
我正在尝试并行化个人的循环计算适应度值。对于整个算法,我使用的是 Rcpp,但适应度函数是从 R 传递的。
所以我正在尝试做这样的事情:
#pragma omp parallel for
for (int i = 0; i < population.size(); i++)
{
population[i].computeFitness(FitnessFunction);
}
where FitnessFunction
isRcpp::Function
和 computeFitness 只是类函数,本质上是将计算值分配给成员变量。
void computeFitness(Rcpp::Function optFunction)
{
this->_fitness = Rcpp::as<double>(optFunction(this->_coords));
}
但这会崩溃,因为据我所知,R 是单线程的,我不能在并行部分中使用任何底层 R 实例。
那么有什么方法可以转换Rcpp::Function
为std::function
, functor 或类似的东西吗?有没有其他方法可以将函数从 R 传递到 Rcpp,这将允许我并行计算这个适应度值?
整个工作是为 CRAN 创建飞蛾搜索算法的并行优化包。
c++ 中基本相同的代码std::function
效果很好。Rcpp 代码可以在没有并行的情况下正常工作。
解决方案
您是否知道Rcpp::Function()
仅调用 R 函数,因此
- 违反了您声明在(OpenMP 或 pthread)并行代码中使用底层 R 实例的原则,并且
- 当然也只能作为 R 函数以 R 速度运行?
您可以在 R 级别更轻松地实现 R 代码的并行调用。
如果你想要 C++ 并行的速度,你需要编写可以并行调用的 C++ 代码——例如,参见RcppParallel包和它的小插图作为介绍性示例。
推荐阅读
- c++ - 找不到头文件错误:
和 在 macOS Catalina 中在 VScode Cmake 或 Clang++ 中编译时 - excel - 在 VBA 中突出显示超出限制
- angular - Angular 9 - mat-select 的问题,它没有选择选项列表中的当前值
- c# - 我可以在 UWP 应用程序中导入和显示 3D 文件(例如从 Blender 导出)吗?
- javascript - 如何从javascript中的xml响应正文中读取字符串
- angular - 显示模态如果条件在Angular中为真?
- android - 为什么 Android 共享首选项的文件名需要唯一?
- c# - 自定义构造函数输入到 AutoFixture 中的抽象类
- c++ - 处理数组时指针中的分段错误
- autodesk-forge - 与剖面交互