使用Rcpp时如何并行化C ++代码?

时间:2019-05-20 16:49:00

标签: c++ r parallel-processing rcpp rparallel

我有一个R脚本,该脚本通过sourceCpp("prog.cpp")编译C ++代码,然后调用从go导出的函数prog.cpp。然后,此C ++代码对R进行了很多调用,并且(经过相当长的时间)最终返回了结果。

我认为我应该开始利用我的笔记本电脑具有4核的事实。我想并行处理。但是,在遇到意想不到的问题之前,请问支持什么,不支持什么?

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

  • (这是我想做的,如果可能的话)在R中调用clusterApply。然后,clusterApplied函数将调用此C ++函数,这意味着该函数将在R中被调用4次。平行。
    • 此C ++函数的所有4个实例是否将彼此隔离?
    • 特别是,prog.cpp使用的全局变量会出现在4个独立的实例中还是仅出现在一个实例中? (不要对我投掷石块……我知道应该最好避免使用全局变量)
    • 当C ++代码调用R函数,然后再从CRAN的编译包中调用函数时,我会遇到问题吗?
    • 如果没有:在sourceCpp("prog.cpp")内部调用clusterApply会有所帮助吗? (与go返回所需的时间相比,编译时间可以忽略不计)
  • (从我读到的内容来看,这是行不通的,但是为了完整性起见,我们还是要问这个问题):我只能从R代码中调用go一次(正如我现在所做的那样),并且{ {3}}?
    • 我注意到CRAN的编译包往往不这样做,即使任务在计算上很昂贵-这使我想这样做可能不受支持
    • 尤其是当线程C ++代码回调到R时,我是否会遇到问题? (如果这很重要,那么C ++代码调用的R函数将从CRAN的已编译包中调用函数)

我用Google搜索了,我知道存在RcppParallel这样的东西。但是,引用他们的create 4 threads inside the C++ code

  

API限制

     

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

那我想我不能使用RcppParallel,因为正如我所说,我的C ++代码多次调用R(并且这些调用所花费的时间与C ++所花费的时间相当,所以我会很早地希望将它们并行化;因为clusterApply会允许我。

1 个答案:

答案 0 :(得分:2)

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

虽然您的第一种方法原则上应该可以工作,但是由于并行计算带有它自己的一组警告(内存消耗,通信开销...),因此尚不清楚您是否会获得很大的性能提升