我有一个 R 脚本,它通过编译 C++ 代码sourceCpp("prog.cpp")
,然后调用go
从prog.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
将允许我.