R-使用RCPP时如何并行C 代码

r - How to parallelise C++ code when using Rcpp?

本文关键字:并行 代码 何并行 使用 RCPP      更新时间:2023-10-16

我有一个R脚本,该脚本通过sourceCpp("prog.cpp")编译C 代码,然后调用从prog.cpp导出的函数go。然后,此C 代码会给R回到R和(很长一段时间后(,然后终于返回结果。

我认为我应该开始利用笔记本电脑有4个内核的事实。我想平行于事物。但是,在遇到意外问题之前,我可能会问什么是支持的,什么是不支持的?

可以通过几种方式处理任务:

  • (如果可能的话,这是我想做的(在R中调用clusterApply。然后,clusterApplied的函数将调用此C 函数,这意味着此函数将在4次并行称为4次。
    • 该C 函数的所有4个实例都可以彼此隔离吗?
    • 特别是,prog.cpp使用的全局变量会在4个孤立的实例中或仅一个实例吗?(不要向我扔石头...我知道最好避免全球范围(
    • 当C 代码调用R函数时,我会遇到问题,然后从Cran中调用函数?
    • 如果不是:在clusterApply内部调用sourceCpp("prog.cpp")帮助吗?(与go返回所需的长时间相比,汇编时间可以忽略不计(
  • (从我阅读的内容中,这是行不通的,但无论如何,让我们询问这一点(:我可以只从R代码中调用go(就像我现在这样做一样(,并在内部创建4个线程C 代码?
    • 我注意到,即使任务在计算上很昂贵,也倾向于不执行此操作,这使我认为这样做可能不支持
    • 尤其是,当螺纹C 代码回到R时,我会遇到问题吗?(如果这很重要,则C 代码调用的R函数将从Cran中调用包装的函数(

我搜索了谷歌,我知道存在像rcppparallal这样的东西。但是,引用其主页:

API限制

您在平行工人中编写的代码不应以任何方式调用R或RCPP API。

然后我想我不能使用rcppparallal>喜欢并行化它们;因为clusterApply允许我。

使用clusterApply时,实际上正在使用(在您的情况下(4个不同的R进程。因此,是的,C 功能,任何全局变量等都将是分开的。即使从C 回电也是安全的,因为每个C 功能都有自己的R进程可以与之通信。它进一步进一步:您应该通过clusterApply调用sourceCpp,因为否则不同的R进程将不具有首先调用的C 函数。替代方案是建造一个包裹。在C 中并行化(通过RCPPPARALALE,OPENMP或std::thread(在您的情况下是不可能的,因为您想从C 回电。顺便说一句,如果可能的话,我会尽力摆脱这些呼叫。

虽然您的FIR方法原则上应起作用,但尚不清楚您将获得太多的性能增益,因为并行计算带有其自己的Cavetas集(内存消耗,通信开销...(