Hi Asis, On 24 May 2013 at 11:10, Asis Hallab wrote: | Dear R experts, | | recently I started developing a Rcpp package "OpenMPTest". | Within that package I want to use OpenMP, as in the following code example: | | // header file | #include <omp.h> | using namespace Rcpp ; | RcppExport SEXP testOpenMP( SEXP nThreads ) ; | | // cpp file | SEXP testOpenMP( SEXP nThreads ) { | BEGIN_RCPP | | NumericVector numberThreads = NumericVector( nThreads ); | omp_set_num_threads( numberThreads(0) ); | #pragma omp parallel | { | // Code inside this region runs in parallel. | printf("Hello!\n"); | } | | END_RCPP | } | | As I am an absolute newbie with writing C++ extensions and have not | much understanding of the Makevars file, I am unsure what to write | into it. Currently I have: | | ## Use the R_HOME indirection to support installations of multiple R version | PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"`
This sets a value to PKG_LIBS | KG_CFLAGS = $(SHLIB_OPENMP_CXXFLAGS) [ Why KG_CLAGS? ] | PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) This _overwrites_ the previous value of PKG_LIBS. You need to have both. | ## -- compiling for OpenMP | PKG_CXXFLAGS=-fopenmp | ## | ## -- linking for OpenMP | PKG_LIBS= -fopenmp -lgomp This again overwrites. The fix is pretty simple: PKG_LIBS = $(SHLIB_OPENMP_CXXFLAGS) `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` PKG_CXXFLAGS=-fopenmp should do. | Obviously compilation fails with error: | | R CMD INSTALL OpenMPTest | Symbol not found: __ZTIN4Rcpp19index_out_of_boundsE | | With standard setup of the above Makevars I get the | Symbol not found: omp_set_num_threads | | Inline also does not work: | | fb <- 'omp_set_num_threads(10); | + #pragma omp parallel | + { Rf_PrintValue(wrap("HALLO JUPP")); } | + ' | > funk <- cxxfunction( signature(), body=fb, plugin='Rcpp' ) | | error: ‘omp_set_num_threads’ was not declared in this scope | | How do set the PKG_LIBS -and eventually other variables- to all | required values in a single statement? For example in the way it is done here: http://gallery.rcpp.org/articles/using-rcppprogress/ because sourceCpp() later expands on this initial values ("appends, not overwrites"). | Could anyone provide me with a working Makevars example, please? We long had those examples, several are on R-Forge as well. Did you even try to google 'Rcpp OpenMP'? Try PKG_CXXFLAGS="-fopenmp" PKG_LIBS=$(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -fopenmp Dirk | Help will be much appreciated! | Kind regards and have a nice weekend! | Cheers! | | ______________________________________________ | R-help@r-project.org mailing list | https://stat.ethz.ch/mailman/listinfo/r-help | PLEASE do read the posting guide http://www.R-project.org/posting-guide.html | and provide commented, minimal, self-contained, reproducible code. -- Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.