> Just accessing / setting data structures should work (but test first...), > RNGs is clearly asking for trouble.
FWIW, I've been able to get this working using Rcpp and C++11 threads. (but using native C++ data structures, of course) Best, -- Hao Ye [email protected] On Mar 11, 2014, at 12:56 PM, Dirk Eddelbuettel <[email protected]> wrote: > > 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 > | [email protected] > | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > > -- > Dirk Eddelbuettel | [email protected] | http://dirk.eddelbuettel.com > _______________________________________________ > Rcpp-devel mailing list > [email protected] > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel _______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
