0

我有一个 R 脚本,它通过编译 C++ 代码sourceCpp("prog.cpp"),然后调用goprog.cpp. 然后,这个 C++ 代码对 R 进行了多次调用,并且(经过相当长的一段时间后)最终返回结果。

我想我应该开始利用我的笔记本电脑有 4 个核心的事实。我想并行化事情。但是,在遇到意想不到的问题之前,我可以问一下什么是支持的,什么是不支持的?

可以通过以下几种方式完成该任务:

  • (如果可能,这就是我想做的)clusterApply在 R 中调用。clusterApplied然后将调用这个 C++ 函数的函数,这意味着这个函数将被并行调用 4 次。
    • 此 C++ 函数的所有 4 个实例是否会相互隔离?
    • 特别是,使用的全局变量会prog.cpp出现在 4 个独立实例中还是只有一个实例中?(不要向我扔石头……我知道最好避免使用全局变量)
    • 当 C++ 代码调用 R 函数时,我会遇到问题,然后从 CRAN 编译的包中调用函数吗?
    • 如果不是:呼叫sourceCpp("prog.cpp")内部clusterApply帮助?go(与返回所需的长时间相比,编译时间可以忽略不计)
  • (从我读到的内容来看,这是行不通的,但为了完整起见,我们还是问一下这个问题):我可以go只从 R 代码调用一次(就像我现在所做的那样)并在 C++ 代码中创建 4 个线程吗?
    • 我注意到来自 CRAN 的编译包往往不会这样做,即使这些任务的计算成本很高 - 这让我认为可能不支持这样做
    • 特别是,当线程 C++ 代码回调到 R 时,我会遇到问题吗?(如果这很重要,C++ 代码调用的 R 函数将调用 CRAN 编译包中的函数)

我用谷歌搜索,我知道存在 RcppParallel 这样的东西。但是,引用他们的主页

API 限制

您在并行工作者中编写的代码不应以任何方式调用 R 或 Rcpp API。

然后我想我不能使用 RcppParallel 因为,正如我所说,我的 C++ 代码多次调用 R (这些调用所花费的时间与 C++ 所花费的时间相当,所以我非常希望将它们并行化;这clusterApply将允许我.

4

1 回答 1

2

当您使用时,clusterApply您实际上是在使用(在您的情况下)4 个不同的 R 进程。所以是的,C++ 函数、任何全局变量等都是分开的。即使从 C++ 回调 o R 也是安全的,因为每个 C++ 函数都有自己的 R 进程可以与之通信。它更进一步:您应该调用sourceCppvia clusterApply,否则不同的 R 进程将没有 C++ 函数首先调用。替代方案是构建一个包。在您的情况下, C++ 中的并行化(通过 RcppParallel、OpenMP 或std::thread)是不可能的,因为您想从 C++ 回调到 R。顺便说一句,如果可能的话,我会尝试摆脱这些回调。

虽然您的第一种方法原则上应该有效,但尚不清楚您是否会获得很多性能提升,因为并行计算有其自己的一组警告(内存消耗、通信开销......)

于 2019-05-20T18:43:51.730 回答