我有一个R脚本,该脚本通过sourceCpp("prog.cpp")
编译C ++代码,然后调用从go
导出的函数prog.cpp
。然后,此C ++代码对R进行了很多调用,并且(经过相当长的时间)最终返回了结果。
我认为我应该开始利用我的笔记本电脑具有4核的事实。我想并行处理。但是,在遇到意想不到的问题之前,请问支持什么,不支持什么?
可以通过几种方式来完成任务:
clusterApply
。然后,clusterApplied
函数将调用此C ++函数,这意味着该函数将在R中被调用4次。平行。
prog.cpp
使用的全局变量会出现在4个独立的实例中还是仅出现在一个实例中? (不要对我投掷石块……我知道应该最好避免使用全局变量)sourceCpp("prog.cpp")
内部调用clusterApply
会有所帮助吗? (与go
返回所需的时间相比,编译时间可以忽略不计)go
一次(正如我现在所做的那样),并且{ {3}}?
我用Google搜索了,我知道存在RcppParallel这样的东西。但是,引用他们的create 4 threads inside the C++ code:
API限制
在并行工作程序中编写的代码不应以任何方式调用R或Rcpp API。
那我想我不能使用RcppParallel,因为正如我所说,我的C ++代码多次调用R(并且这些调用所花费的时间与C ++所花费的时间相当,所以我会很早地希望将它们并行化;因为clusterApply
会允许我。
答案 0 :(得分:2)
使用clusterApply
时,实际上(在您的情况下)使用4个不同的R进程。因此,是的,C ++函数,任何全局变量等将是分开的。即使从C ++调用R也很安全,因为每个C ++函数都有自己的R进程可以进行通信。更进一步:您应该通过sourceCpp
来调用clusterApply
,因为否则,不同的R进程将首先没有C ++函数来调用。替代方法是构建一个程序包。在您的情况下,无法在C ++中进行并行化(通过RcppParallel,OpenMP或std::thread
),因为您想从C ++回调到R。顺便说一句,如果可能的话,我会尽量消除这些回调。
虽然您的第一种方法原则上应该可以工作,但是由于并行计算带有它自己的一组警告(内存消耗,通信开销...),因此尚不清楚您是否会获得很大的性能提升