[Rcpp-devel] OpenMp and IntegerVector

Dirk Eddelbuettel edd at debian.org
Tue Mar 11 20:56:25 CET 2014


Andreas,

On 11 March 2014 at 20:30, Andreas Prescher wrote:
| Hello,
| 
| I got strange behaviour when using
| OpenMp and IntegerVector (without
| OpenMp all works fine!!)
| 
|  From my package (Rcpp 0.10.4 used, let some unimportant
| arguments out)
| 
| Rcpp::List PsiMinRContainer::parInit(const Rcpp::List& seedList)
| {
| 	Rcpp::List resultList(m_psiMinRVec.size() - 1);
| 	Rcpp::IntegerVector seedVec(seedList[0]);
| 	
| 	#pragma omp parallel for
| 	for(int i=1; i < m_psiMinRVec.size(); i++) {
| 		resultList[i - 1] = m_psiMinRVec[i]->init(seedVec);
| 	}

I would recommend being more careful / paranoid here and make sure that
within the '#pragma omp parallel loop' you do NOT use a single R variable,
and you shoult NOT use the R random number generator.

OpenMP is by design multithreaded. R is very famously not set up for that.
By calling back into R, you set yourself up for trouble,

Just accessing / setting data structures should work (but test first...),
RNGs is clearly asking for trouble.

In short, for OpenMP use plain C++ constructs. But not R. Use R and and Rcpp
to get your data to your OpemMP code portions, run those (carefully) in
vanilla C++ (or even vanilla C++11) and then return to R.

A few CRAN packages use OpenMP along with Rcpp. 

Dirk


| 	return resultList;
| }
| in a module definition file:
| 
| function( "parInit", &parInit,List::create( _["seedList"]) ),
| calling my internal pointer with psiMinRContainer->parInit(seedList)
| 
| The problem seems to be the seedVec.
| (I also tried using seedvec as pointer allocated with new)
| list created in in R:
| seeds <- list(c(1,12),c(1,2))
| parInit(seedList = seeds)
| 
| Some errors I can give:
| 
| SET_VECTOR_ELT() can only be applied to a 'list', not a 'character'
| 
| Warning: stack imbalance in '.External', 9 then 11
| Warning: stack imbalance in '{', 6 then 8
| 
| error: getCharCE have to be called for CHARSXP
| (Fehler: 'getCharCE' muss für CHARSXP aufgerufen werden)
| 
| What I found so far are hints about
| protect/unprotect in writing R-extensions (eg 
| http://www.hep.by/gnu/r-patched/r-exts/R-exts_103.html).
| 
| Any ideas?
| 
| Andreas
| 
| 
| _______________________________________________
| Rcpp-devel mailing list
| Rcpp-devel at lists.r-forge.r-project.org
| https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

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


More information about the Rcpp-devel mailing list