Hello, I'm writing an R extension in C++. In the extension, I want to invoke an R function directly and it works when I use Rcpp in the serial code. But what I really want is to invoke the R function in parallel with openmp. When I do so, I got segmentation fault. I remember someone said that R isn't thread-safe. I think it's also understandable because an R function also has environment variables. My question is: Can we make a copy of an R function (including its environment variables) for each thread? Are there any ways to invoke an R function in C/C++ in multiple threads safely? Thanks, Da
On 31 January 2015 at 18:30, Zheng Da wrote: | I'm writing an R extension in C++. In the extension, I want to invoke | an R function directly and it works when I use Rcpp in the serial | code. But what I really want is to invoke the R function in parallel | with openmp. When I do so, I got segmentation fault. | | I remember someone said that R isn't thread-safe. I think it's also | understandable because an R function also has environment variables. | | My question is: | Can we make a copy of an R function (including its environment | variables) for each thread? Nope. And you pretty much just explained why. You can - either work in something like OpenMP and run in multiple threads that remain /completely/ shielded from R, ie no R calls, and not even R data types as you cannot trigger gc() calls from different threads - or work via, say, the parallel or Rmpi packages in multiple _processes_ each of which could call its corresponding R interpreter (but that is still slower). There are some examples for OpenMP at the Rcpp Gallery: http://gallery.rcpp.org. You may also enjoy the RcppParallel package. But none of this overcomes your main hurdle: no, you cannot call R from different threads. | Are there any ways to invoke an R function in C/C++ in multiple threads safely? No. It is a design constraint. Dirk -- http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
On Sat, Jan 31, 2015 at 7:05 PM, Dirk Eddelbuettel <edd at debian.org> wrote: [...]> - either work in something like OpenMP and run in multiple threads that > remain /completely/ shielded from R, ie no R calls, and not even R data > types as you cannot trigger gc() calls from different threads >I think you can use R objects, as long as you don't call R functions on them (not even from R's C api, although some of them are currently fine) and consider them as read-only. E.g. if you have a numeric vector, you can do double *cvec = REAL(vec); and then use cvec in your thread(s). This is pretty restrictive, but could be enough in some cases. Gabor [...] [[alternative HTML version deleted]]