I was a bit surprised to find that there's no ATLAS in the standard Arch repositories (it is in AUR though), so here's how to build some of the more common math libraries for yourself:
ATLAS
pacman -S wget base-devel gcc-fortran cpupower sudo systemctl enable cpupower
To build ATLAS you should set the governor for your CPU to performance to get the best optimization:
cpupower frequency-set -g performance sudo cp /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
Basically copy the scaling_governor to all cpus (cpu0, cpu1, cpu2 ...) as shown in the last line above. When you set the governor back to e.g. ondemand, follow the same steps.
sudo mkdir /opt/ATLAS chown ${USER} /opt/ATLAS mkdir -p ~/tmp/atlas cd ~/tmp/atlas wget http://www.netlib.org/lapack/lapack-3.4.2.tgz wget http://downloads.sourceforge.net/project/math-atlas/Stable/3.10.1/atlas3.10.1.tar.bz2 tar xvf atlas3.10.1.tar.bz2 mkdir build/ cd build/ ../ATLAS/./configure --prefix=/opt/ATLAS -Fa alg '-fPIC' --with-netlib-lapack-tarfile=$HOME/tmp/atlas/lapack-3.4.2.tgz --shared make make install
Simple as that. You can now change the governor back
cpupower frequency-set -g ondemand sudo cp /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor sudo cp /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor ...
netlib BLAS and lapack
pacman -S wget base-devel gcc-fortran cmake sudo mkdir /opt/netlib sudo chown $USER /opt/netlib mkdir /opt/netlib/blas/lib -p mkdir -p ~/tmp/blas cd ~/tmp/blas wget http://www.netlib.org/blas/blas.tgz tar xvf blas.tgz cd BLAS/
Edit make.inc
OPTS = -O3 -shared -m64 -march=native -fPIC
make all gfortran -shared -Wl,-soname,libnetblas.so -o libblas.so.1.0.1 *.o -lc ln -s libblas.so.1.0.1 libnetblas.so cp lib*blas* /opt/netlib/blas/lib cd ../ wget http://www.netlib.org/lapack/lapack-3.4.2.tgz tar xvf lapack-3.4.2.tgz mkdir /opt/netlib/lapack mkdir build/ cd build/ ccmake ../lapack-3.4.2/ -DCMAKE_INSTALL_PREFIX=/opt/netlib/lapack -DBUILD_SHARED_LIBS=ON -DUSE_OPTIMIZED_BLAS=ON
Hit c twice to configure, then g to generate.
Edit CMakeCache.txt and add the following lines at the beginning:
######################## # EXTERNAL cache entries ######################## BLAS_FOUND:STRING=TRUE BLAS_GENERIC_FOUND:BOOL=TRUE BLAS_GENERIC_blas_LIBRARY:FILEPATH=/opt/netlib/blas/lib/libnetblas.so BLAS_LIBRARIES:PATH=/opt/netlib/blas/lib/libnetblas.so
Do
ccmake ../lapack-3.4.2/
again, then hit c once, then g.
Next,
make make install
Done.
Openblas
Copied from here: http://verahill.blogspot.com.au/2013/02/334-compiling-nwchem-with-openmpi-and.html
Download from http://github.com/xianyi/OpenBLAS/tarball/v0.1.1
pacman -S wget base-devel gcc-fortran sudo mkdir /opt/openblas sudo chown $USER /opt/openblas tar xvf xianyi-OpenBLAS-v0.1.1-0-g5b7f443.tar.gz cd xianyi-OpenBLAS-e6e87a2/ make all BINARY=64 CC=/usr/bin/gcc FC=/usr/bin/gfortran USE_THREAD=0 INTERFACE64=1 1> make.log 2>make.err make PREFIX=/opt/openblas install cp lib*.* /opt/openblas/lib
Regarding openblas, I followed these instructions but when I type sudo update-alternatives --config libblas.so.3 there is no sign of the new openblas. I.e. my system is still using the reference blas. Any help?
ReplyDeleteNot sure what you mean. If you compile your own version of blas it won't automatically show up under update-alternatives
DeleteI followed your blas compilation and am having some trouble linking to the libraries. I've done this on Windows, so assume it would be similar in g++ (declare the blas prototype as an external function, call the blas function inside your code, and compile while linking the library). For example:
ReplyDelete1. Matrix multiply prototype - extern void dgemm_(char*, char*, int*, int*,int*, double*, double*, int*, double*, int*, double*, double*, int*);
2. Function call - dgemm_(&t1, &t2, &m, &n, &n, &fac1, A, &m, B, &m, &fac2, C, &m);
3. Compile command - g++ -Wall main.cpp /opt/netlib/blas/lib/libnetblas.so -o main
However, g++ is unable to find the blas library: "undefined reference to 'dgemm_ ....... collect2: error: ld returned 1 exit status"
Am I linking the blas library correctly or is something else wrong? Thanks in advance!
Is it possible that you could make a post about how to compile this for g++ instead of gcc? I can immediatley see that the .inc file for lapack is set to CC=/usr/bin/gcc. I imagine I would have to change this to the g++ compiler, in addition to a whole slew of other changes.
ReplyDeleteAlso: your blog is SUPER useful for those of us moving from MATLAB to Linux. Thanks a million!