SPIKE algorithm
The SPIKE algorithm is a hybrid parallel solver for banded linear systems developed by Eric Polizzi and Ahmed Sameh[1]<templatestyles src="Citation/styles.css"/>^ [2]
Overview
The SPIKE algorithm deals with a linear system AX = FScript error: No such module "Check for unknown parameters"., where AScript error: No such module "Check for unknown parameters". is a banded matrix of bandwidth much less than , and FScript error: No such module "Check for unknown parameters". is an matrix containing right-hand sides. It is divided into a preprocessing stage and a postprocessing stage.
Preprocessing stage
In the preprocessing stage, the linear system AX = FScript error: No such module "Check for unknown parameters". is partitioned into a block tridiagonal form
Assume, for the time being, that the diagonal blocks AjScript error: No such module "Check for unknown parameters". (j = 1,...,pScript error: No such module "Check for unknown parameters". with p ≥ 2Script error: No such module "Check for unknown parameters".) are nonsingular. Define a block diagonal matrix
- D = diag(A1,...,Ap)Script error: No such module "Check for unknown parameters".,
then DScript error: No such module "Check for unknown parameters". is also nonsingular. Left-multiplying D−1Script error: No such module "Check for unknown parameters". to both sides of the system gives
which is to be solved in the postprocessing stage. Left-multiplication by D−1Script error: No such module "Check for unknown parameters". is equivalent to solving systems of the form
- Aj[Vj Wj Gj] = [Bj Cj Fj]Script error: No such module "Check for unknown parameters".
(omitting W1Script error: No such module "Check for unknown parameters". and C1Script error: No such module "Check for unknown parameters". for , and VpScript error: No such module "Check for unknown parameters". and BpScript error: No such module "Check for unknown parameters". for ), which can be carried out in parallel.
Due to the banded nature of AScript error: No such module "Check for unknown parameters"., only a few leftmost columns of each VjScript error: No such module "Check for unknown parameters". and a few rightmost columns of each WjScript error: No such module "Check for unknown parameters". can be nonzero. These columns are called the spikes.
Postprocessing stage
Without loss of generality, assume that each spike contains exactly columns ( is much less than ) (pad the spike with columns of zeroes if necessary). Partition the spikes in all VjScript error: No such module "Check for unknown parameters". and WjScript error: No such module "Check for unknown parameters". into
- and
where V (t)
j Script error: No such module "Check for unknown parameters"., V (b)
j Script error: No such module "Check for unknown parameters"., W (t)
j Script error: No such module "Check for unknown parameters". and W (b)
j Script error: No such module "Check for unknown parameters". are of dimensions . Partition similarly all XjScript error: No such module "Check for unknown parameters". and GjScript error: No such module "Check for unknown parameters". into
- and
Notice that the system produced by the preprocessing stage can be reduced to a block pentadiagonal system of much smaller size (recall that is much less than )
which we call the reduced system and denote by S̃X̃ = G̃Script error: No such module "Check for unknown parameters"..
Once all X (t)
j Script error: No such module "Check for unknown parameters". and X (b)
j Script error: No such module "Check for unknown parameters". are found, all X′jScript error: No such module "Check for unknown parameters". 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:
- factorizing the diagonal blocks,
- computing the spikes,
- solving the reduced system.
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 AjScript error: No such module "Check for unknown parameters".. For numerical stability, one can use LAPACK's XGBTRF 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 0εScript error: No such module "Check for unknown parameters". denote a configurable "machine zero". In each step of LU factorization, we require that the pivot satisfy the condition
- |pivot| > 0ε‖A‖1Script error: No such module "Check for unknown parameters"..
If the pivot does not satisfy the condition, it is then boosted by
where εScript error: No such module "Check for unknown parameters". 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 XDBTRF 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 p = 2Script error: No such module "Check for unknown parameters"., the reduced system S̃X̃ = G̃Script error: No such module "Check for unknown parameters". has the form
An even smaller system can be extracted from the center:
which can be solved using the block LU factorization
Once X (b)
1 Script error: No such module "Check for unknown parameters". and X (t)
2 Script error: No such module "Check for unknown parameters". are found, X (t)
1 Script error: No such module "Check for unknown parameters". and X (b)
2 Script error: No such module "Check for unknown parameters". can be computed via
- X (t)
1 = G (t)
1 − V (t)
1 X (t)
2 Script error: No such module "Check for unknown parameters"., - X (b)
2 = G (b)
2 − W (b)
2 X (b)
1 Script error: No such module "Check for unknown parameters"..
The multiple-partition case
Assume that pScript error: No such module "Check for unknown parameters". is a power of two, i.e., p = 2dScript error: No such module "Check for unknown parameters".. Consider a block diagonal matrix
- D̃1 = diag(D̃ [1]
1 ,...,D̃ [1]
p/2 )Script error: No such module "Check for unknown parameters".
where
for k = 1,...,p/2Script error: No such module "Check for unknown parameters".. Notice that D̃1Script error: No such module "Check for unknown parameters". essentially consists of diagonal blocks of order 4mScript error: No such module "Check for unknown parameters". extracted from S̃Script error: No such module "Check for unknown parameters".. Now we factorize S̃Script error: No such module "Check for unknown parameters". as
- S̃ = D̃1S̃2Script error: No such module "Check for unknown parameters"..
The new matrix S̃2Script error: No such module "Check for unknown parameters". has the form
Its structure is very similar to that of S̃2Script error: No such module "Check for unknown parameters"., only differing in the number of spikes and their height (their width stays the same at mScript error: No such module "Check for unknown parameters".). Thus, a similar factorization step can be performed on S̃2Script error: No such module "Check for unknown parameters". to produce
- S̃2 = D̃2S̃3Script error: No such module "Check for unknown parameters".
and
- S̃ = D̃1D̃2S̃3Script error: No such module "Check for unknown parameters"..
Such factorization steps can be performed recursively. After d − 1Script error: No such module "Check for unknown parameters". steps, we obtain the factorization
- S̃ = D̃1⋯D̃d−1S̃dScript error: No such module "Check for unknown parameters".,
where S̃dScript error: No such module "Check for unknown parameters". has only two spikes. The reduced system will then be solved via
- X̃ = S̃ −1
d D̃ −1
d−1 ⋯D̃ −1
1 G̃Script error: No such module "Check for unknown parameters"..
The block LU factorization technique in the two-partition case can be used to handle the solving steps involving D̃1Script error: No such module "Check for unknown parameters"., ..., D̃d−1Script error: No such module "Check for unknown parameters". and S̃dScript error: No such module "Check for unknown parameters". for they essentially solve multiple independent systems of generalized two-partition forms.
Generalization to cases where pScript error: No such module "Check for unknown parameters". is not a power of two is almost trivial.
Truncated SPIKE
When AScript error: No such module "Check for unknown parameters". is diagonally-dominant, in the reduced system
the blocks V (t)
j Script error: No such module "Check for unknown parameters". and W (b)
j Script error: No such module "Check for unknown parameters". are often negligible. With them omitted, the reduced system becomes block diagonal
and can be easily solved in parallel [3].
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 [4] 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 [5]. A SPIKE-based algorithm for the GPU that is based on a special block diagonal pivoting strategy is described in [6].
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 Ax = bScript error: No such module "Check for unknown parameters". using a SPIKE-preconditioned iterative solver, one extracts center bands from AScript error: No such module "Check for unknown parameters". to form a banded preconditioner MScript error: No such module "Check for unknown parameters". and solves linear systems involving MScript error: No such module "Check for unknown parameters". 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 AScript error: No such module "Check for unknown parameters". close to the diagonal so that they are covered by the preconditioner. This can be accomplished by computing the weighted spectral reordering of AScript error: No such module "Check for unknown parameters"..
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 [7]. Tridiagonal solvers have also been developed for the NVIDIA GPU [8][9] and the Xeon Phi co-processors. The method in [10] is the basis for a tridiagonal solver in the cuSPARSE library.[1] The Givens rotations based solver was also implemented for the GPU and the Intel Xeon Phi.[2]
References
<templatestyles src="Reflist/styles.css" />
- ↑ NVIDIA, Accessed October 28, 2014. CUDA Toolkit Documentation v. 6.5: cuSPARSE, http://docs.nvidia.com/cuda/cusparse.
- ↑ Script error: No such module "citation/CS1".
Script error: No such module "Check for unknown parameters".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
- <templatestyles src="Citation/styles.css"/>^ Script error: No such module "Citation/CS1".
Further reading
- Script error: No such module "citation/CS1".