Building from Source¶
Getting the Source Code¶
The source code is hosted on github. The libSkylark git repository can be cloned using the following command.
git clone https://github.com/xdata-skylark/libskylark.git
libSkylark Software Dependencies¶
libSkylark uses several open-source software packages that are essential for its operation (build, install, and run). In this section, we give instructions to install these software packages on Ubuntu machines. Installing the required software packages on other operating systems should be very similar.
We can build libSkylark in one or more of four possible configurations:
- libSkylark C++ bindings with support for dense (Elemental) matrices skylark-c++-dense
- libSkylark C++ bindings with support for sparse (CombBLAS) matrices skylark-c++-sparse
- libSkylark python and C++ bindings with support for dense (Elemental) matrices skylark-python-dense
- libSkylark python and C++ bindings with support for sparse (CombBLAS) matrices skylark-python-sparse
Please refer to the graph of dependencies for realizing these configurations. Note that nodes with version information within brackets refer to software packages while nodes containing no brackets refer to libSkylark build targets. The versions denote the ones that we have tested with, but apart from Elemental, CombBLAS, and KDT versions, which need to be strictly followed, other software (CMake, gfortran, etc) may work just as well with other versions as well. Orange colored components denote C++ dependencies and the color green is used for Python dependencies.
Note
On a fresh 64-bit Ubuntu-based (release 14.04 LTS, aka Trusty Tahr) you can use the provided bootstrap script vagrant/trusty64/boostrap.sh to install libSkylark dependencies. Before executing the script, be sure to set the user name in the UNAME variable at the start of the script.
python-setuptools¶
To get easy_install and others.
Installation
sudo apt-get install python-setuptools
g++ (>=4.7.1 for Elemental support)¶
The C++ compiler in the GNU Compiler Collection (GCC).
Installation:
sudo apt-get install g++
In case your ubuntu repository does not contain a GCC/G++ version 4.7 use the following:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.7 g++-4.7
and (optionally) use 4.7 as default compiler:
sudo update-alternatives --remove gcc /usr/bin/gcc-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
gfortran compiler¶
gfortran is the name of the GNU Fortran compiler, which is part of the GNU Compiler Collection (GCC).
Installation:
sudo apt-get install gfortran
CMake (>= 2.8.8 for Elemental support)¶
CMake is a cross-platform free software program managing the build process of software using a compiler-independent method. It is designed to support directory hierarchies and applications that depend on multiple libraries, and for use in conjunction with native build environments such as make.
Installation:
sudo apt-get install cmake
If the available version is too old, compile CMake by hand. Head to http://www.cmake.org/cmake/resources/software.html and download the latest version.
./bootstrap --prefix=$CMAKE_INSTALL_DIR
make
make install
By specifying a CMAKE_INSTALL_DIR the install target for CMake can be set. If no --prefix is set, CMake will be installed in /usr/local. Make sure to add the install path to your PATH environment variable.
BLAS and LAPACK¶
Basic Linear Algebra Subroutine (BLAS) is a de facto application programming interface standard for publishing libraries to perform basic linear algebra operations such as vector and matrix multiplication. LAPACK (Linear Algebra PACKage) is a software library for numerical linear algebra. It provides routines systems of linear equations and linear least squares, eigenvalue problems, and singular value decomposition. It also includes routines to implement the associated QR, Cholesky and Schur decomposition.
We provide instructions for using Ubuntu’s repository and using OpenBLAS.
Installation:
sudo apt-get install libblas-dev libblas-doc libblas3gf liblapack-dev liblapack-doc liblapack3gf
Experiments show good speedups with using OpenBLAS.
wget http://github.com/xianyi/OpenBLAS/tarball/v0.2.8
Installation (to enable OpenMP support in OpenBLAS):
make USE_OPENMP=1 FC=gfortran; make install PREFIX=/path/to/install-directory
MPICH2¶
MPICH is a freely available, portable implementation of MPI, a standard for message-passing for distributed-memory applications used in parallel computing. MPICH is free software and is available for most flavors of Unix-like OS (including Linux).
Installation:
sudo apt-get install libcr-dev mpich2 mpich2-doc
NumPy and SciPy¶
NumPy is an extension to the Python programming language, adding support for large, multi-dimensional arrays and matrices, along with a large library of high-level mathematica functions to operate on these arrays. SciPy is an open source library of algorithms and mathematical tools for the Python programming language that grew out of Travis Oliphant’s original collection of extension modules for Python which he released in 1999 under the name Multipack (named for the netlib packages that it brought together such as ODEPACK, QUADPACK, and MINPACK).
Installation:
sudo apt-get install python-numpy python-scipy
Note
Elemental-0.86 requires a NumPy version >= 1.7. On Ubuntu Precise the deb sources only contain version 1.6.x. To upgrade use either:
wget https://launchpad.net/~tukss/+archive/ppa/+build/4055943/+files/python-numpy_1.7.0~b2-1~precise1_amd64.deb
sudo dpkg -i python-numpy_1.7.0~b2-1~precise1_amd64.deb
or
sudo easy_install -U scipy
mpi4py¶
MPI for Python (mpi4py) provides bindings of the Message Passing Interface (MPI) standard for the Python programming language, allowing any Python program to exploit multiple processors.
Installation:
sudo easy_install mpi4py
hdf5¶
hdf5 is a portable data model, library and file format for storing and managing data.
Installation:
wget http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.8.12.tar
tar -xvf hdf5-1.8.12.tar
cd hdf5-1.8.12
./configure --enable-cxx --prefix=<location for HDF5 software>
make >& make.out
make check >& check.out
make install
h5py¶
h5py (h5py) provides Python bindings to hdf5, which is a data model, library, and file format for storing and managing data.
Installation:
sudo apt-get install libhdf5-serial-dev
sudo easy_install h5py
Boost C++ 1.55.0¶
Boost is a set of libraries for the C++ programming language that provide support for tasks and structures such as linear algebra, pseudorandom number generation, multithreading, image processing, regular expressions, and unit testing.
Installation:
wget http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz
tar xvfz boost_1_55_0.tar.gz
cd boost_1_55_0
./bootstrap.sh --with-libraries=mpi,serialization,program_options,system,filesystem
echo "using mpi ;" >> project-config.jam
./b2 link=static,shared
sudo ./b2 install
Compiling with the XL compiler
This section is inspired by the Argonne Boost configuration. First, as usual we call bootstrap.
./bootstrap.sh --with-libraries=mpi,serialization,program_options,system,filesystem
In a next step, download jam file and copy the Boost jam file to tools/build/v2/tools/. Subsequently, executing
echo "using bgq ;" >> project-config.jam
echo "using mpi : /bgsys/drivers/ppcfloor/comm/bin/xl/mpixlcxx ;" >> project-config.jam
./b2 link=static,shared toolset=bgq
compiles the selected boost libraries (you might need to adapt the path to mpixlcxx). In case all versions (debug, mt) are required, use --build-type=complete.
Note
Make sure to only use -O2 because -O3 and higher will result in a segfault in the compiler for some packages (e.g. program_options), see http://www-01.ibm.com/support/docview.wss?uid=swg1LI77249.
Elemental¶
Elemental is a framework for distributed-memory dense linear algebra that strives to be both fast and convenient. It combines ideas including: element-wise matrix distributions (Hendrickson et al.), object-oriented submatrix tracking (FLAME, van de Geijn et al.), and first-class matrix distributions (PLAPACK, van de Geijn et al.).
Elemental’s API is a moving target, so newer versions might not work as-is. Currently we only support 0ffa9fc29ab740a7a96eccc45c180463723f465d (see https://github.com/elemental/Elemental/commit/0ffa9fc29ab740a7a96eccc45c180463723f465d).
Note
There is no offical supported release yet. Please, use https://github.com/elemental/Elemental/commit/0ffa9fc29ab740a7a96eccc45c180463723f465d.
Installation: (make sure to use a compiler with c++11 support)
git clone https://github.com/elemental/Elemental.git
cd Elemental
git checkout 0ffa9fc29ab740a7a96eccc45c180463723f465d
mkdir build
cd build
cmake -DEL_USE_64BIT_INTS=ON -DEL_HAVE_QUADMATH=OFF -DCMAKE_BUILD_TYPE=Release -DEL_HYBRID=ON -DBUILD_SHARED_LIBS=ON -DMATH_LIBS="-L/usr/lib -llapack -lopenblas -lm" -DINSTALL_PYTHON_PACKAGE=ON ../
make
sudo make install
The installation prefix can be set using the CMAKE_INSTALL_PREFIX.
If you want to use non-default math libraries specify the MATH_LIBS variable. For example for OpenBLAS, run cmake along the following lines:
cmake -D MATH_LIBS="-L/usr/local/lib -llapack -lopenblas -lm" ..
Note
Note that the cmake comamnd above may require additional options for non-standard Python installations, e.g. Anaconda, -D PYTHON_LIBRARY=/path/to/libpython2.7.so -D PYTHON_INCLUDE_DIR=/path/to/include/python2.7
Combinatorial BLAS (CombBLAS) 1.4¶
The Combinatorial BLAS is an extensible distributed-memory parallel graph library offering a small but powerful set of linear algebra primitives specifically targeting graph analytics. We use it in libSkylark to represent sparse matrices.
Installation:
wget http://gauss.cs.ucsb.edu/~aydin/CombBLAS_FILES/CombBLAS_beta_14_0.tgz
tar xvfz CombBLAS_beta_14_0.tgz
cd CombBLAS/
cmake .
make
Shared Libs
In order to use libSkylark through Python, make sure to compile and append the directory containing the *.so files to your LD_LIBRARY_PATH.
cd CombBLAS/
rm CMakeCache.txt
cmake -DBUILD_SHARED_LIBS:BOOL=ON .
make
KDT¶
The Knowledge Discovery Toolbox (KDT) provides a Python interface (amongst other things) to CombBLAS. libSkylark requires this package to handle sparse matrices through the Python interface.
To install kdt you need python and python-dev libs:
sudo apt-get install python
sudo apt-get install python-dev
Head over to http://kdt.sourceforge.net/wiki/index.php/Download and download kdt-0.3.tar.gz. Then execute:
tar xzf kdt-0.3.tar.gz
cd kdt-0.3
export CC=mpicxx
export CXX=mpicxx
python setup.py build
sudo python setup.py install
See http://kdt.sourceforge.net/wiki/index.php/Installation for further information.
FFTW 3.3.3¶
FFTW is a C subroutine library for computing the discrete Fourier transform (DFT) in one or more dimensions, of arbitrary input size, and of both real and complex data (as well as of even/odd data, i.e. the discrete cosine/sine transforms or DCT/DST).
Installation:
wget http://www.fftw.org/fftw-3.3.3.tar.gz
tar xvfz fftw-3.3.3.tar.gz
cd fftw-3.3.3/
./configure --enable-shared
make -j4
sudo make install
Random123 1.08¶
Random123 is a library of “counter-based” random number generators (CBRNGs). We use them in libSkylark to generate independent random number streams.
Installation:
wget http://www.thesalmons.org/john/random123/releases/1.08/Random123-1.08.tar.gz
tar xvfz Random123-1.08.tar.gz
sudo cp -r Random123-1.08/include/Random123 /usr/local/include
Doxygen¶
Doxygen is a documentation generator, a tool for writing software reference documentation. The documentation is written within code, and is thus relatively easy to keep up to date. Doxygen can cross reference documentation and code, so that the reader of a document can easily refer to the actual code.
Installation:
sudo apt-get install doxygen
Graphviz¶
Graphviz (short for Graph Visualization Software) is a package of open-source tools initiated by AT&T Labs Research for drawing graphs specified in DOT language scripts.
Installation:
sudo apt-get install graphviz
Building libSkylark¶
libSkylark uses Cmake as a build system. Before you start please make sure to check out the Section “Installing software dependencies for libSkylark” to learn about the required dependencies.
Quick guide: In many situation the default configuration and settings should work out of the box. To that end execute
cd $BUILD_DIR
CC=mpicc CXX=mpicxx cmake $SRC_DIR
make
make install
Note
If you have MPI compilers in your PATH environment variable, CMake may overwrite the compiler specified in the CXX flag.
Note
If you want to specify the path for BLAS and/or LAPACK (e.g. use OpenBLAS), define the BLAS_LIBRARIES and LAPACK_LIBRARIES enviroment variable.
In case you have a more specific setup or this does not work on your machine continue reading the next sections.
Python only user-level installation¶
In case you do not have root access, and are satisfied with an Python only installation, you can install the Python package only at user-level.
cd $BUILD_DIR
CC=mpicc CXX=mpicxx cmake $SRC_DIR
make
cd python-skylark
python ./setup.py install --user
The Python package will be installed under ~/.local. The directory ~/.local/lib should be in the library load path for the installation to function properly.
Directory setup¶
For the rest of this section let’s keep the following conventions:
the source code is checked out and $SRC_DIR points to the base directory in the libSkylark repository, e.g.
export SRC_DIR=/home/user/workspace/libskylarkyou created a separate (do not build in the $SRC_DIR$) build directory $BUILD_DIR that is used to generate object files, libraries and executables, e.g.
export BUILD_DIR=/home/user/build/libskylark
Build options¶
libSkylark accepts build options in order to customize components. The following table summarizes all currently available build options:
Name | Default | Description |
---|---|---|
USE_FFTW | OFF | Build with fftw support |
USE_COMBBLAS | OFF | Build with CombBLAS sparse matrix support |
USE_PROFILER | OFF | Build with internal profiler |
USE_HYBRID | OFF | Build in hybrid mode OpenMP and MPI (if Elemental was compiled in hybrid mode, activate) |
BUILD_PYTHON | ON | Build Python interface |
BUILD_EXAMPLES | ON | Build libSkylark examples (see examples directory) |
BUILD_ML | ON | Build libSkylark with machine learning solvers Build type |
You can specify the desired build type with -DCMAKE_BUILD_TYPE=STRING, where STRING is any of
Name | Flags |
---|---|
RELWITHDEBINFO | -O3 -g |
RELEASE | -O3 |
DEBUG | -O0 -g |
The default is RELWITHDEBINFO.
Environment variables¶
The installation of libSkylark can be influenced with two variables:
- the CMake parameter CMAKE_INSTALL_PREFIX (i.e. pass -DCMAKE_INSTALL_PREFIX=/home/user/software when calling cmake), and
- the environment variable $PYTHON_SITE_PACKAGES to determine the installation location for python packages. Don’t forget to adapt the $PYTHONPATH environment variable as well. Example: If $PYTHON_SITE_PACKAGES is set to /home/user/local, CMake will install the Python bindings under /home/user/local/lib/python2.7/site-packages/skylark. At this point, you will have to append $PYTHONPATH with /home/user/local/lib/python2.7/site-packages!
To help CMake to locate installed dependencies (system-wide installed dependencies should be found automatically), you should set the following environment variables:
Name | Description |
---|---|
ELEMENTAL_ROOT | Looks for headers in $ELEMENTAL_ROOT/include and libs in $ELEMENTAL_ROOT/lib |
COMBBLAS_ROOT | Looks for headers in $COMBBLAS_ROOT/ and libs in $COMBBLAS_ROOT/lib |
FTW_ROOT | Looks for headers in $FFTW_ROOT/include and libs in $FFTW_ROOT/lib |
BOOST_ROOT | For non system-wide boost installations |
RANDOM123_ROOT | Looks for headers in $RANDOM_123_ROOT/include |
HDF5_ROOT | Looks for headers in $HDF5_ROOT/include and libs in $HDF5_ROOT/lib |
Configuring, compiling and installing libSkylark¶
Finally we are ready to configure, compile and install libSkylark. The default configuration (compiling Elemental and Python support, installed system-wide) can be compiled and installed with:
cd $BUILD_DIR
CC=mpicc CXX=mpicxx cmake $SRC_DIR
make
make install
Note
If you have MPI compilers in your PATH CMake will use the most generic (e.g. mpicxx) version (see https://github.com/Kitware/CMake/blob/master/Modules/FindMPI.cmake#L113). This may overwrite the compiler specified in the CXX flag.
The Python packages will most likely be installed under /usr/lib/pythonX.Y/dist-packages (OS and version dependent). Check the configure output for more details about default installation paths on your machine.
For the sake of illustration let’s assume you want to enable CombBLAS support and install everything in ~/local:
cd $BUILD_DIR
export PYTHON_SITE_PACKAGES=~/local/
CC=mpicc CXX=mpicxx cmake -DCMAKE_INSTALL_PREFIX=~/local -DWITH_COMBBLAS=ON $SRC_DIR
make
make install
Notice that we set the PYTHON_SITE_PACKAGES and passed a CMAKE_INSTALL_PREFIX to the cmake command above. Additionally we enabled CombBLAS support. Note that you have to make sure that the required libraries are compiled and the environment variables correctly point to the installation locations (i.e. export COMBBLAS_ROOT=~/software/combblas/).
Note
If a specific linking type wants to be enforced, check out the CMake variable CMAKE_FIND_LIBRARY_SUFFIXES (e.g. use SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so").
Code documentation Doxygen¶
To generate the documentation (see dependency section for Doxygen installation), run
cd $BUILD_DIR
make doc
This will generate the Doxygen documentation under $BUILD_DIR/Documentation. To read the documentation open $BUILD_DIR/Documentation/html/index.html in a browser.
Sphinx¶
Make sure to install the Sphinx dependencies before you run make sphinx-doc:
apt-get install python-sphinx
cd /tmp
svn co https://svn.code.sf.net/p/matplotlib/code/trunk/sampledoc_tut
mkdir $HOME/.sphinx_ext
cp sampledoc_tut/sphinxext/*.py $HOME/.sphinx_ext
rm -rf /tmp/sampledoc_tut
export SPHINXEXT=$HOME/.sphinx_ext
Note
Sphinx requires some dependencies, e.g. plots and latex equations.
apt-get python-dateutil
apt-get libfreetype6-dev libpng-dev
easy-install matplotlib
apt-get install texlive-latex-base
apt-get install texlive-latex-extra
Then run
cd $BUILD_DIR
make sphinx-doc
and point your browser to $BUILD_DIR/Documentation/sphinx/index.html.
Running examples¶
There are two examples in the example folder (for more see python-skylark). The elemental.cpp shows how C++ code can utilize libSkylark. Run
examples/elemental -help
in the $BUILD_DIR to get a list of available command line options.
Using libSkylark in Your Project¶
If you plan to use libSkylark as a library in your project, the following steps are necessary to build and link your application:
add the include path of all libSkylark headers: $SKYLARK_INSTALL_DIR/include (if configured with -DCMAKE_INSTALL_PREFIX=${SKYLARK_INSTALL_DIR},
- link against all external libraries used when building libSkylark (take a look and maybe reuse the find modules in $SRC_DIR/CMakeModules:
- FFTW: fftw3.h
- Elemental: header files, libEl, libpmrrr
- CombBLAS: header files, libMPITypelib, libCommGridlib, libMemoryPoollib
- Random123: threefry.h, MicroURNG.hpp
- HDF5: hdf5.h, libhdf5, libhdf5_cpp
- HDFS: hdfs.h, libhdfs, libjvm
Using Cmake¶
If you are using Cmake to build your application you can use the CMake configuration file $SKYLARK_INSTALL_DIR/lib/cmake/SKYLARK/SKYLARKConfig.cmake in your CMakeLists.txt to find SKYLARK. After that you can simply include ${SKYLARK_INCLUDE_DIRS} and ${SKYLARK_LIBRARIES} when you build and link your application. A very basic CMake file for your project could look like:
cmake_minimum_required (VERSION 2.8.2)
project (SAMPLE)
find_package (MPI REQUIRED)
set (CMAKE_CXX_COMPILER ${MPI_COMPILER})
find_package (SKYLARK REQUIRED HINT ${SKYLARK_INSTALL_DIR}/lib)
include_directories ( ${SKYLARK_INCLUDE_DIRS} )
add_definitions(${SKYLARK_DEFS})
add_executable(ex_code ex_code.cpp)
target_link_libraries(ex_code ${SKYLARK_LIBRARIES} )
set_target_properties(ex_code PROPERTIES COMPILE_FLAGS "${SKYLARK_CXX_FLAGS}" )
This will pull all the required libs and add all include paths for libSkylark and its dependencies. You should be able to compile your application painless by following the above recipe.
Using XYZ Build System¶
Take a look at the file in $SKYLARK_INSTALL_DIR/lib/SKYLARK/SKYLARKConfig.cmake to see which include directories libraries you have to include when using libSkylark.
Software Pitfalls¶
CombBLAS Installation Notes¶
The general steps to use CombBLAS with libSkylark:
- Download KDT, build and install the python package (generated with SWIG), then
- Download CombBLAS, build and install libs and include files, and finally
- When configuring libSkylark, use -DWITH_COMBBLAS=ON in the CMake configure call
Issues with CombBLAS >= 1.4.0
Unfortunately there are some issues when using CombBLAS with libSkylark. Check the subsections below if you have problem compiling or linking CombBLAS.
UINT32_MAX not declared
Additionally a CombBLAS header causes the compiler to produce an error (UINT32_MAX not declared). There are two possible ways to fix that:
- Edit the header (RefGen21.h) and replace UINT32_MAX with std::numeric_limits<unit32_t>::max(), or
- add the -D__STDC_LIMIT_MACROS compile flag in the CMake file when CombBLAS is enabled.
Compiler Warning: *enumeral* and *non-enumeral* type in conditional expression
To fix the following warning (appearing when compiling with -Werror):
CombBLAS_beta_13_0/psort-1.0/driver/MersenneTwister.h: In member function ‘void MTRand::seed(MTRand::uint32*, MTRand::uint32)’:
CombBLAS_beta_13_0/psort-1.0/driver/MersenneTwister.h:234:42: error: enumeral and non-enumeral type in conditional expression [-Werror]
apply the following patch:
diff --git a/psort-1.0/driver/MersenneTwister.h b/psort-1.0/driver/MersenneTwister.h
index 16e6458..1363423 100644
--- a/psort-1.0/driver/MersenneTwister.h
+++ b/psort-1.0/driver/MersenneTwister.h
@@ -231,7 +231,7 @@ inline void MTRand::seed( uint32 *const bigSeed, const uint32 seedLength )
initialize(19650218UL);
register int i = 1;
register uint32 j = 0;
- register int k = ( N > seedLength ? N : seedLength );
+ register int k = ( static_cast<uint32>(N) > seedLength ? static_cast<uint32>(N) : seedLength );
for( ; k; --k )
{
state[i] =
Note
This should be fixed upstream in the next CombBLAS release (most likely 1.3.1).
Compiling Skylark/CombBLAS with CLANG
To be able to compile and link using the CLANG compiler (>=3.0.x), the following patch has to be applied to CombBLAS (<= 1.3.0):
diff --git a/DistEdgeList.cpp b/DistEdgeList.cpp
index 5ae9301..61cf16f 100644
--- a/DistEdgeList.cpp
+++ b/DistEdgeList.cpp
@@ -102,7 +102,7 @@ void DistEdgeList<IT>::Dump64bit(string filename)
MPI_Comm_rank(World, &rank);
MPI_Comm_size(World, &nprocs);
MPI_File thefile;
- MPI_File_open(World, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile);
+ MPI_File_open(World, const_cast<char*>(filename.c_str()), MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile);
IT * prelens = new IT[nprocs];
prelens[rank] = 2*nedges;
@@ -125,7 +125,7 @@ void DistEdgeList<IT>::Dump32bit(string filename)
MPI_Comm_rank(World, &rank);
MPI_Comm_size(World, &nprocs);
MPI_File thefile;
- MPI_File_open(World, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile);
+ MPI_File_open(World, const_cast<char*>(filename.c_str()), MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile);
IT * prelens = new IT[nprocs];
prelens[rank] = 2*nedges;
diff --git a/SpParMat.cpp b/SpParMat.cpp
index ca553e8..2ef88d6 100644
--- a/SpParMat.cpp
+++ b/SpParMat.cpp
@@ -109,7 +109,7 @@ void SpParMat< IT,NT,DER >::Dump(string filename) const
int nprocs = commGrid->GetSize();
MPI_File thefile;
- MPI_File_open(World, filename.c_str(), MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile);
+ MPI_File_open(World, const_cast<char*>(filename.c_str()), MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &thefile);
int rankinrow = commGrid->GetRankInProcRow();
int rankincol = commGrid->GetRankInProcCol();
Note
The issues in the above patch were addressed (source lines commented) in the 1.4.0 CombBLAS release (January 2014).
Warning: variable ‘XYZ’ set but not used
CombBLAS (<=1.4.0) has set but not used variables. To remove the warning apply the following patch.
diff --git a/SpMat.cpp b/SpMat.cpp
index d00f37c..6ae6050 100644
--- a/SpMat.cpp
+++ b/SpMat.cpp
@@ -108,27 +108,28 @@ SpTuples<IU, NUO> * MultiplyReturnTuples
bool clearA = false, bool clearB = false)
{
- IU A_m, A_n, B_m, B_n;
+ //IU A_m, A_n, B_m, B_n;
+ IU A_n, B_m;
if(isAT)
{
- A_m = A.getncol();
+ //A_m = A.getncol();
A_n = A.getnrow();
}
else
{
- A_m = A.getnrow();
+ //A_m = A.getnrow();
A_n = A.getncol();
}
if(isBT)
{
B_m = B.getncol();
- B_n = B.getnrow();
+ //B_n = B.getnrow();
}
else
{
B_m = B.getnrow();
- B_n = B.getncol();
+ //B_n = B.getncol();
}
if(A_n == B_m)
Disable KDT Log
To disable the KDT log use the following patch:
diff --git a/kdt/Graph.py b/kdt/Graph.py
index 51c55b2..e61e9cf 100644
--- a/kdt/Graph.py
+++ b/kdt/Graph.py
@@ -1,7 +1,7 @@
import math
#import numpy as np # Adam: TRY TO AVOID THIS IF AT ALL POSSIBLE.
import pyCombBLAS as pcb
-import feedback
+#import feedback
import UFget as uf
from Util import info, master, version, revision
diff --git a/kdt/Vec.py b/kdt/Vec.py
index 00b7c1c..50aaa73 100644
--- a/kdt/Vec.py
+++ b/kdt/Vec.py
@@ -1,6 +1,6 @@
import math
import kdt.pyCombBLAS as pcb
-import feedback
+#import feedback
import UFget as uf
import Mat as Mat
import ctypes
diff --git a/kdt/__init__.py b/kdt/__init__.py
index 7f0992f..6c3a10f 100644
--- a/kdt/__init__.py
+++ b/kdt/__init__.py
@@ -10,7 +10,7 @@ from Vec import Vec
from Mat import Mat
#from SpVec import SpVec, info
#from DeVec import DeVec
-from feedback import sendFeedback
+#from feedback import sendFeedback
from UFget import UFget, UFdownload
try:
import kdt.pyCombBLAS as pcb
diff --git a/setup.py b/setup.py
index a2813e3..10f5bdf 100644
--- a/setup.py
+++ b/setup.py
@@ -369,7 +369,7 @@ pyCombBLAS_ext = Extension('kdt._pyCombBLAS',
extra_link_args = extra_link_args, extra_compile_args = extra_compile_args,
define_macros=[('GRAPH_GENERATOR_SEQ', '1')] + headerDefs + define_macros)
-py_modules = ['kdt.pyCombBLAS', 'kdt.Graph', 'kdt.DiGraph', 'kdt.HyGraph', 'kdt.feedback', 'kdt.UFget', 'kdt.Mat', 'kdt.Vec', 'kdt.ObjMethods', 'kdt.Algorithms', 'kdt.Util', 'kdt.SpectralClustering', 'kdt.eig']
+py_modules = ['kdt.pyCombBLAS', 'kdt.Graph', 'kdt.DiGraph', 'kdt.HyGraph', 'kdt.UFget', 'kdt.Mat', 'kdt.Vec', 'kdt.ObjMethods', 'kdt.Algorithms', 'kdt.Util', 'kdt.SpectralClustering', 'kdt.eig']
# SEJITS modules:
py_modules.extend(['kdt.specializer.__init__', 'kdt.specializer.parsetab', 'kdt.specializer.pcb_function', 'kdt.specializer.pcb_function_frontend', 'kdt.specializer.pcb_function_sm', 'kdt.specializer.pcb_operator_convert', 'kdt.specializer.pcb_predicate', 'kdt.specializer.pcb_predicate_frontend', 'kdt.specializer.pcb_predicate_sm'])
Issues with CombBLAS < 1.4.0¶
std:: namespace clash (CombBLAS <= 1.3.0)
Depending on your compiler version (and if you installed CombBLAS <= 1.3.0) you might need to apply the following patch:
diff --git a/psort-1.0/src/psort_merge.h b/psort-1.0/src/psort_merge.h
index 858580b..256c3db 100644
--- a/psort-1.0/src/psort_merge.h
+++ b/psort-1.0/src/psort_merge.h
@@ -163,11 +163,11 @@ namespace vpsort {
out, comp);
} else if (locs[next] == 0) {
// 10 => backwards out of place
- std::merge (reverse_iterator<_RandomAccessIter> (in + disps[nproc]),
- reverse_iterator<_RandomAccessIter> (in + disps[next]),
- reverse_iterator<_RandomAccessIter> (out + disps[next]),
- reverse_iterator<_RandomAccessIter> (out),
- reverse_iterator<_RandomAccessIter> (out + disps[nproc]),
+ std::merge (std::reverse_iterator<_RandomAccessIter> (in + disps[nproc]),
+ std::reverse_iterator<_RandomAccessIter> (in + disps[next]),
+ std::reverse_iterator<_RandomAccessIter> (out + disps[next]),
+ std::reverse_iterator<_RandomAccessIter> (out),
+ std::reverse_iterator<_RandomAccessIter> (out + disps[nproc]),
not2 (comp));
} else {
// 11 => in-place
Note
This was fixed upstream in the 1.4.0 CombBLAS release (January 2014).
Complete BGQ Installation Instructions¶
This is an end-to-end guide for installing libSkylark on a BG/Q. During this section we assume the following:
- most of the software and sources are installed in $HOME/local,
- the installation of Random123 is omitted (just untar the library)
LLVM/Clang¶
Because of various dependencies and c++11 compatibility issues the installation requires a c++11 compiler. For this we are installing LLVM/Clang (until the XL compiler provides the necessary c++11 features.
Argonne provides rpm packages for the BG/Q. Download and follow the instructions as stated on https://trac.alcf.anl.gov/projects/llvm-bgq.
There is a fairly painless way to install nightly builds using these installation scripts https://github.com/sloede/install-bgq.
After this step we assume you have installed LLVM/CLANG under $HOME/bgclang/.
Elemental¶
Download elemental 0.83 (http://libelemental.org/pub/releases/elemental-0.83.tgz). Then use the following toolchain file (e.g. save to BGQ-toolchain.cmake)
set(GCC_ROOT "/bgsys/drivers/ppcfloor/gnu-linux")
set(GCC_NAME "powerpc64-bgq-linux")
set(CLANG_ROOT "$ENV{HOME}/bgclang/bin")
set(CLANG_MPI_ROOT "$ENV{HOME}/bgclang/mpi/bgclang")
set(IBMCMP_ROOT "$ENV{IBM_MAIN_DIR}")
set(BLAS_LIB "$ENV{HOME}/src/lapack-3.5.0/")
set(LAPACK_LIB "$ENV{HOME}/src/lapack-3.5.0/")
set(ESSL_LIB "/opt/ibmmath/lib64")
set(MPI_ROOT "/bgsys/drivers/ppcfloor/comm/gcc")
set(PAMI_ROOT "/bgsys/drivers/ppcfloor/comm/sys")
set(SPI_ROOT "/bgsys/drivers/ppcfloor/spi")
# The serial compilers
set(CMAKE_C_COMPILER "${CLANG_MPI_ROOT}/bin/mpiclang")
set(CMAKE_CXX_COMPILER "${CLANG_MPI_ROOT}/bin/mpiclang++11")
set(CMAKE_Fortran_COMPILER "${GCC_ROOT}/bin/${GCC_NAME}-gfortran")
# The MPI wrappers for the C and C++ compilers
set(MPI_C_COMPILER "${CLANG_MPI_ROOT}/bin/mpiclang")
set(MPI_CXX_COMPILER "${CLANG_MPI_ROOT}/bin/mpiclang++11")
set(MPI_C_COMPILE_FLAGS "")
set(MPI_CXX_COMPILE_FLAGS "")
set(MPI_C_INCLUDE_PATH "${MPI_ROOT}/include")
set(MPI_CXX_INCLUDE_PATH "${MPI_ROOT}/include")
set(MPI_C_LINK_FLAGS "-L${MPI_ROOT}/lib -L${PAMI_ROOT}/lib -L${SPI_ROOT}/lib")
set(MPI_CXX_LINK_FLAGS "${MPI_C_LINK_FLAGS}")
set(MPI_C_LIBRARIES "${MPI_C_LINK_FLAGS} -lSPI -lSPI_cnk -lrt -lpthread -lstdc++ -lpthread")
set(MPI_CXX_LIBRARIES "${MPI_CXX_LINK_FLAGS} ${MPI_C_LIBRARIES}")
if(CMAKE_BUILD_TYPE MATCHES PureDebug OR
CMAKE_BUILD_TYPE MATCHES HybridDebug)
set(CXX_FLAGS "-g")
else()
set(CXX_FLAGS "-O3")
endif()
set(CMAKE_THREAD_LIBS_INIT "-fopenmp")
set(OpenMP_CXX_FLAGS "-fopenmp")
##############################################################
# set the search path for the environment coming with the compiler
# and a directory where you can install your own compiled software
set(CMAKE_FIND_ROOT_PATH
/bgsys/drivers/ppcfloor
/bgsys/drivers/ppcfloor/spi
$ENV{HOME}/bgclang/mpi/bgclang
)
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
##############################################################
set(XLF_LIB "/opt/ibmcmp/xlf/bg/14.1/bglib64")
set(XLSMP_LIB "/opt/ibmcmp/xlsmp/bg/3.1/bglib64")
if(CMAKE_BUILD_TYPE MATCHES PureDebug OR
CMAKE_BUILD_TYPE MATCHES PureRelease)
set(MATH_LIBS "-L${ESSL_LIB} -lesslbg -L${LAPACK_LIB} -llapack -L${ESSL_LIB} -lesslbg -L${XLF_LIB} -lxlf90_r -L${XLSMP_LIB} -lxlomp_ser -lxlopt -lxlfmath -lxl -lpthread -ldl -Wl,--allow-multiple-definition")
else()
set(MATH_LIBS "-L${ESSL_LIB} -lesslsmpbg -L${LAPACK_LIB} -llapack -L${ESSL_LIB} -lesslsmpbg -L${XLF_LIB} -lxlf90_r -L${XLSMP_LIB} -lxlsmp -lxlopt -lxlfmath -lxl -lpthread -ldl -Wl,--allow-multiple-definition")
endif()
This toolchain file is based on the (Elemental) provided BGQ-Mira-clang-essl.cmake file. Finally, run the following to compile (and install) Elemental.
rm -rf CMake*; \
cmake -DCMAKE_TOOLCHAIN_FILE=BGQ-toolchain.cmake \
-DCMAKE_INSTALL_PREFIX=$HOME/local \
-DCMAKE_BUILD_TYPE=HybridRelease -DEL_EXAMPLES=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DEL_USE_64BIT_INTS=ON -DBUILD_METIS=OFF ..
make install
In case you run into errors or problems, check the CMakeFiles/CMakeError.log file in the build directory.
Note
It seems that the HybridDebug version is causing problems on the BGQ.
CombBLAS¶
Download http://gauss.cs.ucsb.edu/~aydin/CombBLAS_FILES/CombBLAS_beta_14_0.tgz untar and change to the CombBLAS directory.
First we need to fix the CombBLAS CMakeLists.txt by commenting out the following two lines:
#SET(CMAKE_CXX_COMPILER mpicxx)
#SET(CMAKE_C_COMPILER mpicc)
and then run to build the required libraries
CC=$HOME/bgclang/mpi/bgclang/bin/mpiclang \
CXX=$HOME/bgclang/mpi/bgclang/bin/mpiclang++11 \
cmake .
Note
The examples and test might fail to compile but that’s ok for now.
FFTW¶
Download http://www.fftw.org/fftw-3.3.3.tar.gz.
CC=$HOME/bgclang/mpi/bgclang/bin/mpiclang \
CXX=$HOME/bgclang/mpi/bgclang/bin/mpiclang++11 \
./configure
make
Boost¶
Download Boost 1.55.0, untar, change directory and then execute:
./bootstrap.sh --with-libraries=mpi,serialization,program_options
echo "using mpi : $HOME/bgclang/mpi/bgclang/bin/mpiclang++11 ;" >> project-config.jam
./b2 toolset=clang
Note
for this to work make sure that clang++ is in your PATH.
HDF5¶
Make sure you have a compiled libz around then run:
CC=$HOME/bgclang/mpi/bgclang/bin/mpiclang \
CXX=$HOME/bgclang/mpi/bgclang/bin/mpiclang++11 \
./configure --enable-cxx --prefix=$HOME/local/ \
--with-pic --disable-shared --with-zlib=$HOME/local/
make lib
make install
Note
Building the tests fails, but that should be ok for now.
libSkylark¶
Finally we can turn to building libSkylark. First change the CMake file by applying the following patch:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ef18fa7..825dbaa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -81,11 +81,14 @@ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
)
set (COMPILER_SPEC_FLAGS
- "-W -Wall -Wno-write-strings -Wno-strict-aliasing -Wno-format -Wno-deprecated -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare"
+ "-W -Wall -Wno-write-strings -Wno-strict-aliasing -Wno-format -Wno-deprecated -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -Wno-overloaded-virtual -Wno-unsupported-friend"
)
#set (LINK_FLAGS
#)
set (CMAKE_LIB_LINKER_FLAGS "${CMAKE_LIB_LINKER_FLAGS} -fPIC")
@@ -157,7 +160,7 @@ include_directories (${CMAKE_SOURCE_DIR})
# dependent packages
# 1. Find MPI --- we are not adding any include directories here because we
# will be using the mpi compilers, which adds these libraries by default.
-find_package (MPI REQUIRED)
+find_package (MPI)
set (CMAKE_CXX_COMPILER ${MPI_COMPILER})
Make sure that the following environment variables (adapt if necessary) are exported
# LAPACK library
export LAPACK_LIB=$HOME/src/lapack-3.5.0/
# root installation dir of CLANG compiler
export CLANG_ROOT=$HOME/bgclang/
# dependencies
export FFTW_ROOT=$HOME/local/fftw-3.3.3/
export HDF5_ROOT=$HOME/local
export ELEMENTAL_ROOT=$HOME/local
export COMBBLAS_ROOT=$HOME/src/CombBLAS
export RANDOM123_ROOT=$HOME/local/Random123-1.08
export BOOST_ROOT=$HOME/local/boost_1_55_0
and compile with:
mkdir build; cd build
rm CMakeCache.txt
rm -rf CMakeFiles
cmake -DCMAKE_TOOLCHAIN_FILE=../CMake/toolchains/BGQ-clang-essl.cmake \
-DUSE_FFTW=ON -DUSE_COMBBLAS=ON -DBUILD_PYTHON=OFF -DUSE_HYBRID=ON \
../
Note
If you get a undefined reference to vtable for std::nested_exception error this hints that you most likely are missing the gcc 4.7.2 toolchain (libc++). The missing files and instructions to patch the wrapper scripts are provided on the ANL trac page (see top).
For compiling the async example driver you need the following patch (the OpenMP statement seems to crash the CLANG compiler):
diff --git a/algorithms/asynch/AsyRGS.hpp b/algorithms/asynch/AsyRGS.hpp
index 92158f1..5eadf94 100644
--- a/algorithms/asynch/AsyRGS.hpp
+++ b/algorithms/asynch/AsyRGS.hpp
@@ -180,7 +180,7 @@ int AsyRGS(const base::sparse_matrix_t<T1>& A, const El::Matrix<T2>& B,
utility::random_samples_array_t<dtype> stepidxs =
context.allocate_random_samples_array(sweeps * n, distribution);
-# pragma omp parallel for default(shared) private(j, d)
+//# pragma omp parallel for default(shared) private(j, d)
for(j = 0; j < sweeps * n ; j++)
internal::jstep(colptr, rowind, vals, Bd, Xd, k, d, stepidxs[j]);
SLURM¶
On Watson Q the following SLURM script can be used to run examples:
#!/bin/bash
RUN_DIR=$HOME/work/libskylark/build
RUN_EXE=examples/elemental
if [ -z "$SLURM_JOBID" ]; then
sbatch --gid=`hostname -s` --time=10:00 --nodes=8 --ntasks-per-node=2 -O --qos=umax-8 $0
else
srun --chdir=$RUN_DIR \
--output=elemental.out \
--error=error.out \
$RUN_EXE
fi
which outputs
# cat error.out
# cat elemental.out
Default
0.558572 -0.316131 -0.0357262 0.572592 0.142264
-0.149105 0.0597079 0.228256 -0.53152 -0.0828558
-0.201294 0.499321 0.397655 0.6972 -0.303714
-0.36505 -0.120876 -0.276908 -0.461459 -0.255837
-0.154734 -0.0392899 0.202231 -0.298655 -0.262944