Elemental is a library for distributed-memory dense and sparse-direct linear algebra that draws heavily from the PLAPACK approach of building a graph of matrix distributions with a simple interface for redistributions Elemental is also similar in functionality to ScaLAPACK, which is the very widely used effort towards extending LAPACK onto distributed-memory architectures. Unlike PLAPACK and ScaLAPACK, Elemental performs virtually all computations using element-wise, rather than block, matrix distributions (please see the first journal publication on Elemental, Elemental: A new framework for distributed memory dense matrix computations, for a detailed discussion of this design choice). Some of the unique features of Elemental include distributed implementations of:

  • High-performance pseudospectral computation and visualization
  • Quadratic-time low-rank Cholesky and LU modifications
  • Bunch-Kaufman and Bunch-Parlett for accurate symmetric factorization
  • LU and Cholesky with full pivoting
  • Column-pivoted QR and interpolative/skeleton decompositions
  • Quadratically Weighted Dynamic Halley iteration for the polar decomposition
  • Spectral Divide and Conquer Schur decomposition and Hermitian EVD
  • Many algorithms for Singular-Value soft-Thresholding (SVT)
  • Tall-skinny QR decompositions
  • Hermitian matrix functions
  • Sign-based Lyapunov/Ricatti/Sylvester solvers

For the sake of objectivity: Elemental is primarily intended to be used from C++11 or C, though interfaces to other languages, Fortran 90, Python, and R are in various stages of development. ScaLAPACK and PLAPACK routines are currently significantly more straightforward to call from Fortran.


Though Elemental does not yet fully support computation over arbitrary fields, the vast majority of its pieces do. Moving templated implementations into header files is a necessary step in the process and also allowed for certain templating techniques to exploited in order to simplify the class hierarchy.


  • 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.8 or later).

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. Building on Microsoft Windows platforms should also be possible with minor effort.