如何使用Rcpp::plugins(openmp)制作一个可移植文件,它可以是Rcpp::sourceCpp';预计起飞时间 作为一个简单的可能的内存绑定,例如,假设我正在查看这个C++文件,我想 RCPP::SooCeCPP: #include <Rcpp.h> // [[Rcpp::plugins(openmp)]] // [[Rcpp::export(rng = false)]] double sum_par(Rcpp::NumericVector x, int n_threads){ double out(0.); double *xp = &x[0]; int const nx = x.size(); #ifdef _OPENMP #pragma omp parallel for num_threads(n_threads) reduction(+:out) #endif for(int i = 0; i < nx; ++i) out += xp[i]; return out; } /*** R set.seed(1) x <- rnorm(100) sum (x) #R> [1] 10.88874 sum_par(x, 1L) #R> [1] 10.88874 sum_par(x, 2L) #R> [1] 10.88874 */ #包括 //[[Rcpp::插件(openmp)]] //[[Rcpp::导出(rng=false)]] 双和(Rcpp::数值向量x,整数n_线程){ 双倍输出(0); 双精度*xp=&x[0]; int const nx=x.size(); #ifdef\u OPENMP #pragma omp parallel用于num_线程(n_线程)缩减(+:out) #恩迪夫 对于(int i=0;i [1]10.88874 总面值(x,2L) #R> [1]10.88874 */

如何使用Rcpp::plugins(openmp)制作一个可移植文件,它可以是Rcpp::sourceCpp';预计起飞时间 作为一个简单的可能的内存绑定,例如,假设我正在查看这个C++文件,我想 RCPP::SooCeCPP: #include <Rcpp.h> // [[Rcpp::plugins(openmp)]] // [[Rcpp::export(rng = false)]] double sum_par(Rcpp::NumericVector x, int n_threads){ double out(0.); double *xp = &x[0]; int const nx = x.size(); #ifdef _OPENMP #pragma omp parallel for num_threads(n_threads) reduction(+:out) #endif for(int i = 0; i < nx; ++i) out += xp[i]; return out; } /*** R set.seed(1) x <- rnorm(100) sum (x) #R> [1] 10.88874 sum_par(x, 1L) #R> [1] 10.88874 sum_par(x, 2L) #R> [1] 10.88874 */ #包括 //[[Rcpp::插件(openmp)]] //[[Rcpp::导出(rng=false)]] 双和(Rcpp::数值向量x,整数n_线程){ 双倍输出(0); 双精度*xp=&x[0]; int const nx=x.size(); #ifdef\u OPENMP #pragma omp parallel用于num_线程(n_线程)缩减(+:out) #恩迪夫 对于(int i=0;i [1]10.88874 总面值(x,2L) #R> [1]10.88874 */,r,openmp,rcpp,r-package,R,Openmp,Rcpp,R Package,当编译器不支持OpenMP时,将不会编译此文件。问题是如何创建一个可移植的示例,用户可以Rcpp::sourceCpp为有OpenMP支持和无OpenMP支持的用户提供 具体例子 我最近在CRAN上发布了psqn包。有一个示例演示了如何在包中使用共享头。但是,在CRAN与macOS进行检查时,当IRcpp::sourceCpp中的文件出现错误 我试图包装 RCPP::SooCeCPP调用< ,然后使用一个C++文件的版本,在一个不包含 [RCPP::PuxIn(OpenMP)] < /C>行的错

当编译器不支持OpenMP时,将不会编译此文件。问题是如何创建一个可移植的示例,用户可以
Rcpp::sourceCpp
为有OpenMP支持和无OpenMP支持的用户提供

具体例子 我最近在CRAN上发布了psqn包。有一个示例演示了如何在包中使用共享头。但是,在CRAN与macOS进行检查时,当I
Rcpp::sourceCpp
中的文件出现错误


我试图包装<代码> RCPP::SooCeCPP<代码>调用< <代码>,然后使用一个C++文件的版本,在一个不包含<代码> [RCPP::PuxIn(OpenMP)] < /C>行的错误,但是出于某些原因,代码>尝试< /COD>不与RCP::SooCeCPP一起工作。我想我可以像RcppArmadillo一样制作一个配置文件,但我以前从未(成功地)用R包完成过这项工作。

您可能需要编写一个通用版本的
sourceCpp()
,下面有一个通用的
R CMD COMPILE
等。据我所知,R通过依赖(可能是空的)
Make
变量
SHLIB\u OPENMP\u CFLAGS
SHLIB\u OPENMP\u cxflags
SHLIB\u OPENMP\u FFLAGS
,或者简化它,并在macOS上使示例为“空”。macOS的设置问题,特别是与OpenMP相关的问题,都有很好的文档记录。Rcpp团队在这方面完全无能为力。悲哀地我们也喜欢OpenMP。是的,我认为可以使用
SHLIB\u OpenMP\u cxflags
make变量。最简单的方法就是在macOS上使用
testthat::skip_if
。我确信您已经考虑过
sourceCpp
的行为,但是您不能在软件包安装时检查OpenMP是否可用。如果它不存在并且不知道后端的详细信息,那么您是否可以忽略
Rcpp::plugins(openmp)
,可能会显示一条消息,说明它不存在openmp?这可能更像是使用CRAN软件包的体验。不过,我相信对于当前的行为有很好的理由!我们用六种不同的方式做这些事情,它们几乎总是以微妙的形式出现。请参阅RcppArmadillo的
configure.ac
的提交日志,了解多年来的历史记录。据我所知,这里没有免费的午餐。