Note: The information below, and more details, can be found in our wiki
Documentation of the pfd-parallel project
This package provide a massively parallel framework for partial fraction decomposition of rational functions based on the Singular/GPI-Space framework.
The project is supported by Project B5 of SFB-TRR 195 and SymbTools of Forschungsinitiative RLP.
Our implementation is based on a combination of the following two algorithms:
- the enhanced Leinartas' algorithm described in the paper
Janko Boehm, Marcel Wittmann, Zihao Wu, Yingxuan Xu, and Yang Zhang: IBP reduction coefficients made simple, JHEP 12 (2020) 054,
which has been implemened in Singular in the library pfd.lib.
- the MultivariateApart algorithm as described in
Matthias Heller, Andreas von Manteuffel, Comput.Phys.Commun. 271 (2022) 108174
Although applicable in general, the primary aim of our package is the partial fraction decomposition of integration-by-parts coefficients in high energy physics.
Our package relies on code developed in the repository framework implemented primarily by Lukas Ristau.
Since most useful in applications in high energy physics, the main function of our framework applies the partial fraction decoposition function to a specified subset of entries of a two-dimensional array of rational functions.
To use the framework, it is required to install Singular, GPI-Space, some of their dependencies and the project code itself. In the following we provide two different ways of installation. The preferable way is the use the supercomputing package manager Spack, which will take care of all dependencies automatically. The second way is a manual installation of a components, which can be used in case the installation with Spack is not possible on the target system.
Besides, we also provide a useful Mathematica package PfdParallelM to use pfd-parallel more conveniently in Mathematica UI. Inside this package, there is a component pfd-parallel-listnumden-converter for converting Mathematica readable files to txt format readable by pfd-parallel (see format configurations for pfd parallel). It can be used individually for more advanced usage of pfd-parallel.
Spack is a package manager specifically aimed at handling software installations in supercomputing environments, but usable on anything from a personal computer to an HPC cluster. It supports Linux and macOS (note that the Singular/GPI-Space framework and hence our package requires Linux).
We will assume that the user has some directory path with read and
write access. In the following, we assume this path is set as the environment variable
software_ROOT
, as well as install_ROOT
:
export software_ROOT=~/singular-gpispace
export install_ROOT=~/singular-gpispace
Note, this needs to be set again if you open a new terminal session (preferably set it automatically by adding the line to your .profile file).
If Spack is not already present in the above directory, clone Spack from Github:
git clone https://github.com/spack/spack.git $software_ROOT/spack
We check out verison v0.19.0 of Spack (the current version):
cd $software_ROOT/spack
git checkout releases/v0.19
cd $software_ROOT
Spack requires a couple of standard system packages to be present. For example, on an Ubuntu machines they can be installed by the following commands (which typically require sudo privilege)
sudo apt update
sudo apt install build-essential ca-certificates coreutils curl environment-modules gfortran git gpg lsb-release python3 python3-distutils python3-venv unzip zip
To be able to use spack from the command line, run the setup script:
. $software_ROOT/spack/share/spack/setup-env.sh
Note, this script needs to be executed again if you open a new terminal session (preferably set it automatically by adding the line to your .profile file).
Finally, Spack needs to boostrap clingo. This can be done by concretizing any spec, for example
spack spec zlib
Note: If you experience connection timeouts due to a slow internet connection you can set in the following file the variable connect_timeout
to a larger value.
vim $software_ROOT/spack/etc/spack/defaults/config.yaml
Note that Spack can be uninstalled by just deleting its directory and its configuration files. Be CAREFUL to do that, since it will delete your Spack setup. Typically you do NOT want to do that now, so the code is commented out. It can be useful if your Spack installation is broken:
#cd
#rm -rf $software_ROOT/spack/
#rm -rf .spack
Once you have installed Spack, our package can be installed with just three lines of code.
Clone the Singular/GPI-Space package repository into this directory:
git clone https://github.com/singular-gpispace/spack-packages.git $software_ROOT/spack-packages
Add the Singular/GPI-Space package repository to the Spack installation:
spack repo add $software_ROOT/spack-packages
Finally, install pfd-parallel:
spack install pfd-parallel
Note, this may take quite a bit of time, when doing the initial installation, as it needs to build GPI-Space and Singular including dependencies. Installing further components of the framework or updating is then typically quick.
Once pfd-parallel is installed, to use pfd-parallel load the package via:
spack load pfd-parallel
Note, that this command needs to be executed again if you open a new terminal session. In particular, the environment variable PFD_INSTALL_DIR
is available only after executing this command.
GPI-Space requires a working SSH environment with a password-less SSH-key when using the SSH RIF strategy. To ensure this, leave the password field empty when generating your ssh keypair.
By default, ${HOME}/.ssh/id_rsa
is used for authentication. If no such key exists,
ssh-keygen -t rsa -b 4096 -N '' -f "${HOME}/.ssh/id_rsa"
can be used to create one.
If you compute on your personal machine, there must run an ssh server. On an Ubuntu machine, the respective package can be installed by:
sudo apt install openssh-server
Your key has to be registered with the machine you want to compute on. On a cluster with shared home directory, this only has to be done on one machine. For example, if you compute on your personal machine, you can register the key with:
ssh-copy-id -f -i "${HOME}/.ssh/id_rsa" "${HOSTNAME}"
At the current stage, we provide a Mathematica package, which can conveniently setup an environment to run pfd-parallel. One can get the package and see how to use it in:
Mathematica interface: PfdParallelM
If you start in a new terminal session (and did not configure your terminal to do this automatically) make sure to set software_ROOT
and run the setup-env.sh
script. Make also sure to load the pfd-parallel package in Spack. As discussed above this can be done by:
export software_ROOT=~/singular-gpispace
. $software_ROOT/spack/share/spack/setup-env.sh
spack load pfd-parallel
We create directories which will used for input and output:
mkdir -p $software_ROOT/input
mkdir -p $software_ROOT/results
To execute an example, we will use rational function data, which is provided with the installation and is copied by the following command to the input directory.
cp $PFD_INSTALL_DIR/example_data/* $software_ROOT/input
We create a nodefile, which contains the names of the nodes used for computations with our framework. In our example, it just contains the result of hostname.
hostname > $software_ROOT/nodefile
Moreover, we need a directory for temporary files, which should be accessible from all machines involved in the computation:
mkdir -p $software_ROOT/tempdir
Optionally, but recommended: We start the GPI-Space Monitor to display computations in form of a Gantt diagram (to do so, you need an X-Server running). In case you do not want to use the monitor, you should not set in Singular the fields options.loghostfile and options.logport of the GPI-Space configuration token (see below). In order to use the GPI-Space Monitor, we need a loghostfile with the name of the machine running the monitor.
hostname > $software_ROOT/loghostfile
On this machine, start the monitor, specifying a port number where the monitor will receive information from GPI-Space. The same port has to be specified in Singular in the field options.logport.
$PFD_INSTALL_DIR/libexec/bundle/gpispace/bin/gspc-monitor --port 6439 &
We start Singular in the directory where it will have direct access to all relevant directories we just created, telling it also where to find the libraries for our framework:
cd $software_ROOT
SINGULARPATH="$PFD_INSTALL_DIR/LIB" $SINGULAR_INSTALL_DIR/bin/Singular
In Singular, now do what follows below.
LIB "pfd_gspc.lib";
// configuration for gpispace
configToken gspcconfig = configure_gspc();
gspcconfig.options.tempdir = "tempdir";
gspcconfig.options.nodefile = "nodefile";
gspcconfig.options.procspernode = 8;
// Should the user want to run withouth the gspc-monitor
// the following two lines may be commented out.
gspcconfig.options.loghostfile = "loghostfile";
gspcconfig.options.logport = 6439;
// configuration for the problem to be computed.
configToken pfdconfig = configure_pfd();
pfdconfig.options.filename = "xb_deg5";
pfdconfig.options.inputdir = "input";
pfdconfig.options.outputdir = "results";
pfdconfig.options.outputformat = "ssi,cleartext,listnumden,indexed_denominator";
pfdconfig.options.parallelism = "intertwined";
pfdconfig.options.algorithm = "Leinartas";
ring r = 0, x, lp;
list entries = list( list(1, 1), list(1, 2), list(1, 3), list(1, 4)
, list(1, 5), list(1, 6), list(1, 7), list(1, 8)
, list(1, 9), list(1, 10)
);
parallel_pfd( entries
, gspcconfig
, pfdconfig
);
This
-
loads the library giving access to pfd-parallel,
-
creates a configuration token for the Singular/GPI-Space framework,
- adds information where to store temporary data (in the field options.tmpdir),
- where to find the nodefile (in the field options.nodefile), and
- sets how many processes per node should be started (in the field options.procspernode, usually one process per core, not taking hyper-threading into account; you may have to adjust according to your hardware),
-
creates a configuration token for pfd-parallel, adds information on
- the base file name (in the field pfdconfig.filename),
- the input directory (in the field pfdconfig.inputdir)
- the output directory (in the field pfdconfig.outputdir)
- the output format(s) (in the field pfdconfig.outputformat)
- the choice of parallelization strategy (in the field pfdconfig.parallelism)
- the choice of algorithmic strategy (in the field pfdconfig.algorithm).
-
creates a polynomial ring containing the numerators and denominators
-
creates a list with the indices of the array entries to be decomposed (referencing the base file name)
-
and starts the computation.
Note that in more fancy environments like a cluster, one should specify absolute paths to the nodefile and the temp directory.
The results can then be found in the directory $software_ROOT/results
. Note that if an output file already exist, the respective computation will not be repeated to allow for restartability. The Singular command returns a list of strings providing information about whether the computation was successful, or was skipped since the result file is already there. After the above run, the output directory contains for each individual computation output files in the requested formats.
-
Output formats (to be specified in the field pfdconfig.options.outputformat as list of strings allowing for multiple output formats):
- ssi
binary Singular serialization format (also used internally for serialization, consistent between input and output)
Note that the ssi format also contains the information about the basering, so if you read it in in Singular, you get both the ring and the answer
Naming convention: result_filename_i_j.ssi - listnumden
semi-human readable, list (interpreted as a sum) of lists of numerators and factored denominators
Note that to read this format into Singular, you have to first create the appropriate basering
Naming convention: result_filename_i_j_input.txt - indexed_denominator
human readable form, indexing of denominator factors, creates two files, one with the pfd and one with the indexed factors
Naming convention: result_indexed_denominator_filename_i_j.txt, result_factors_denominator_filename_i_j.txt - indexed_numerator_denominator
human readable form, indexing of numerator and denominator factors, creates two files, one with the pfd and one with the indexed factors
Naming convention: result_indexed_filename_i_j.txt, result_factors_filename_i_j.txt - cleartext
human readable form, no indexing
Naming convention: result_filename_i_j.txt
The computation also creates for each rational function a log file giving information about the the individual steps of the algorithm and their time and memory usage.
Naming convention: resources_filename_i_j.txt - ssi
-
Input formats (to be specified in the field pfdconfig.options.suffix as a string):
- ssi binary Singular serialization format, compatible to output format.
- txt for accepting the listnumden format
semi-human readable format, list of lists of numerators and denominators
Note that to read this format into Singular, you have to first create the appropriate base ring in the Singular scripts.
Warning: If you set pfdconfig.options.suffix="txt"
in the Singular scripts, the program is designed to convert the .txt file to .ssi file first (with the same file name but the suffix difference). Then, the program reads the .ssi file as input. However, if the .ssi file (with the same name) already exist in the input directory, the program will ignore the .txt file and directly use reads the .ssi file as input. This always happens when one runs the program the 2nd time. We designed this to save the conversion time. However, if you runs the program the second time but you modified the input .txt files, please delete the corresponding .ssi files in the input directory. Otherwise, your modification will be ignored, the program will read the .ssi files converted from the older version of your .txt input.
Also, the .txt file must be prepared in listnumden form to be readable by the program. For example, the expression list(list(2,1),list(x*y,x+1))
in the .txt input file. For this purpose, if you want to automatically convert Mathematica readable input files to listnumden form, you can use this tool: pfd-parallel-listnumden-converter.
-
parallelization strategy (to be specified in the field pfdconfig.options.parallelism)
- intertwined
internal parallelism on each function, intertwined with the parallelism over the different functions - waitAll
parallelism over the different functions, no internal parallelism on individual functions - size_strategy
handling the functions serially or in parallel depending on the size of the input function pfdconfig.options.percentage then has to be set to an integer p between 0 and 100 to specify that the p/100 largest of all input functions should be processed with parallelism per individual function (with choice of algorithm specified in pfdconfig.options.algorithm)
- intertwined
-
algorithmic strategy for sequential processing of functions (to be specified in the field pfdconfig.options.algorithm)
Note that parallel processing of individual functions always uses the Leinartas strategy.- Leinartas
- MultivariateApart
If you use pfd-parallel in your research, please cite the software package:
-
Bibitem Format:
D. Bendle, J. Boehm, M. Heymann, R. Ma, M. Rahn, L. Ristau, M. Wittmann, Z. Wu, Y. Zhang: pfd-parallel, a Singular/GPI-Space package for massively parallel multivariate partial fractioning, https://github.com/singular-gpispace/pfd-parallel (2022).
-
Bibtex Format:
@misc{pfd, author = {Boehm, Janko and Heymann, Murray and Ma, Rourou and Rahn, Mirko and Ristau, Lukas and Wittmann, Marcel and Wu, Zihao and Zhang, Yang}, title = {pfd-parallel, a Singular/GPI-Space package for massively parallel multivariate partial fractioning}, url = {https://github.com/singular-gpispace/pfd-parallel}, year = {2022}}
the corresponding paper
-
Bibitem Format:
D. Bendle, J. Boehm, M. Heymann, R. Ma, M. Rahn, L. Ristau, M. Wittmann, Z. Wu, Y. Zhang: pfd-parallel, a Singular/GPI-Space package for massively parallel multivariate partial fractioning, arXiv:2104.06866 (2022).
-
Bibtex Format:
@misc{pfd, author = {Boehm, Janko and Heymann, Murray and Ma, Rourou and Rahn, Mirko and Ristau, Lukas and Wittmann, Marcel and Wu, Zihao and Zhang, Yang}, title = {pfd-parallel, a Singular/GPI-Space package for massively parallel multivariate partial fractioning}, url = {https://arxiv.org/abs/2104.06866}, year = {2022}}
and, as applicable, the papers describing the algorithms which have been used
-
Bibitem Format:
J. Boehm, M. Wittmann, Z. Wu, Y. Xu, Y. Zhang: IBP reduction coefficients made simple, JHEP (2020) 54, 39 pp, doi:10.1007/JHEP12(2020)054.
M. Heller, A. von Manteuffel: MultivariateApart: Generalized partial fractions, Comput. Phys. Commun. 271 (2022) 108174.
-
Bibtex Format:
@article{pfd, author = {Boehm, Janko and Wittmann, Marcel and Wu, Zihao and Xu, Yingxuan and Zhang, Yang}, doi = {10.1007/JHEP12(2020)054}, isbn = {1029-8479}, journal = {Journal of High Energy Physics}, number = {12}, pages = {54}, title = {IBP reduction coefficients made simple}, url = {https://doi.org/10.1007/JHEP12(2020)054}, volume = {2020}, year = {2020}}
@article{MultivariateApart, title = {MultivariateApart: Generalized partial fractions}, journal = {Computer Physics Communications}, volume = {271}, pages = {108174}, year = {2022}, issn = {0010-4655}, doi = {https://doi.org/10.1016/j.cpc.2021.108174}, url = {https://www.sciencedirect.com/science/article/pii/S0010465521002861}, author = {Matthias Heller and Andreas {von Manteuffel}}}
The project is supported by Project B5 of SFB-TRR 195. Gefördert durch die Deutsche Forschungsgemeinschaft (DFG) - Projektnummer 286237555 - TRR 195 (Funded by the Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) - Project-ID 286237555 - TRR 195).
The project is also supported by SymbTools of Forschungsinitiative RLP.
To run examples repeatedly, it can be useful to create a Singular script and a couple of shell scripts. This is described in the following, again at the above example.
We start out by creating a Singular script. It will loads the pfd_gspc.lib
library. A GPI-Space configure token is prepared, with the
configuration: The path of a temporary directory, where files will be stored
during the computation and handling of the various files at runtime, the
location of a nodefile, containing a location on then network where GPI-Space is
installed, the number of processes each node should run in parallel, the address
of a running instance of the GPI-Space monitoring tool, as well as the port on
which the monitoring tool is listening (note, the framework can be run without the
monitoring tool, in which case the corresponding entries should remain unset). Next,
the ring in which the numerators and denominators of the rational functions are contained is
declared. The input of the computation is specified in terms of files, referenced by the
row and column index in a matrix where it must be found, in the form
<basename>_<row>_<col>.(txt|ssi)
, where the suffix is txt if the file is in
plain text format, and ssi if the input files are in this high-performence binary format
used by Singular. In the text format input files, the
coordinates of the matrix entries to be calculated are given in a list of lists.
Finally, all the tokens and index pairs are provided to the parallel_pfd
function as arguments,
preferably with an optional argument for the path to where the input files are
found. The user may also provide in a separate argument the path of where the
output files should be written.
For the examples below, the user needs to set the following environment variables providing the software root and input and output directories:
export PFD_ROOT=$software_ROOT
export PFD_INPUT_DIR=$software_ROOT/input
export PFD_OUTPUT_DIR=$software_ROOT/results
An example script test_parallel_pfd.sing
in Singular for a 1 by 10 matrix is created as follows:
mkdir -p $PFD_ROOT/tempdir
hostname > $PFD_ROOT/nodefile
hostname > $PFD_ROOT/loghostfile
cat > test_parallel_pfd.sing.temp << "EOF"
LIB "pfd_gspc.lib";
// configuration for gpispace
configToken gspcconfig = configure_gspc();
gspcconfig.options.tempdir = "$PFD_ROOT/tempdir";
gspcconfig.options.nodefile = "$PFD_ROOT/nodefile";
gspcconfig.options.procspernode = 8;
// Should the user want to run withouth the gspc-monitor
// the following two lines may be commented out.
gspcconfig.options.loghostfile = "$PFD_ROOT/loghostfile";
gspcconfig.options.logport = 6439;
// configuration for the problem to be computed.
configToken pfdconfig = configure_pfd();
pfdconfig.options.filename = "xb_deg5";
pfdconfig.options.inputdir = "$PFD_INPUT_DIR";
pfdconfig.options.outputdir = "$PFD_OUTPUT_DIR";
pfdconfig.options.parallelism = "intertwined";
ring r = 0, x, lp;
list entries = list( list(1, 1), list(1, 2), list(1, 3), list(1, 4)
, list(1, 5), list(1, 6), list(1, 7), list(1, 8)
, list(1, 9), list(1, 10)
);
parallel_pfd( entries
, gspcconfig
, pfdconfig
);
exit;
EOF
We expand the environment variables in the script created above using the following script:
cat > shell_expand_script.sh << "EOF"
echo 'cat <<END_OF_TEXT' > temp.sh
cat "$1" >> temp.sh
echo 'END_OF_TEXT' >> temp.sh
bash temp.sh >> "$2"
rm temp.sh
EOF
chmod a+x shell_expand_script.sh
./shell_expand_script.sh test_parallel_pfd.sing.temp test_parallel_pfd.sing
Next, we create a script to start the graphical GPI-Space monitor displaying a Gant diagram of the computation.
Note that if you do not want to use the monitor, you can skip these steps, but have to comment out the respective lines in the script test_parallel_pfd.sing
.
cat > start_monitor.sh << "EOF"
#!/bin/bash
set -euo pipefail
# raster or native (native for X forwarding)
QT_DEBUG_PLUGINS=0 \
QT_GRAPHICSSYSTEM=native \
$PFD_INSTALL_DIR/libexec/bundle/gpispace/bin/gspc-monitor \
--port 6439 &
EOF
chmod a+x start_monitor.sh
It can be run as
./start_monitor.sh
Make sure that the --port
number matches the one set in the singular script.
Also, if this is run over ssh on a remote machine, make sure that x forwarding
is enabled.
Create the input files:
mkdir -p $PFD_INPUT_DIR
mkdir -p $PFD_OUTPUT_DIR
cp -v $PFD_INSTALL_DIR/example_data/* $PFD_INPUT_DIR
Finally, the test may be run with the script
cat > run_pfd_example.sh << "EOF"
SINGULARPATH="$PFD_INSTALL_DIR/LIB" \
$SINGULAR_INSTALL_DIR/bin/Singular \
test_parallel_pfd.sing
EOF
chmod a+x run_pfd_example.sh
which can be started with
./run_pfd_example.sh
Note, to run the same computation, but without the internal parallelism on each
entry, the parallelism
field in the pfdconfig
tokens options
field may be changed to
waitAll
.
Note: This section is not necessary if the installation via Spack has been completed. It contains everything what Spack does automatically for you.
As an alternative to Spack, pfd-parallel and its dependencies can also be compiled directly. For most users, a Spack installation should suffice, in which case this section should be skipped.
For the various dependencies, it is recommended to create a file that exports the various install locations as environment variables. For this purpose, the following command may be run at a convenient location, after which the resulting file should be edited to specify two directory roots, one for purposes of compilation and one for installation of the code. While the first should typically be a fast local file system, the second must be accessible from all computation nodes to be used for running the system.
cat > env_vars_pfd.txt << "EOF"
export software_ROOT=<software-root>
# Some fast location in local system for hosting build directories,
# for example, something like /tmpbig/$USER/pfd-parallel or just $HOME/pfd-parallel if the user has a
# fast home directory.
export install_ROOT=<install-root>
# The install root is recommended to be some network (nfs) mountpoint, where
# each node of the cluster should be able to read from, for example
# something like /scratch/$USER/pfd-parallel
export compile_ROOT=$software_ROOT
# Optionally, this might be set to something like /dev/shm/$USER/pfd-parallel that
# stores files purely in memory, thus the contents of this
# location will be lost after reboot. It can speed up the computation times, as
# all disk io becomes memory io.
# GPI-Space dependencies:
export BOOST_ROOT=$install_ROOT/boost
export Libssh2_ROOT=$install_ROOT/libssh
export Libssh2_BUILD_DIR=$compile_ROOT/libssh/build
export LD_LIBRARY_PATH="${Libssh2_ROOT}/lib"${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export GASPI_ROOT=$install_ROOT/gpi2
export cpu_arch=$(getconf LONG_BIT)
export PKG_CONFIG_PATH="${GASPI_ROOT}/lib${cpu_arch}/pkgconfig"${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
export PKG_CONFIG_PATH="${Libssh2_ROOT}/lib/pkgconfig:${Libssh2_ROOT}/lib64/pkgconfig"${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
# GPI-Space:
export GPI_ROOT_DIR=$software_ROOT
export GPISPACE_REPO=$GPI_ROOT_DIR/gpispace/gpispace
export GPISPACE_BUILD_DIR=$compile_ROOT/gpispace/build
export GPISPACE_INSTALL_DIR=$install_ROOT/gpispace
export GPISpace_ROOT=$GPISPACE_INSTALL_DIR # expected by cmake
export GSPC_HOME=$GPISPACE_INSTALL_DIR # Set mostly for legacy reasons
export SHARED_DIRECTORY_FOR_TESTS=$GPISPACE_BUILD_DIR/tests
# Singular:
export SING_ROOT=$software_ROOT/Singular
export DEP_LIBS=$install_ROOT/sing_dep_libs
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DEP_LIBS/lib
export SINGULAR_INSTALL_DIR=$install_ROOT/Singular
export SINGULAR_BUILD_DIR=$compile_ROOT/Singular/build
# PFD:
export PFD_ROOT=$software_ROOT/pfd-parallel
export PFD_REPO=$PFD_ROOT/pfd-parallel
export PFD_INSTALL_DIR=$install_ROOT/pfd-parallel
export PFD_BUILD_DIR=$compile_ROOT/pfd-parallel/build
export PFD_INPUT_DIR=$software_ROOT/input
export PFD_OUTPUT_DIR=$software_ROOT/results
EOF
As it is currently structured, the user needs only fill in the <software-root>
and the <install-root>
, then all other veriables are set relative to these.
The above structure can of course be altered to suite the compiler's setup,
as long as the scripts in this REAME are altered accordingly, since they assume
the directory structure.
Once all the locations have been set correctly, the variables can easily be
exported with the following call:
source env_vars_pfd.txt
Ensure that the compile and install roots exist:
mkdir -p $software_ROOT
mkdir -p $install_ROOT
mkdir -p $compile_ROOT
GPI-Space targets and has been successfully used on x86-64 Linux systems. Other architectures are not guaranteed to work properly at this point.
The virtual memory layer can be backed with either Ethernet, Infiniband or BeeOND.
GPI-Space supports multiple Linux distributions:
- Centos 6
- Centos 7
- Centos 8
- Ubuntu 18.04 LTS
- Ubuntu 20.04 LTS
Ensure that the GPI_ROOT_DIR
exists:
mkdir -p $GPI_ROOT_DIR
Website | Supported Versions |
---|---|
Boost | >= 1.61, <= 1.63 |
Note, that Boost 1.61 is not compatible with OpenSSL >= 1.1, so it is recommended to use Boost 1.63, as follows:
boost_version=1.63.0
cd $GPI_ROOT_DIR
mkdir boost && cd boost
git clone \
--jobs $(nproc) \
--depth 1 \
--shallow-submodules \
--recursive \
--branch boost-${boost_version} \
https://github.com/boostorg/boost.git \
boost
cd boost
./bootstrap.sh --prefix="${BOOST_ROOT}"
./b2 \
-j $(nproc) \
headers
./b2 \
cflags="-fPIC -fno-gnu-unique" \
cxxflags="-fPIC -fno-gnu-unique" \
link=static \
variant=release \
install
Website | Supported Versions |
---|---|
libssh2 | >= 1.7 |
libssh2
is not built with the OpenSSL backend on all systems. Additionally,
some versions available via package manager might not be compatible with
OpenSSH's default settings. For those reasons, it is highly recommended to build
libssh2
1.9 from scratch. Doing so is however straightforward thanks to CMake.
As additional dependencies OpenSSL
and Zlib
are required (for this any
package manager version should be sufficient). Also, unless Libssh2_ROOT
is
set to /usr
, the LD_LIBRARY_PATH
needs to be set (as in lines 2 and 3 below)
in order for applications to find the correct one.
WARNING:
- libssh2 1.7 is not compatible with OpenSSL >= 1.1.
- libssh2 <= 1.8 is incompatible with the new default SSH-key format in OpenSSH >= 7.8.
cd $GPI_ROOT_DIR
mkdir libssh && cd libssh
libssh2_version=1.9.0
git clone --jobs $(nproc) \
--depth 1 \
--shallow-submodules \
--recursive \
--branch libssh2-${libssh2_version} \
https://github.com/libssh2/libssh2.git \
libssh2
cmake -D CRYPTO_BACKEND=OpenSSL \
-D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX="${Libssh2_ROOT}" \
-D ENABLE_ZLIB_COMPRESSION=ON \
-D BUILD_SHARED_LIBS=ON \
-B $Libssh2_BUILD_DIR \
-S libssh2
cmake --build $Libssh2_BUILD_DIR \
--target install \
-j $(nproc)
Website | Supported Versions |
---|---|
GPI-2 | 1.3.2 |
If Infiniband support is required, the --with-ethernet
option can be omitted.
NOTE:
Compiling GPI2 requires gawk. Please install this with a package manager, if not already present on the system.
cd $GPI_ROOT_DIR
mkdir gpi2 && cd gpi2
gpi2_version=1.3.2 \
&& git clone \
--depth 1 \
--branch v${gpi2_version} \
https://github.com/cc-hpc-itwm/GPI-2.git \
GPI-2 \
&& cd GPI-2 \
&& grep "^CC\s*=\s*gcc$" . -lR \
| xargs sed -i'' -e '/^CC\s*=\s*gcc$/d' \
&& ./install.sh -p "${GASPI_ROOT}" \
--with-fortran=false \
--with-ethernet
NOTE:
Note that
<install-prefix>
should be set to the correct path in the script above.
The code listings in this document assume
-
${GPISPACE_REPO}
to be the directory storing the GPI-Space sources. -
${GPISPACE_BUILD_DIR}
to be an empty directory to be used for building GPI-Space. -
${GPISPACE_INSTALL_DIR}
to be a directory to install GPI-Space to. It is suggested to use a previously empty directory on a shared filesystem. -
${GPISPACE_TEST_DIR}
to be an empty directory on a shared filesystem, which used when running the system tests.
Start by cloning gpi-space:
cd $GPI_ROOT_DIR
mkdir gpispace && cd gpispace
git clone \
--depth 1 \
--branch v22.03 \
https://github.com/cc-hpc-itwm/gpispace.git \
gpispace
Should you want to build the tests, run the following command. Note, the tests significantly increase build time, so an experienced user who has built gpi-space on a given machine before might opt not to run to define the build_tests variable.
export build_tests="-DBUILD_TESTING=on
-DSHARED_DIRECTORY_FOR_TESTS=$SHARED_DIRECTORY_FOR_TESTS"
mkdir -p $SHARED_DIRECTORY_FOR_TESTS
To build GPI-Space, run
mkdir -p "${GPISPACE_BUILD_DIR}"
cmake -D CMAKE_INSTALL_PREFIX=${GPISPACE_INSTALL_DIR} \
-D CMAKE_BUILD_TYPE=Release \
-B ${GPISPACE_BUILD_DIR} \
-S ${GPISPACE_REPO} \
${build_tests:-}
cmake --build ${GPISPACE_BUILD_DIR} \
--target install \
-j $(nproc)
NOTE:
GPI-Space requires a working SSH environment with a password-less SSH-key when using the SSH RIF strategy. To ensure this, make sure when generating your ssh keypair to leave the password field empty.
NOTE:
GPI-Space requires a working SSH environment with a password-less SSH-key when using the SSH RIF strategy, the default for most applications.
By default,
${HOME}/.ssh/id_rsa
is used for authentication. If no such key exists,ssh-keygen -t rsa -b 4096 -N '' -f "${HOME}/.ssh/id_rsa" ssh-copy-id -f -i "${HOME}/.ssh/id_rsa" "${HOSTNAME}"can be used to create and register one.
The following is a simple self test, that should be sufficient for most users.
# to test with multiple nodes, set GSPC_NODEFILE_FOR_TESTS
# Slurm: export GSPC_NODEFILE_FOR_TESTS="$(generate_pbs_nodefile)"
# PBS/Torque: export GSPC_NODEFILE_FOR_TESTS="${PBS_NODEFILE}"
# and SWH_INSTALL_DIR:
# export SWH_INSTALL_DIR=<a-shared-directory-visible-on-all-nodes>
"${GPISpace_ROOT}/share/gspc/example/stochastic_with_heureka/selftest"
If GPI-Space has been built with testing enabled, then ctest
can be
used to execute the unit- and system tests. It can be ommitted, but is
recommended for first time installations.
cd "${GPISPACE_BUILD_DIR}"
export GPISPACE_TEST_DIR=$SHARED_DIRECTORY_FOR_TESTS # any empty test directoy should be good
hostname > nodefile
export GSPC_NODEFILE_FOR_TESTS="${PWD}/nodefile"
# or to test in a cluster allocation:
# Slurm: export GSPC_NODEFILE_FOR_TESTS="$(generate_pbs_nodefile)"
# PBS/Torque: export GSPC_NODEFILE_FOR_TESTS="${PBS_NODEFILE}"
ctest --output-on-failure \
-j $(nproc)
Some of these tests take a long time (811 seconds on Intel i7), and there are 294 tests in the suite at the time of writing this document.
It is recommended to install the current version of Singular, which will be required by our framework. The version of Singular found in package manager does not generally work with the PFD project.
Besides flint, Singular has various more standard dependencies, which are usually available through the package manager of your distribution. Feel free to refer to the step-by-step instructions to build Singular for more details, taking note of the tools necessary to compile Singular under point 1.b.
This document gives a thorough guide for building the various dependencies and
then finally Singular itself, all the while assuming the user does not have
sudo
/root
privileges. This guide assumes that mpfr
and gmp
are installed
by the package manager to /usr
Start by choosing a location where Singular can be cloned. This will be
indicated by $SING_ROOT
and compile the various dependencies
mkdir -p $SING_ROOT
The official guides for singular clones the latest development branch of flint. As flint is being actively developed and the APIs changed quite often, this has led to issues in the past. Therefore, it is rather recommended that a release version be downloaded and compiled instead. The newest release with which Singular can be built (at the time of writing) is version 2.6.3.
cd $SING_ROOT
mkdir flint && cd flint
wget http://www.flintlib.org/flint-2.6.3.tar.gz
tar -xvf flint-2.6.3.tar.gz
cd flint-2.6.3
./configure --with-gmp=/usr --prefix=$DEP_LIBS --with-mpfr=/usr
make -j $(nproc)
make install
mkdir -p $compile_ROOT/4ti2/build
cd $SING_ROOT
mkdir 4ti2 && cd 4ti2
wget http://www.4ti2.de/version_1.6/4ti2-1.6.tar.gz
tar xvfz 4ti2-1.6.tar.gz
pushd $compile_ROOT/4ti2/build
$SING_ROOT/4ti2/4ti2-1.6/configure --prefix=$DEP_LIBS
make -j $(nproc)
make install
popd
mkdir -p $compile_ROOT/cddlib/build
cd $SING_ROOT
mkdir cddlib && cd cddlib
wget https://github.com/cddlib/cddlib/releases/download/0.94j/cddlib-0.94j.tar.gz
tar -xvf cddlib-0.94j.tar.gz
pushd $compile_ROOT/cddlib/build
$SING_ROOT/cddlib/cddlib-0.94j/configure --prefix=$DEP_LIBS
make -j $(nproc)
make install
popd
cd $SING_ROOT
mkdir ntl && cd ntl
wget https://libntl.org/ntl-11.4.3.tar.gz
tar -xvf ntl-11.4.3.tar.gz
cd ntl-11.4.3/src # note the extra src
./configure PREFIX=$DEP_LIBS CXXFLAGS=-fPIC #notice PREFIX and CXXFLAGS is capitalized without dashes
make -j $(nproc)
make install
Singular may now be compiled against the libraries compiled and installed above.
cd $SING_ROOT
git clone \
--depth 1 \
https://github.com/Singular/Singular.git \
Sources
cd Sources
./autogen.sh
mkdir -p $SINGULAR_BUILD_DIR && pushd $SINGULAR_BUILD_DIR
CPPFLAGS="-I$DEP_LIBS/include" \
LDFLAGS="-L$DEP_LIBS/lib" \
${SING_ROOT}/Sources/configure \
--prefix=${SINGULAR_INSTALL_DIR} \
--with-flint=$DEP_LIBS \
--with-ntl=$DEP_LIBS \
--enable-gfanlib
make -j $(nproc)
make install
popd
The PFD project can now be compiled and installed.
The following environment variables must be set:
-
${GPISPACE_REPO}
The path to the repository cloned from Github. This is needed for some cmake scripts, amongst other reasons. -
${GPISPACE_INSTALL_DIR}
The install prefix used when compiling and installing gpi-space above. -
${SINGULAR_INSTALL_DIR}
The install prefix used when compiling and installing Singular above. -
${PFD_REPO}
The root of the cloned PFD project. -
${PFD_BUILD_DIR}
The path of the build directory. It is recommended to build in a separate directory to the source code, preferably starting with an empty build directory. -
${PFD_INSTALL_DIR}
The path to where the PFD project should be installed.
mkdir -p $PFD_ROOT && cd $PFD_ROOT
git clone \
--depth 1 \
https://github.com/singular-gpispace/pfd-parallel.git \
pfd-parallel
mkdir -p $PFD_BUILD_DIR
cmake -D CMAKE_INSTALL_PREFIX=$PFD_INSTALL_DIR \
-D CMAKE_BUILD_TYPE=Release \
-D GSPC_HOME=$GPISPACE_INSTALL_DIR \
-D GPISPACE_REPO=$GPISPACE_REPO \
-D SINGULAR_HOME=$SINGULAR_INSTALL_DIR \
-D FLINT_HOME=$DEP_LIBS \
-B ${PFD_BUILD_DIR} \
-S ${PFD_REPO}
cmake --build ${PFD_BUILD_DIR} \
--target install \
-j $(nproc)
Assuming that we are installing on a Ubuntu system (analogous packages exist in other distributions), we give installation instructions for standard packages which are required by the framework and may not be included in your of-the-shelf installation.
Note that the following requires root privileges. If you do not have root access, ask your administator to install these packages. You may want to check with dpkg -l <package name>
whether the package is installed already.
-
Version control system Git used for downloading sources:
sudo apt-get install git
-
Tools necessary for compiling the packages:
sudo apt-get install build-essential sudo apt-get install autoconf sudo apt-get install autogen sudo apt-get install libtool sudo apt-get install libreadline6-dev sudo apt-get install libglpk-dev sudo apt-get install cmake sudo apt-get install gawk
Or everything in one command:
sudo apt-get install build-essential autoconf autogen libtool libreadline6-dev libglpk-dev cmake gawk
-
Scientific libraries used by Singular:
sudo apt-get install libgmp-dev sudo apt-get install libmpfr-dev sudo apt-get install libcdd-dev sudo apt-get install libntl-dev
Or everything in one command:
sudo apt-get install libgmp-dev libmpfr-dev libcdd-dev libntl-dev
Note, in the above guide, we only assume libmpfr and libgmp is installed, and libcdd and libntl is built locally from sources.
-
Library required by to build libssh:
sudo apt-get install libssl-dev
-
Libraries required by GPI-Space
sudo apt-get install openssh-server sudo apt-get install hwloc sudo apt-get install libhwloc-dev sudo apt-get install libudev-dev sudo apt-get install qt5-default sudo apt-get install chrpath