SPIKE algorithm
The SPIKE algorithm is a hybrid parallel solver for banded linear systems developed by Eric Polizzi and Ahmed Sameh Overview. The SPIKE algorithm deals with a linear system , where is a banded formula_1 matrix of bandwidth much less than formula_2, and is an formula_3 matrix containing formula_4 right-hand sides. It is divided into a preprocessing stage and a postprocessing stage. Preprocessing stage. In the preprocessing stage, the linear system is partitioned into a block tridiagonal form Assume, for the time being, that the diagonal blocks ( with ) are nonsingular. Define a block diagonal matrix then is also nonsingular . Left-multiplying to both sides of the system gives which is to be solved in the postprocessing stage. Left-multiplication by is equivalent to solving formula_7 systems of the form (omitting and for formula_8, and and for formula_9), which can be carried out in parallel. Due to the banded nature of , only a few leftmost columns of each and a few rightmost columns of each can be nonzero. These columns are called the "spikes". Postprocessing stage. Without loss of generality, assume that each spike contains exactly formula_10 columns (formula_10 is much less than formula_2) (pad the spike with columns of  zeroes if necessary). Partition the spikes in all and into where , , and are of dimensions formula_15. Partition similarly all and into Notice that the system produced by the preprocessing stage can be reduced to a block pentadiagonal system of much smaller size (recall that formula_10 is much less than formula_2) which we call the "reduced system" and denote by . Once all and are found, all can be recovered with perfect parallelism via SPIKE as a polyalgorithmic banded linear system solver. Despite being logically divided into two stages, computationally, the SPIKE algorithm comprises three stages: Each of these stages can be  accomplished in several ways, allowing a multitude of variants. Two notable variants are the "recursive SPIKE" algorithm for non-diagonally-dominant cases and the "truncated SPIKE" algorithm for diagonally-dominant cases. Depending on the variant, a system can be solved either exactly or approximately. In the latter case, SPIKE is used as a preconditioner for iterative schemes like Krylov subspace methods and iterative refinement. Recursive SPIKE. Preprocessing stage. The first step of the preprocessing stage is to factorize the diagonal blocks . For numerical stability, one can use LAPACK's codice_1 routines to LU factorize them with partial pivoting. Alternatively, one  can also factorize them without partial pivoting but with a "diagonal boosting" strategy. The latter method tackles the issue of singular diagonal blocks. In concrete terms, the diagonal boosting strategy is as follows. Let denote a configurable "machine zero". In each step of LU factorization, we require that the pivot satisfy the condition If the pivot does not satisfy the condition, it is then boosted by where is a positive parameter depending on the machine's unit roundoff, and the factorization continues with the boosted pivot. This can be achieved by modified versions of ScaLAPACK's codice_2 routines. After the  diagonal blocks are factorized, the spikes are computed and passed on to the postprocessing stage. Postprocessing stage. The two-partition case. In the two-partition case, i.e., when , the reduced system has the form An even smaller system can be extracted from the center: which can be solved using the block LU factorization Once and are found, and can be computed via The multiple-partition case. Assume that is a power of two, i.e., . Consider a block diagonal matrix where for . Notice that essentially consists of diagonal blocks of order extracted from . Now we factorize as The new matrix has  the form Its structure is very similar to that of , only differing in the number of spikes and their height (their width stays the same at ). Thus, a similar factorization step can be performed on to produce and Such factorization steps can be performed recursively. After steps, we obtain the factorization where has only two spikes. The reduced system will then be solved via The block LU factorization technique in the two-partition case can be used to handle the solving steps involving , ..., and for they essentially solve multiple independent systems of generalized two-partition forms. Generalization to cases where  is not a power of two is almost trivial. Truncated SPIKE. When is diagonally-dominant, in the reduced system the blocks and are often negligible. With them omitted, the reduced system becomes block diagonal and can be easily solved in parallel . The truncated SPIKE algorithm can be wrapped inside some outer iterative scheme (e.g., BiCGSTAB or iterative refinement) to improve the accuracy of the solution. SPIKE for tridiagonal systems. The first SPIKE partitioning and algorithm was presented in and was designed as the means to improve the stability properties of a parallel Givens rotations-based solver for tridiagonal systems. A  version of the algorithm, termed g-Spike, that is based on serial Givens rotations applied independently on each block was designed for the NVIDIA GPU . A SPIKE-based algorithm for the GPU that is based on a special block diagonal pivoting strategy is described in . SPIKE as a preconditioner. The SPIKE algorithm can also function as a preconditioner for iterative methods for solving linear systems. To solve a linear system using a SPIKE-preconditioned iterative solver, one extracts center bands from to form a banded preconditioner and solves linear systems involving in each iteration with the SPIKE algorithm. In order  for the preconditioner to be effective, row and/or column permutation is usually necessary to move "heavy" elements of close to the diagonal so that they are covered by the preconditioner. This can be accomplished by computing the weighted spectral reordering of . The SPIKE algorithm can be generalized by not restricting the preconditioner to be strictly banded. In particular, the diagonal block in each partition can be a general matrix and thus handled by a direct general linear system solver rather than a banded solver. This enhances the preconditioner, and hence allows better chance of convergence and reduces the number of  iterations. Implementations. Intel offers an implementation of the SPIKE algorithm under the name "Intel Adaptive Spike-Based Solver" . Tridiagonal solvers have also been developed for the NVIDIA GPU GPU and the Intel Xeon Phi.