如何使用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 */
当编译器不支持OpenMP时,将不会编译此文件。问题是如何创建一个可移植的示例,用户可以如何使用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>行的错
Rcpp::sourceCpp
为有OpenMP支持和无OpenMP支持的用户提供
具体例子
我最近在CRAN上发布了psqn包。有一个示例演示了如何在包中使用共享头。但是,在CRAN与macOS进行检查时,当IRcpp::sourceCpp
中的文件出现错误
我试图包装<代码> RCPP::SooCeCPP<代码>调用< <代码>,然后使用一个C++文件的版本,在一个不包含<代码> [RCPP::PuxIn(OpenMP)] < /C>行的错误,但是出于某些原因,代码>尝试< /COD>不与
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
的提交日志,了解多年来的历史记录。据我所知,这里没有免费的午餐。