[Rd] invoking R function in C++ in parallel

Dirk Eddelbuettel
Sun, 01 Feb 2015 00:05:43 -0000

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