[Rd] How to safely using OpenMP pragma inside a .C() function?

Simon Urbanek simon.urbanek at r-project.org
Wed Aug 31 23:01:55 CEST 2011


Pawel,

On Aug 31, 2011, at 4:46 PM, pawelm wrote:

> I just found this (performance improvement of the "dist" function when using
> openmp):
> 
> .Internal(setMaxNumMathThreads(1)); .Internal(setNumMathThreads(1)); m <-
> matrix(rnorm(810000),900,900); system.time(d <- dist(m))
> 
>  user  system elapsed 
>  3.510   0.013   3.524 
> 
> .Internal(setMaxNumMathThreads(5)); .Internal(setNumMathThreads(5)); m <-
> matrix(rnorm(810000),900,900); system.time(d <- dist(m));
> 
>   user  system elapsed 
>  3.536   0.007   1.321 
> 
> Works great! Just the question stays if it's a good practice to use
> "R_num_math_threads" in external packages?
> 

Normally you don't need to mess with all this and I would recommend not to do so. The R internals use a different strategy since they need to cope with the fall-back case, but packages should not worry about that. The default number of threads is defined by the OMP_NUM_THREADS environment variable and that is the documented way in OpenMP, so my recommendation would be to not mess with num_threads() which is precisely why I did not use it in the example I gave you.

That said, R-devel has new facilities for parallelization so things may change in the future.

Cheers,
Simon



More information about the R-devel mailing list