# Introduction¶

## Overview¶

Elemental is C++11-based library that supports a wide collection of sequential and distributed-memory operations, including support for dense and sparse-direct linear algebra, Linear, Quadratic and Second-Order Cone Programming, and lattice reduction. Furthermore, it supports such functionality for real and complex single-precision, double-precision, “double-double”, “quad-double”, quad-precision, and arbitrary-precision floating-point arithmetic.

The project originally began as an object-oriented 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 widely-used library for extending [LAPACK] to distributed-memory architectures, but Elemental now also supports a much wider scope (including sparse-direct linear and (generalized) least squares solvers, Interior Point Methods for Second-Order 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 element-wise, as opposed to block-wise, 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 double-double and quad-double support, QD is required.
• For arbitrary-precision arithmetic, MPFR and MPC are required.

If a sufficiently up-to-date C++11 compiler is used (e.g., recent versions of g++ or clang++), Elemental should be straightforward to build on Unix-like platforms. There are still a few edges left to round to support Microsoft Windows platforms.

## 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] Anderson, Z. Bai, C. Bischof, S. Blackford, J. Demmel, J. Dongarra, J. Du Croz, A. Greenbaum, S. Hammarling, A. McKenney, and D. Sorensen, LAPACK Users’ Guide: Third Edition, Society for Industrial and Applied Mathematics, Philadelphia, PA, 1999. Last accessed from: http://www.netlib.org/lapack/lug/
 [PLAPACK] Robert A. van de Geijn, Using PLAPACK, The MIT Press, Cambridge, MA, 1997. Currently available from: https://mitpress.mit.edu/books/using-plapack
 [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/