[Rd] How to safely using OpenMP pragma inside a .C() function?
Michael Lachmann
lachmann at eva.mpg.de
Thu Sep 1 17:52:05 CEST 2011
This is probably obvious, but I just wanted to say that it should be possible to turn off multithreading even when on a machine with multiple cores.
Reasons could be because you run in a cluster, and are given just one core for yourself.
Or, if you have a setup with trivial parallelization (i.e. you run almost the same task 100 times), where getting a speedup of 100 fold on 100 cores is easy, and multithreading would slow you down.
Michael
On 1 Sep 2011, at 8:34AM, Prof Brian Ripley wrote:
> Note that currently R internals do not actually use multiple threads in OpenMP, and there is no documented way to make them do so.
>
> The main issue is that there is insufficient knowlege of where they are worthwhile (which is both OS and platform-dependent: we don't even have reliable cross-platform ways to decide a reasonable number of threads, and the number of virtual cores on a multi-user platform definitely is not reasonable). Luke Tierney reported that the crossover point for a speed-up on Mac OS X was much larger matrices than on Linux, for example, and there is currently no OpenMP support in the Windows toolchain.
>
> The current implementation is a trial: there are more places planned to use OpenMP as and when the uncertainties are resolved.
>
> This will change at some point: given the current instability in thread support in the MinGW-w64 project this may or may not be before R 2.14.0.
>
> On Wed, 31 Aug 2011, Simon Urbanek wrote:
>
>> Pawel,
>>
>> On Aug 31, 2011, at 4:46 PM, pawelm wrote:
>>
>>> I just found this (performance improvement of the "dist" function when using
>>> openmp):
>
> You failed to describe the platform! See the posting guide (which asked you to do so 'at a minimum').
>
>>> .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?
>
> Most definitely not: it is never good practice to use undocumented non-API variables. See 'Writing R Extensions'.
>
>> 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.
>
> I'd be cautious there. OMP_NUM_THREADS affects all the OpenMP code in the R session, and possibly others which use it (some parallel BLAS do too).
>
>>
>> That said, R-devel has new facilities for parallelization so things may change in the future.
>>
>> Cheers,
>> Simon
>
> --
> Brian D. Ripley, ripley at stats.ox.ac.uk
> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
> University of Oxford, Tel: +44 1865 272861 (self)
> 1 South Parks Road, +44 1865 272866 (PA)
> Oxford OX1 3TG, UK Fax: +44 1865 272595
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
>
More information about the R-devel
mailing list