是否允许/可能在 Rcpp 中的 pragma openmp 并行 for 循环中调用 R 函数或 fortran 代码?

Tom*_*ers 4 r openmp spline rcpp quantile-regression

在 Rcpp 项目中,我希望能够调用 R 函数(包中的cobs函数cobs进行凹样条拟合)或调用它所依赖的fortran 代码cobs(该函数使用quantregrq.fit.sfnc函数来拟合约束样条模型,该模型又依赖于包中的 fortran 编码的srqfnc函数)在编译指示 openmp 并行 for 循环中(我的代码的其余部分主要需要一些简单的线性代数,所以这不会有问题,但是遗憾的是,每个内部循环迭代还需要我进行凹样条拟合)。我想知道这是否被允许或可能,因为我认为此类调用不是线程安全的?是否有一个简单的解决方案,比如用 包围这些调用?有人有这方面的例子吗?或者在这种情况下唯一的方法是首先使用线程安全的犰狳类来完成&函数的完整移植?quantreg#pragma omp criticalRcppcobsrq.fit.sfnc

Ral*_*ner 5

引用手册

\n\n
\n

从线程代码调用任何 R API 都是 \xe2\x80\x98(仅限专家)\xe2\x80\x99,强烈建议不要这样做。R API 中的许多函数都会修改内部 R 数据结构,如果从多个线程同时调用,可能会损坏这些数据结构。大多数 R API 函数都可以发出错误信号,这只能发生在 R 主线程上。此外,外部库(例如 LAPACK)可能不是线程安全的。

\n
\n\n

我一直将此解释为“不得从线程代码中调用 R API 函数”。无论内部使用什么,从 omp 并行区域内部调用 R 函数就是这样。使用#pragma omp critical 可能有用,但如果它坏了,你必须保留碎片......

\n\n

重新实现相关代码或在 C++/C/Fortran 中查找现有实现并直接调用会更安全。

\n