Skip to content

R and ATLAS

6 messages · Jonathan Greenberg, Peter Langfelder, Dirk Eddelbuettel

#
Rhelpers:

I recently installed the 64-bit version of R on my Debian system, and
afterwards was asked if it was compiled using ATLAS.  Is there a way
to test to see if R is using ATLAS?

--j
#
If you didn't specify an external BLAS when you ran R configure
script, you are not using ATLAS. If you're not sure and you still have
the output of the configure script, at the end it'll say whether it
uses an external BLAS.

Alternatively, you may also want to generate two random 5000x5000
matrices and do their multiplication

a = matrix(rnorm(5000*5000), 5000, 5000)
b = matrix(rnorm(5000*5000), 5000, 5000)
c = a%*%b

While the calculation is running, in a separate terminal, run top and
watch how much CPU R takes. AFAIK standard installation of R is single
threaded and will only use one CPU (up to 100%). ATLAS is
multithreaded and (unless you configured it otherwise) it will use all
available processors, so if you have a 4-core machine, you will see
CPU usage of nearly 400%. Note though that this will not discriminate
ATLAS from other multi-threaded BLASes.

HTH,

Peter


On Wed, May 26, 2010 at 2:16 PM, Jonathan Greenberg
<greenberg at ucdavis.edu> wrote:
#
Jonathan,

That would have been a good question for the r-sig-debian list ...
On 26 May 2010 at 14:16, Jonathan Greenberg wrote:
| Rhelpers:
| 
| I recently installed the 64-bit version of R on my Debian system, and
| afterwards was asked if it was compiled using ATLAS.  Is there a way
| to test to see if R is using ATLAS?

Atlas is one (accelerated, tuned) implementation of an interface called Blas.
R is built with support for whichever Blas you have -- which could be Atlas
or non-free alternative such as Goto or Intel MKL, or it could be the slower
'reference blas'.

If you also install the r-base-dev package (recommended if you build package)
you will get headers and libraries for Blas, with the Atlas package being the
default.

Lastly, on Linux, you can check which libraries are used via the ldd tool. On
my (32bit) system:

edd at ron:~> ldd /usr/lib/R/bin/exec/R 
	linux-gate.so.1 =>  (0xb786c000)
	libR.so => /usr/lib/libR.so (0xb7530000)
	libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb73e9000)
	libblas.so.3gf => /usr/lib/atlas/libblas.so.3gf (0xb706d000)
	libgfortran.so.3 => /usr/lib/libgfortran.so.3 (0xb6fa8000)
	libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb6f82000)
	libreadline.so.6 => /lib/libreadline.so.6 (0xb6f4d000)
	libpcre.so.3 => /lib/libpcre.so.3 (0xb6f1d000)
	libbz2.so.1.0 => /lib/libbz2.so.1.0 (0xb6f0c000)
	libz.so.1 => /usr/lib/libz.so.1 (0xb6ef7000)
	libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb6ef3000)
	/lib/ld-linux.so.2 (0xb786d000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6ed5000)
	libncurses.so.5 => /lib/libncurses.so.5 (0xb6e9b000)
edd at ron:~> 

and you notice in the fourth line how the linker fills in the libblas.so.3gf
from Atlas for libblas, eg the Blas library needed here.  Similar output can
be generated for /usr/lib/R/modules/lapack.so showing that Atlas also
provides tuned Lapack libraries.

Hope this helps.  The R Install + Admin manual has more detail.
#
Peter and Dirk:

Thanks for the quick response -- I'm trying to get multiple CPU
responses as Peter indicated should happen, but those R commands only
illicit a single CPU response.

When I check the libraries:

ldd /usr/lib/R/bin/exec/R
	linux-vdso.so.1 =>  (0x00007fffd05ff000)
	libR.so => /usr/lib/R/lib/libR.so (0x00007f5f3b667000)
	libc.so.6 => /lib/libc.so.6 (0x00007f5f3b313000)
	libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f5f3a7fe000)
	libgfortran.so.3 => /usr/lib/libgfortran.so.3 (0x00007f5f3a512000)
	libm.so.6 => /lib/libm.so.6 (0x00007f5f3a290000)
	libreadline.so.6 => /lib/libreadline.so.6 (0x00007f5f3a04b000)
	libpcre.so.3 => /lib/libpcre.so.3 (0x00007f5f39e1c000)
	libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x00007f5f39c0c000)
	libz.so.1 => /usr/lib/libz.so.1 (0x00007f5f399f4000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007f5f397f0000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f5f3bbec000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f5f395da000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007f5f393bd000)
	libncurses.so.5 => /lib/libncurses.so.5 (0x00007f5f39177000)

Following /usr/lib/libblas.so.3gf :
ls -l /usr/lib/libblas.so.3gf
/usr/lib/libblas.so.3gf -> /etc/alternatives/libblas.so.3gf

And again following this:
ls -l /etc/alternatives/libblas.so.3gf
/etc/alternatives/libblas.so.3gf -> /usr/lib/atlas-base/atlas/libblas.so.3gf

So it appears to be properly linked to Atlas.  Note that I got this
same response from both the binary install of r-base (apt-get install
r-base) and the source build of r-base-dev (apt-get source -b
r-base-dev).  Also, I did a "tuned" install of ATLAS 3.8.3 using:

apt-get source atlas -t unstable
cd atlas-3.8.3
DEFAULTS=n fakeroot debian/rules custom

I did notice during the VERY long compilation that it seemed to
correctly identify that I have 4 CPUs.

Can someone confirm that the test:

a = matrix(rnorm(5000*5000), 5000, 5000)
b = matrix(rnorm(5000*5000), 5000, 5000)
c = a%*%b

Should illicit a multi-CPU response with R/ATLAS?  If so, any
suggestions on how to tweak my install to get it working?  Thanks!

--j

On Wed, May 26, 2010 at 3:17 PM, Peter Langfelder
<peter.langfelder at gmail.com> wrote:
#
My R with Atlas configured to use 4 cores uses 4 cores. Note however
that you only get the 4 cores for the actual multiplication, not the
matrix generation.

I'm probably several years behind the curve, but my experience is that
if you download source R and do the standard

./configure
make
make install

sequence, R will not use an external BLAS. The manual basically states as much:

The linear algebra routines in R can make use of enhanced BLAS (Basic
Linear Algebra Subprograms, http://www.netlib.org/blas/faq.html)
routines. However, these have to be explicitly requested at configure
time: R provides an internal BLAS which is well-tested and will be
adequate for most uses of R.

Unless the manual is out of date, I suspect that despite the apparent
linking of the dynamic ATLAS library R still uses its own internal,
single-threaded, BLAS.

Peter

On Wed, May 26, 2010 at 8:29 PM, Jonathan Greenberg
<greenberg at ucdavis.edu> wrote:
#
On 26 May 2010 at 20:29, Jonathan Greenberg wrote:
| Peter and Dirk:
| 
| Thanks for the quick response -- I'm trying to get multiple CPU
| responses as Peter indicated should happen, but those R commands only
| illicit a single CPU response.
| 
| When I check the libraries:
| 
| ldd /usr/lib/R/bin/exec/R
| 	linux-vdso.so.1 =>  (0x00007fffd05ff000)
| 	libR.so => /usr/lib/R/lib/libR.so (0x00007f5f3b667000)
| 	libc.so.6 => /lib/libc.so.6 (0x00007f5f3b313000)
| 	libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f5f3a7fe000)
| 	libgfortran.so.3 => /usr/lib/libgfortran.so.3 (0x00007f5f3a512000)
| 	libm.so.6 => /lib/libm.so.6 (0x00007f5f3a290000)
| 	libreadline.so.6 => /lib/libreadline.so.6 (0x00007f5f3a04b000)
| 	libpcre.so.3 => /lib/libpcre.so.3 (0x00007f5f39e1c000)
| 	libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x00007f5f39c0c000)
| 	libz.so.1 => /usr/lib/libz.so.1 (0x00007f5f399f4000)
| 	libdl.so.2 => /lib/libdl.so.2 (0x00007f5f397f0000)
| 	/lib64/ld-linux-x86-64.so.2 (0x00007f5f3bbec000)
| 	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f5f395da000)
| 	libpthread.so.0 => /lib/libpthread.so.0 (0x00007f5f393bd000)
| 	libncurses.so.5 => /lib/libncurses.so.5 (0x00007f5f39177000)
| 
| Following /usr/lib/libblas.so.3gf :
| ls -l /usr/lib/libblas.so.3gf
| /usr/lib/libblas.so.3gf -> /etc/alternatives/libblas.so.3gf
| 
| And again following this:
| ls -l /etc/alternatives/libblas.so.3gf
| /etc/alternatives/libblas.so.3gf -> /usr/lib/atlas-base/atlas/libblas.so.3gf
| 
| So it appears to be properly linked to Atlas.  Note that I got this
| same response from both the binary install of r-base (apt-get install
| r-base) and the source build of r-base-dev (apt-get source -b
| r-base-dev).  Also, I did a "tuned" install of ATLAS 3.8.3 using:
| 
| apt-get source atlas -t unstable
| cd atlas-3.8.3
| DEFAULTS=n fakeroot debian/rules custom
| 
| I did notice during the VERY long compilation that it seemed to
| correctly identify that I have 4 CPUs.
| 
| Can someone confirm that the test:
| 
| a = matrix(rnorm(5000*5000), 5000, 5000)
| b = matrix(rnorm(5000*5000), 5000, 5000)
| c = a%*%b
| 
| Should illicit a multi-CPU response with R/ATLAS?  If so, any
| suggestions on how to tweak my install to get it working?  Thanks!

I suggest that you 

  a) talk to Sylvestre, the Atlas maintainer (CC'ed), as the last time I
     checked I thought our Atlas 3.8.* package were configure to be
     single-threaded so while you did the right thing with the local tuning,
     you may have omitted another toggle to give you multi-threaded Atlas

  b) look into Goto Blas from tacc.utexas.edu and/or Intel MKLs as well.

Lastly, my preferred test is

   N <- someNumber
   a <- matrix(rnorm(N*N), ncol=N)
   n <- someOtherNumber
   summary(replicate(n,system.time(crossprod(A))[3]))

:)

Dirk

| --j
| 
| On Wed, May 26, 2010 at 3:17 PM, Peter Langfelder
| <peter.langfelder at gmail.com> wrote:
| > If you didn't specify an external BLAS when you ran R configure
| > script, you are not using ATLAS. If you're not sure and you still have
| > the output of the configure script, at the end it'll say whether it
| > uses an external BLAS.
| >
| > Alternatively, you may also want to generate two random 5000x5000
| > matrices and do their multiplication
| >
| > a = matrix(rnorm(5000*5000), 5000, 5000)
| > b = matrix(rnorm(5000*5000), 5000, 5000)
| > c = a%*%b
| >
| > While the calculation is running, in a separate terminal, run top and
| > watch how much CPU R takes. AFAIK standard installation of R is single
| > threaded and will only use one CPU (up to 100%). ATLAS is
| > multithreaded and (unless you configured it otherwise) it will use all
| > available processors, so if you have a 4-core machine, you will see
| > CPU usage of nearly 400%. Note though that this will not discriminate
| > ATLAS from other multi-threaded BLASes.
| >
| > HTH,
| >
| > Peter
| >
| >
| > On Wed, May 26, 2010 at 2:16 PM, Jonathan Greenberg
| > <greenberg at ucdavis.edu> wrote:
| >> Rhelpers:
| >>
| >> I recently installed the 64-bit version of R on my Debian system, and
| >> afterwards was asked if it was compiled using ATLAS. ?Is there a way
| >> to test to see if R is using ATLAS?
| >>
| >> --j
| >>
| >> ______________________________________________
| >> R-help at r-project.org mailing list
| >> https://stat.ethz.ch/mailman/listinfo/r-help
| >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
| >> and provide commented, minimal, self-contained, reproducible code.
| >>
| >
| > ______________________________________________
| > R-help at r-project.org mailing list
| > https://stat.ethz.ch/mailman/listinfo/r-help
| > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
| > and provide commented, minimal, self-contained, reproducible code.
| >
| 
| ______________________________________________
| R-help at r-project.org mailing list
| https://stat.ethz.ch/mailman/listinfo/r-help
| PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
| and provide commented, minimal, self-contained, reproducible code.