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@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@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@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@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@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@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@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@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 | e...@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 | bra...@mit.edu | 617-253-3436 | | -- Dirk Eddelbuettel | e...@debian.org | http://dirk.eddelbuettel.com _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel