Introduction¶
Overview¶
Elemental is C++11based library that supports a wide collection of sequential and distributedmemory operations, including support for dense and sparsedirect linear algebra, Linear, Quadratic and SecondOrder Cone Programming, and lattice reduction. Furthermore, it supports such functionality for real and complex singleprecision, doubleprecision, “doubledouble”, “quaddouble”, quadprecision, and arbitraryprecision floatingpoint arithmetic.
The project originally began as an objectoriented analogue and extension of the parallel dense linear algebra library [PLAPACK], which was designed around the idea of building a graph of different matrix distributions and providing simple API for moving a matrix from one such distribution to another throughout the course of a computation. Over time, the functionality of Elemental steadily expanded beyond its beginnings; at one point, Elemental was quite similar in scope to [ScaLAPACK], the most widelyused library for extending [LAPACK] to distributedmemory architectures, but Elemental now also supports a much wider scope (including sparsedirect linear and (generalized) least squares solvers, Interior Point Methods for SecondOrder Cone Programs, and lattice reduction).
Elemental’s name is derived from the fact that, unlike PLAPACK and ScaLAPACK, its primary dense matrix distributions are designed to spread matrix entries in elementwise, as opposed to blockwise, fashions [PEtAl2013].
Elemental currently supports C++11, C, and Python interfaces, while an R interface is being maintained by Rodrigo Canales and a Julia interface is under development. Interfaces to other languages, such as Fortran 90, can be built on top of the C interface in a straightforward, if not tedious, manner. Ideally Elemental will eventually be hooked into LLVM in order to help automate the creation of external interfaces.
Dependencies¶
 Functioning C++11 and ANSI C compilers.
 A working MPI2 implementation
 BLAS and LAPACK (ideally version 3.3 or greater) implementations.
 CMake (version 2.8.12 or later for OS X and version 2.8.11 or later otherwise).
 For doubledouble and quaddouble support, QD is required.
 For arbitraryprecision arithmetic, MPFR and MPC are required.
If a sufficiently uptodate C++11 compiler is used (e.g., recent versions of
g++
or clang++
), Elemental should be straightforward to build on
Unixlike platforms. There are still a few edges left to round to support
Microsoft Windows platforms.
License and copyright¶
While the vast majority of the project is licensed under the 2clause BSD License, several components are modifications of external work that is under a different license. Please see the debian/copyright file for more details.
Further, note that Elemental optionally downloads and installs a number of libraries,such as:
 METIS, which is made available under the (equally permissive) Apache License, Version 2.0.
 ParMETIS,
which can not be used for commercial purposes (it can be disabled with the
CMake option
D EL_DISABLE_PARMETIS=TRUE
),  OpenBLAS, which is available under the
New BSD License (it can be disabled with
D EL_DISABLE_OPENBLAS=TRUE
),  BLIS, which is available under the
New BSD License (it can be disabled with
D EL_DISABLE_BLIS=TRUE
), and  ScaLAPACK, which is also available under the New BSD License (and is not built by default).
References¶
[PEtAl2013]  Jack Poulson, Bryan Marker, Robert A. van de Geijn, Jeff R. Hammond, and Nichols A. Romero, Elemental: A new framework for distributed memory dense matrix computations, ACM Transactions on Mathematical Software, Vol. 39, Issue 2, Article No. 13, 2013. DOI: http://dx.doi.org/10.1145/2427023.2427030 
[LAPACK] 

[PLAPACK]  Robert A. van de Geijn, Using PLAPACK, The MIT Press, Cambridge, MA, 1997. Currently available from: https://mitpress.mit.edu/books/usingplapack 
[ScaLAPACK]  L.S. Blackford, J. Choi, A. Cleary, E. D’Azevedo, J. Demmel, I. Dhillon, J. Dongarra, S. Hammarling, G. Henry, A. Petitet, K. Stanley, D. Walker, and C.R. Whaley, ScaLAPACK Users’ Guide, Society for Industrial and Applied Mathematics, Philadelphia, PA, 1997. Last accessed from: http://www.netlib.org/scalapack/slug/ 