【问题标题】:Rcpp::Function in parellel for sectionRcpp::Function in parallel for section
【发布时间】:2019-02-23 10:27:30
【问题描述】:

我正在尝试并行化以循环计算个人的适应度值。对于整个算法,我使用的是 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 创建飞蛾搜索算法的并行优化包。

std::function 基本相同的c++ 代码运行良好。 Rcpp 代码在没有并行的情况下也能正常工作。

【问题讨论】:

  • Rcpp::Function 来自哪里?如果它是 R 函数,则不能使其线程保存。如果 Xptr 是您为传输而包装的 C++ 函数,您可以使用它。
  • 这是我的代码应该优化的函数。由 R 的用户提供。但似乎这个问题在 Rcpp 中是不可能解决的。除非我会强制用户使用 c++。所以看来我要么在 R 中用并行部分重写它,要么在 Rcpp 中保持单线程,然后看看什么运行得更快。
  • 如果您在 R 级别进行并行化,则可以使用 Rcpp::Function,因为您需要与多个 R 进程进行交互。
  • 公平点,虽然它仍然以 R 速度运行 ...

标签: r rcpp rcppparallel


【解决方案1】:

你知道Rcpp::Function() 只是调用了一个 R 函数,因此

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

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

如果您希望 C++ 速度并行,您需要编写可以并行调用的 C++ 代码 - 例如,请参阅 RcppParallel 包及其小插图以获取介绍性示例。

【讨论】:

  • 是的,我知道,这就是为什么我正在寻找将该函数转换为 C++ 函数的方法。问题是我正在编写优化包,其中优化功能由 R 中所述包的用户提供,所以我不能只用 C++ 重写它,因为它每次都会不同。 ABCOptim CRAN 包中使用了类似的方法,但该包不是并行的。
  • 我要么在 R 中并行重写,要么在 Rcpp 中保持单线程,看看哪个更快。因为似乎只有其他解决方案是强制用户用 C++ 编写优化函数。
  • FWIW RcppDE 是一个优化框架,我允许导入用户提供的 C++ 函数。
  • 你介意我从你的 RcppDE 中获取概念,稍微改变它并在我的包中使用它吗?当然,我会在代码和文档中引用您的帮助。
  • 当然不是——这都是 GPL 的原因。我本来打算回到 RcppDE 来添加 OpenMP 角度,但不知何故它从未发生过——我一直在尝试在串行和并行模式下获得相同的 RNG 流,这可能有点太多了。
猜你喜欢
  • 2020-05-03
  • 2022-12-02
  • 2022-12-07
  • 2018-09-17
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-02
相关资源
最近更新 更多