[Rcpp-devel] OpenMP and Rcpp - compiler error

Dirk Eddelbuettel edd at debian.org
Thu Mar 24 23:15:48 CET 2011



On 24 March 2011 at 17:50, Michael Braun wrote:
| Dirk:
| 
| This does work when I use the Intel compiler, so perhaps you are right.  I am, however, using the standard Apple-provided version, which is 4.2.1. 
| 
| I suspect there is a related issue in how OpenMP handles private Rcpp objects in a parallel section.  For example, if I declare
| 
| NumericVector X;
| 
| #pragma omp parallel (private X)
| {
| #pragma omp for
| for (i=0; i<n; i++) {
| 	// some code that uses X
| 
| }
| }
| 
| then I would have thought that the compiler would create an instance of X for each thread.  Instead, I am getting memory segfaults even with the Intel compiler, and I wonder if these two issues are related (i.e., perhaps the compielr doesn't know what to do with code like this, and hence the error).

There should never be a segfault.  Even is copies are made (which would be
shallow, deep copies require clone) I fail to see how that would great out of
bounds access.  Maybe there are other issue with the Intel compiler and Rcpp so
maybe you could try a full 'R CMD check Rcpp_0.9.2.tar.gz' for it?
 
| Could I be on track, or way off base?

I don't not know but fear the latter.  Anyway, as I had already compiled your
example earlier (as shown in the quoted text below):

edd at max:/tmp$ cat michael.cpp 

#include <Rcpp.h>

RcppExport SEXP omptest (SEXP X) {

  BEGIN_RCPP

 Rcpp::NumericVector Y = X;
 int n = Y.size();
 Rcpp::NumericVector Z(n);
 int i;
 double a;
 
#pragma omp parallel
 {
#pragma omp for
 for (i=0; i<n; i++) {
   a = sqrt(Y(i));
   Z(i) = a;
 }
 }
 return Z;

 END_RCPP

}
edd at max:/tmp$ R --quiet
R> dyn.load("michael.so")
R> .Call("omptest", 1:10)
 [1] 1.00000 1.41421 2.64575 2.00000 2.64575 2.44949 2.64575 2.82843 3.00000 3.16228
R> q()
Save workspace image? [y/n/c]: n
edd at max:/tmp$ 

So still no issue here....

Dirk

| 
| Thanks,
| 
| Michael
| 
| 
| 
| 
| On Mar 24, 2011, at 1:03 PM, Dirk Eddelbuettel wrote:
| 
| > 
| > Michael,
| > 
| > As a quick off-the-cuff remark, I suspect it is your compiler. I have done
| > quite a few builds with OpenMP when experimenting with a parallel version of
| > RcppDE (the differential evolution optimisation I "ported" from C to
| > C++/Rcpp).  I had no issues building this (but issues getting replicable
| > streams going which is still unsolved though I have some tests working).
| > 
| > The incomplete RcppParDE fragment is actually in Rcpp's SVN and there I
| > simply do 
| > 
| > ## Hey Emacs make this a -*- mode: makefile; -*- file 
| > ##
| > ## -- compiling for OpenMP 
| > PKG_CXXFLAGS=-fopenmp
| > ##
| > ## -- linking for OpenMP
| > #PKG_LIBS= -fopenmp -lgomp $(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
| > ##
| > ## -- linking for OpenMP and Google Perftools profiling
| > PKG_LIBS= -fopenmp -lgomp $(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) -lprofiler
| > 
| > and that is all it takes to deploy OpenMP with R and Rcpp on my Linux box:
| > 
| > edd at max:~/svn/rcpp/pkg/RcppParDE$ R CMD INSTALL .
| > * installing to library ‘/usr/local/lib/R/site-library’
| > * installing *source* package ‘RcppParDE’ ...
| > ** libs
| > ccache g++ -I/usr/share/R/include   -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include"  -fopenmp -fpic  -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros  -c deoptim.cpp -o deoptim.o
| > ccache g++ -I/usr/share/R/include   -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include"  -fopenmp -fpic  -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros  -c devol.cpp -o devol.o
| > ccache g++ -I/usr/share/R/include   -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include"  -fopenmp -fpic  -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros  -c permute.cpp -o permute.o
| > g++ -shared -o RcppParDE.so deoptim.o devol.o permute.o -fopenmp -lgomp -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib -llapack -lblas -lgfortran -lm -lprofiler -L/usr/lib64/R/lib -lR
| > installing to /usr/local/lib/R/site-library/RcppParDE/libs
| > ** R
| > ** preparing package for lazy loading
| > ** help
| > *** installing help indices
| > ** building package indices ...
| > ** testing if installed package can be loaded
| > 
| > * DONE (RcppParDE)
| > edd at max:~/svn/rcpp/pkg/RcppParDE$ 
| > 
| > Now this packages has run-time issue, and my recent test code is somewhere so
| > take the package for a working package -- but it does prove that OpenMP can
| > easily be thrown in the mix on suitable systems.
| > 
| > And what "suitable systems" are is an open question. We know Rtools for
| > Windows does not include the libgomp library needed.  Maybe OS X is not
| > suitable either in that version?
| > 
| > Your file certainly builds here:
| > 
| > edd at max:/tmp$ cat michael.cpp 
| > 
| > #include <Rcpp.h>
| > 
| > RcppExport SEXP omptest (SEXP X) {
| > 
| >  BEGIN_RCPP
| > 
| > Rcpp::NumericVector Y = X;
| > int n = Y.size();
| > Rcpp::NumericVector Z(n);
| > int i;
| > double a;
| > 
| > #pragma omp parallel
| > {
| > #pragma omp for
| > for (i=0; i<n; i++) {
| >   a = sqrt(Y(i));
| >   Z(i) = a;
| > }
| > }
| > return Z;
| > 
| > END_RCPP
| > 
| > }
| > edd at max:/tmp$ PKG_LIBS="-fopenmp -lgomp -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib -llapack -lblas -lgfortran -lm -L/usr/lib64/R/lib -lR" PKG_CXXFLAGS="-I/usr/share/R/include   -I"/usr/local/lib/R/site-library/Rcpp/include" -I"/usr/local/lib/R/site-library/RcppArmadillo/include"  -fopenmp -fpic  -g -O3 -Wall -pipe -pedantic" R CMD SHLIB michael.cpp
| > ccache g++ -I/usr/share/R/include     -I/usr/share/R/include   -I/usr/local/lib/R/site-library/Rcpp/include -I/usr/local/lib/R/site-library/RcppArmadillo/include  -fopenmp -fpic  -g -O3 -Wall -pipe -pedantic -fpic  -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros  -c michael.cpp -o michael.o
| > g++ -shared -o michael.so michael.o -fopenmp -lgomp -L/usr/local/lib/R/site-library/Rcpp/lib -lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib -llapack -lblas -lgfortran -lm -L/usr/lib64/R/lib -lR -L/usr/lib64/R/lib -lR
| > edd at max:/tmp$ 
| > 
| > I am using g++ 4.4 (and sometimes 4.5), current R 2.12.2, current Rcpp 0.9.2.
| > 
| > Regards, Dirk
| > 
| > 
| > 
| > 
| > -- 
| > Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
| 
| -------------------------------------------
| Michael Braun
| Homer A. Burnell (1928) Career Development Professor, 
| 	and Assistant Professor of Management Science (Marketing Group)
| MIT Sloan School of Management
| 100 Main St.., E62-535
| Cambridge, MA 02139
| braunm at mit.edu
| 617-253-3436
| 
| 

-- 
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com


More information about the Rcpp-devel mailing list