forked from fommil/netlib-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Building ppc64le natives for use in Spark MLlib
Matthew Brandyberry edited this page May 6, 2016
·
9 revisions
cd generator
# edit pom.xml to comment out maven-gpg-plugin
mvn clean compile
mvn install
cd ..
# edit native_ref/pom.xml to comment out osx-* and win-* modules
# edit native_system/pom.xml to comment out osx-* and win-* modules
mvn clean compile
mvn install
cd native_system/ppc
# ensure libgfortran, libblas and liblapack are installed.
# See below for alternative implementations.
mvn clean compile
ldd linux-ppc64le/target/netlib-native_system-linux-ppc64le.so
linux-vdso64.so.1 => (0x00003fffa0cb0000)
libgfortran.so.3 => /usr/lib/powerpc64le-linux-gnu/libgfortran.so.3 (0x00003fffa0950000)
libblas.so.3 => /usr/lib/libblas.so.3 (0x00003fffa08b0000)
liblapack.so.3 => /usr/lib/liblapack.so.3 (0x00003fffa0330000)
libc.so.6 => /lib/powerpc64le-linux-gnu/libc.so.6 (0x00003fffa0170000)
libm.so.6 => /lib/powerpc64le-linux-gnu/libm.so.6 (0x00003fffa0090000)
libgcc_s.so.1 => /lib/powerpc64le-linux-gnu/libgcc_s.so.1 (0x00003fffa0060000)
/lib64/ld64.so.2 (0x0000000049ca0000)
mvn install
cd ../../all
# edit pom.xml to comment out non-ppc native dependencies
mvn clean
mvn install
- Contents of native_system/java/target/classes
- Native library at native_system/ppc/linux-ppc64le/target/netlib-native_system-linux-ppc64le.so
- Contents of jniloader jar with ppc64le support (https://github.com/fommil/jniloader)
jar -tf native-netlib.jar
META-INF/
META-INF/MANIFEST.MF
com/
com/github/
com/github/fommil/
com/github/fommil/netlib/
com/github/fommil/netlib/NativeSystemBLAS.class
com/github/fommil/netlib/NativeSystemLAPACK.class
com/github/fommil/netlib/NativeSystemARPACK.class
com/github/fommil/jni/
com/github/fommil/jni/JniNamer.class
com/github/fommil/jni/JniLoader.class
netlib-native_system-linux-ppc64le.so
Ensure the jar is in the classpath of your spark executor(s).
Clone OpenBLAS library from https://github.com/xianyi/OpenBLAS
# install fortran compiler
apt-get install gfortran libgfortran3
# build latest release (0.2.18) in single-threaded mode
cd OpenBLAS
git checkout -b 0.2.18 v0.2.18
USE_THREAD=0 make
# Build netlib-native_system-linux-ppc64le.so for OpenBLAS
cd <path-to-netlib-java-src>/native_system/ppc
# edit linux-ppc64le/pom.xml to specify -lopenblas in place of -lblas and -llapack
# also add a "-L<library_path_to_libopenblas>" if necessary.
mvn clean compile
ldd linux-ppc64le/target/netlib-native_system-linux-ppc64le.so
linux-vdso64.so.1 => (0x00003fff894a0000)
libgfortran.so.3 => /usr/lib/powerpc64le-linux-gnu/libgfortran.so.3 (0x00003fff890f0000)
libopenblas.so.0 => <library_path>/libopenblas.so.0 (0x00003fff885d0000)
libc.so.6 => /lib/powerpc64le-linux-gnu/libc.so.6 (0x00003fff88410000)
libm.so.6 => /lib/powerpc64le-linux-gnu/libm.so.6 (0x00003fff88330000)
libgcc_s.so.1 => /lib/powerpc64le-linux-gnu/libgcc_s.so.1 (0x00003fff88300000)
libpthread.so.0 => /lib/powerpc64le-linux-gnu/libpthread.so.0 (0x00003fff882d0000)
/lib64/ld64.so.2 (0x000000004e090000)
Download ATLAS version 3.11.38. Download LAPACK version 3.6.0
# install fortran compiler
apt-get install gfortran libgfortran3 cpufrequtils
# Disable CPU throttling
NCORES=<number of physical cores>
CPUS=`for (( c=0; c<NCORES*8; c +=8 )) do printf "$c "; done`
for c in $CPUS; do echo $c; sudo cpufreq-set -c $c -g performance; done
# Build atlas library
mkdir build
cd build
<path-to-untarred-ATLAS>/configure --shared --with-netlib-lapack-tarfile=<path-to-lapack>/lapack-3.6.0.tgz -b 64 -D c -DWALL --force-tids="$NCORES $CPUS"
make
make check
cd lib
# remove '$(LIBINSTdir)/' from -soname linker option to avoid hard-coding an absolute location
vi Makefile
# build serial shared object: libsatlas.so
make shared
# build parallel shared object: libtatlas.so
make ptshared
# Build netlib-native_system-linux-ppc64le.so for ATLAS
cd <path-to-netlib-java-src>/native_system/ppc
# edit linux-ppc64le/pom.xml to specify -l[st]atlas in place of -lblas and -llapack
# also add a "-L<library_path_to_lib[st]atlas>" if necessary.
mvn clean compile
ldd linux-ppc64le/target/netlib-native_system-linux-ppc64le.so
linux-vdso64.so.1 => (0x00003fffa91a0000)
libgfortran.so.3 => /usr/lib/powerpc64le-linux-gnu/libgfortran.so.3 (0x00003fffa8e60000)
libsatlas.so => <library_path>/libsatlas.so (0x00003fffa5070000)
libc.so.6 => /lib/powerpc64le-linux-gnu/libc.so.6 (0x00003fffa4e90000)
libm.so.6 => /lib/powerpc64le-linux-gnu/libm.so.6 (0x00003fffa4da0000)
libgcc_s.so.1 => /lib/powerpc64le-linux-gnu/libgcc_s.so.1 (0x00003fffa4d60000)
libpthread.so.0 => /lib/powerpc64le-linux-gnu/libpthread.so.0 (0x00003fffa4d20000)
/lib64/ld64.so.2 (0x0000000030820000)
Acquire IBM ESSL and XL Fortran compiler runtime.
# Build netlib-native_system-linux-ppc64le.so for ESSL
cd <path-to-netlib-java-src>/native_system/ppc
# edit linux-ppc64le/pom.xml to specify the following ahead of complete BLAS (e.g. OpenBLAS):
# -lessl -lxlf90_r -lxl -lxlomp_ser -lxlfmath -lm -L/opt/ibm/xlf/15.1.3/lib -L/opt/ibm/xlsmp/4.1.3/lib -R/opt/ibm/lib
mvn clean compile
ldd linux-ppc64le/target/netlib-native_system-linux-ppc64le.so
linux-vdso64.so.1 => (0x00003fffa7db0000)
libessl.so.1 => /usr/lib/libessl.so.1 (0x00003fffa5900000)
libxlf90_r.so.1 => /opt/ibm/lib/libxlf90_r.so.1 (0x00003fffa4f90000)
libxlomp_ser.so.1 => /opt/ibm/lib/libxlomp_ser.so.1 (0x00003fffa4f60000)
libm.so.6 => /lib/powerpc64le-linux-gnu/libm.so.6 (0x00003fffa4e70000)
libopenblas.so.0 => <library_path>/libopenblas.so.0 (0x00003fffa4240000)
libgfortran.so.3 => /usr/lib/powerpc64le-linux-gnu/libgfortran.so.3 (0x00003fffa4100000)
libc.so.6 => /lib/powerpc64le-linux-gnu/libc.so.6 (0x00003fffa3f20000)
/lib64/ld64.so.2 (0x000000004bd40000)
libxlfmath.so.1 => /opt/ibm/lib/libxlfmath.so.1 (0x00003fffa3ef0000)
librt.so.1 => /lib/powerpc64le-linux-gnu/librt.so.1 (0x00003fffa3ec0000)
libpthread.so.0 => /lib/powerpc64le-linux-gnu/libpthread.so.0 (0x00003fffa3e80000)
libgcc_s.so.1 => /lib/powerpc64le-linux-gnu/libgcc_s.so.1 (0x00003fffa3e40000)
libdl.so.2 => /lib/powerpc64le-linux-gnu/libdl.so.2 (0x00003fffa3e10000)