Setting up optimized ATLAS libraries for development on Fedora 17

Fedora 17 (Beefy Miracle) provides optimized BLAS and LAPACK libraries using ATLAS. ATLAS libraries should be tuned to the machine on which they are used. However, as Fedora supports a wide variety of hardware with the same x86_64 binaries, a more complex mechanism is needed for enabling optimized ATLAS libraries. The scheme consists of installing two ATLAS packages:

  • generic package (atlas and atlas-devel) for unoptimized libraries
  • machine-specific packages (atlas-XXX and atlas-XXX-devel) for optimized libraries

The choices for optimized ATLAS packages (at the time of writing) include:

atlas-3dnow
atlas-sse
atlas-sse2
atlas-sse3

For the rest of this tutorial, we will assume that atlas-sse3.x86_64 is the best match for the machine of interest. The ATLAS package can be installed using yum:

yum install atlas atlas-devel atlas-sse3 atlas-sse3-devel

Upon installing the packages, one can see the correct include directory set up:

$ alternatives --display atlas-inc
atlas-inc - status is auto.
 link currently points to /usr/include/atlas-x86_64-sse3
/usr/include/atlas-x86_64-base - priority 64
/usr/include/atlas-x86_64-sse3 - priority 68
Current `best' version is /usr/include/atlas-x86_64-sse3.

However, if compiling an application that uses blas, the linker complains that libcblas.so and friends are not found in the linker search path. For some reason, the Fedora maintainers do not provide automatic symbolic links for the compiled libraries. The fix is to manually make the alternatives visible:

alternatives --install /usr/lib64/libatlas.so atlas-lib /usr/lib64/atlas/libatlas.so 64 \
  --slave /usr/lib64/libcblas.so atlas-libcblas /usr/lib64/atlas/libcblas.so \
  --slave /usr/lib64/libclapack.so atlas-libclapack /usr/lib64/atlas/libclapack.so \
  --slave /usr/lib64/libf77blas.so atlas-libf77blas /usr/lib64/atlas/libf77blas.so \
  --slave /usr/lib64/liblapack.so atlas-liblapack /usr/lib64/atlas/liblapack.so \
  --slave /usr/lib64/libptcblas.so atlas-libptcblas /usr/lib64/atlas/libptcblas.so \
  --slave /usr/lib64/libptf77blas.so atlas-libptf77blas /usr/lib64/atlas/libptf77blas.so

alternatives --install /usr/lib64/libatlas.so atlas-lib /usr/lib64/atlas-sse3/libatlas.so 68 \
  --slave /usr/lib64/libcblas.so atlas-libcblas /usr/lib64/atlas-sse3/libcblas.so \
  --slave /usr/lib64/libclapack.so atlas-libclapack /usr/lib64/atlas-sse3/libclapack.so \
  --slave /usr/lib64/libf77blas.so atlas-libf77blas /usr/lib64/atlas-sse3/libf77blas.so \
  --slave /usr/lib64/liblapack.so atlas-liblapack /usr/lib64/atlas-sse3/liblapack.so \
  --slave /usr/lib64/libptcblas.so atlas-libptcblas /usr/lib64/atlas-sse3/libptcblas.so \
  --slave /usr/lib64/libptf77blas.so atlas-libptf77blas /usr/lib64/atlas-sse3/libptf77blas.so

Note that root permissions are required to issue the commands above. For an i686 machine which uses a different optimized ATLAS package, you will need to modify the library path to lib (replacing lib64) and will also need to pick the correct library directory names, e.g., via

rpm -ql atlas-devel atlas-XXX-devel

Now, the choice of the ATLAS library packages can be configured easily:

$ alternatives --display atlas-lib
atlas-lib - status is auto.
 link currently points to /usr/lib64/atlas-sse3/libatlas.so
/usr/lib64/atlas/libatlas.so - priority 64
 slave atlas-libcblas: /usr/lib64/atlas/libcblas.so
 slave atlas-libclapack: /usr/lib64/atlas/libclapack.so
 slave atlas-libf77blas: /usr/lib64/atlas/libf77blas.so
 slave atlas-liblapack: /usr/lib64/atlas/liblapack.so
 slave atlas-libptcblas: /usr/lib64/atlas/libptcblas.so
 slave atlas-libptf77blas: /usr/lib64/atlas/libptf77blas.so
/usr/lib64/atlas-sse3/libatlas.so - priority 68
 slave atlas-libcblas: /usr/lib64/atlas-sse3/libcblas.so
 slave atlas-libclapack: /usr/lib64/atlas-sse3/libclapack.so
 slave atlas-libf77blas: /usr/lib64/atlas-sse3/libf77blas.so
 slave atlas-liblapack: /usr/lib64/atlas-sse3/liblapack.so
 slave atlas-libptcblas: /usr/lib64/atlas-sse3/libptcblas.so
 slave atlas-libptf77blas: /usr/lib64/atlas-sse3/libptf77blas.so
Current `best' version is /usr/lib64/atlas-sse3/libatlas.so.

We have opted to keep the same priority values (64 and 68 in the example above) that the Fedora maintainers used for atlas-inc; we recommend that you do the same.

Comments

Comments powered by Disqus