Skip to content

Building ppc64le natives for use in Spark MLlib

Matthew Brandyberry edited this page May 6, 2016 · 9 revisions

Build instructions

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

Bundle the following in a new jar

  • 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).

Alternative BLAS implementations

OpenBLAS

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)

ATLAS

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)

IBM ESSL

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)

Clone this wiki locally