[R-sig-hpc] parallel and openblas

Stephen Weston stephen.b.weston at gmail.com
Wed Apr 25 16:24:14 CEST 2012

I was able to confirm that when I built R using OpenBLAS on my
Linux machine, my CPU affinity was modified right at the
beginning of the R session:

  $ grep Cpus_allowed /proc/self/status
  Cpus_allowed: ffffffff,ffffffff
  Cpus_allowed_list:    0-63
  $ bin/R
  > readLines('/proc/self/status')[32]
  [1] "Cpus_allowed:\t00000000,00000001"

I then confirmed that this causes problems for parallel packages
such as "parallel" by trying to use all six cores of my machine
using the "mclapply" function:

  > library(parallel)
  > cores <- detectCores()
  > mclapply(1:cores, function(i) repeat sqrt(3.14159), mc.cores=cores)

When I executed "top" from another window and pressed "1", it
showed that only one core was being used, and there were six R
sessions, each getting 17% of the CPU.

I also confirmed that "Cpus_allowed" was being set to the same
value for each of the workers:

  > mclapply(1:cores, function(i) readLines('/proc/self/status')[32],
  [1] "Cpus_allowed:\t00000000,00000001"

  [1] "Cpus_allowed:\t00000000,00000001"

  [1] "Cpus_allowed:\t00000000,00000001"

  [1] "Cpus_allowed:\t00000000,00000001"

  [1] "Cpus_allowed:\t00000000,00000001"

  [1] "Cpus_allowed:\t00000000,00000001"

That is definitely not what you want to see, and explains why
"mclapply" is only able to use one core.

When I rebuilt and reinstalled OpenBLAS after editing
Makefile.rule so that it contained the line:


and then restarted R, the problem went away:

  $ bin/R
  > readLines('/proc/self/status')[32]
  [1] "Cpus_allowed:\tffffffff,ffffffff"

This time when I ran "mclapply", "top" confirmed that I was
using all six cores at about 100%.

I didn't try this experiment with the older GotoBLAS2, but I
believe the results would be the same.

- Steve

On Tue, Apr 24, 2012 at 8:37 PM, Dirk Eddelbuettel <edd at debian.org> wrote:
> On 24 April 2012 at 15:45, Stephen Weston wrote:
> | There's an interesting discussion entitled "all processes run on
> | one CPU core" at:
> |
> |     https://github.com/ipython/ipython/issues/840
> |
> | Someone was experiencing a very similar problem to the one that
> | Claudia described using GotoBLAS2 with IPython and NumPy.
> | Apparently it was fixed by recompiling GotoBLAS2 with the
> | "NO_AFFINITY" parameter set to "1" in Makefile.rule, and then
> | rebuilding "NumPy".
> |
> | It seems pretty strange, but GotoBLAS2/OpenBLAS may be modifying
> | the affinity of the R process by calling sched_setaffinity() when
> | it is initialized, and that is causing the problems that Claudia
> | and Martin have seen.
> |
> | So perhaps the solution is to recompile GotoBLAS2/OpenBLAS with
> | NO_AFFINITY=1, and then rebuild R with it.
> Good discussion, but one important nit: never a need to rebuild a R (provided
> you have external / dynamically linked BLAS).
> Just restart R.
> Dirk
> --
> R/Finance 2012 Conference on May 11 and 12, 2012 at UIC in Chicago, IL
> See agenda, registration details and more at http://www.RinFinance.com

More information about the R-sig-hpc mailing list