2014-03-30 79 views
1

thisRcpp落實到mvtnorm包的rmvnorm功能,我想知道我需要怎麼做才能增加它使用OpenMP的,因此可以利用多核的優勢。RCPP使用OpenMP

我雖然這應該做到這一點:

library(Rcpp) 
library(RcppArmadillo) 
library(inline) 
settings <- getPlugin("RcppArmadillo") 
settings$env$PKG_CXXFLAGS <- paste('-fopenmp', settings$env$PKG_CXXFLAGS) 
settings$env$PKG_LIBS <- paste('-fopenmp -lgomp', settings$env$PKG_LIBS) 

code <- ' 
#include <omp.h> 
using namespace Rcpp; 
int cores = 1; 
cores = as<int>(cores_); 
omp_set_num_threads(cores); 
int n = as<int>(n_); 
arma::vec mu = as<arma::vec>(mu_); 
arma::mat sigma = as<arma::mat>(sigma_); 
int ncols = sigma.n_cols; 
#pragma omp parallel for schedule(static) 
arma::mat Y = arma::randn(n, ncols); 
return wrap(arma::repmat(mu, 1, n).t() + Y * arma::chol(sigma)); 
' 

rmvnorm.rcpp <- cxxfunction(signature(n_="integer", mu_="numeric", sigma_="matrix", cores_="integer"), body=code, plugin="RcppArmadillo", settings=settings, verbose=TRUE) 

但顯然我錯了,因爲我得到這個編譯錯誤信息:

Compilation argument: 
/software/free/Linux/redhat_5_x86_64/pkgs/r_3.0.2/lib64/R/bin/R CMD SHLIB file50825babe43a.cpp 2> file50825babe43a.cpp.err.txt 
/software/free/Linux/redhat_5_x86_64/pkgs/gcc_4.5.3/bin/g++ -I/software/free/Linux/redhat_5_x86_64/pkgs/r_3.0.2/lib64/R/include -DNDEBUG -I/usr/local/include -I"/software/free/Linux/redhat_5_x86_64/pkgs/r_3.0.2/lib64/R/library/RcppArmadillo/include" -I"/software/free/Linux/redhat_5_x86_64/pkgs/r_3.0.2/lib64/R/library/Rcpp/include" -fopenmp -fpic -g -O2 -c file50825babe43a.cpp -o file50825babe43a.o 
In file included from file50825babe43a.cpp:31:0: 
/software/free/Linux/redhat_5_x86_64/pkgs/gcc_4.5.3/lib/gcc/x86_64-unknown-linux-gnu/4.5.3/include/omp.h: In function 'SEXPREC* file50825babe43a(SEXPREC*, SEXPREC*, SEXPREC*, SEXPREC*)': 
/software/free/Linux/redhat_5_x86_64/pkgs/gcc_4.5.3/lib/gcc/x86_64-unknown-linux-gnu/4.5.3/include/omp.h:56:8: error: expected unqualified-id before string constant 
file50825babe43a.cpp:35:26: error: 'omp_set_num_threads' was not declared in this scope 
file50825babe43a.cpp:41:1: error: for statement expected before 'arma' 
make: *** [file50825babe43a.o] Error 1 

ERROR(s) during compilation: source code errors or compiler configuration errors! 

。 。 。

Error in compileCode(f, code, language = language, verbose = verbose) : 
    Compilation ERROR, function(s)/method(s) not created! In file included from file50825babe43a.cpp:31:0: 
/software/free/Linux/redhat_5_x86_64/pkgs/gcc_4.5.3/lib/gcc/x86_64-unknown-linux-gnu/4.5.3/include/omp.h: In function 'SEXPREC* file50825babe43a(SEXPREC*, SEXPREC*, SEXPREC*, SEXPREC*)': 
/software/free/Linux/redhat_5_x86_64/pkgs/gcc_4.5.3/lib/gcc/x86_64-unknown-linux-gnu/4.5.3/include/omp.h:56:8: error: expected unqualified-id before string constant 
file50825babe43a.cpp:35:26: error: 'omp_set_num_threads' was not declared in this scope 
file50825babe43a.cpp:41:1: error: for statement expected before 'arma' 
make: *** [file50825babe43a.o] Error 1 

我可能會錯過一些微不足道的東西,但我不知道它是什麼。

回答

5

這已經覆蓋前:

+0

我仍然不確定我明白我做錯了什麼。當我的rcpp函數中的#include 命令被註釋掉(以及omp_set_num_threads命令和時間表(靜態)行的#pragma omp parallel)時,代碼將成功編譯。這可能是一個gcc問題? – user1701545

+2

當你可以按照我給你展示的例子,並使用新的'sourceCpp()'或'cppFunction()方法,你正在與(舊的)[inline](http://cran.rstudio.com/package=inline) '。這僅僅是將選項向編譯器/鏈接器傳遞的一個問題,但是惡魔是在細節中。 –

+1

你說得對。這是我需要擺脫的一種老習慣。謝謝! – user1701545