<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://debianws.lexgopc.com/wiki143/index.php?action=history&amp;feed=atom&amp;title=SPIKE_algorithm</id>
	<title>SPIKE algorithm - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://debianws.lexgopc.com/wiki143/index.php?action=history&amp;feed=atom&amp;title=SPIKE_algorithm"/>
	<link rel="alternate" type="text/html" href="http://debianws.lexgopc.com/wiki143/index.php?title=SPIKE_algorithm&amp;action=history"/>
	<updated>2026-10-24T15:31:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>http://debianws.lexgopc.com/wiki143/index.php?title=SPIKE_algorithm&amp;diff=8084180&amp;oldid=prev</id>
		<title>imported&gt;Citation bot: Alter: url, title, template type. URLs might have been anonymized. Add: series, chapter. Removed parameters. | Use this bot. Report bugs. | Suggested by Headbomb | #UCB_toolbar</title>
		<link rel="alternate" type="text/html" href="http://debianws.lexgopc.com/wiki143/index.php?title=SPIKE_algorithm&amp;diff=8084180&amp;oldid=prev"/>
		<updated>2023-08-22T15:59:52Z</updated>

		<summary type="html">&lt;p&gt;Alter: url, title, template type. URLs might have been anonymized. Add: series, chapter. Removed parameters. | &lt;a href=&quot;/wiki143/index.php?title=En:WP:UCB&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;En:WP:UCB (page does not exist)&quot;&gt;Use this bot&lt;/a&gt;. &lt;a href=&quot;/wiki143/index.php?title=En:WP:DBUG&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;En:WP:DBUG (page does not exist)&quot;&gt;Report bugs&lt;/a&gt;. | Suggested by Headbomb | #UCB_toolbar&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The &amp;#039;&amp;#039;&amp;#039;SPIKE algorithm&amp;#039;&amp;#039;&amp;#039; is a hybrid [[Parallel computing|parallel]] solver for [[Band matrix|banded]] [[System of linear equations|linear systems]] developed by Eric Polizzi and [[Ahmed Sameh]]{{ref|Spike_Polizzi1}}{{note|Spike_Polizzi2}}{{ref|PSPIKE}}&lt;br /&gt;
&lt;br /&gt;
==Overview==&lt;br /&gt;
The SPIKE algorithm deals with a linear system {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;AX&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;F&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}}, where {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} is a banded &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt; matrix of [[matrix bandwidth|bandwidth]] much less than &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;, and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;F&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} is an &amp;lt;math&amp;gt;n\times s&amp;lt;/math&amp;gt; matrix containing &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; right-hand sides. It is divided into a preprocessing stage and a postprocessing stage.&lt;br /&gt;
&lt;br /&gt;
===Preprocessing stage===&lt;br /&gt;
In the preprocessing stage, the linear system {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;AX&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;F&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} is partitioned into a [[Block matrix#Block tridiagonal matrices|block tridiagonal]] form&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{A}_1 &amp;amp; \boldsymbol{B}_1\\&lt;br /&gt;
\boldsymbol{C}_2 &amp;amp; \boldsymbol{A}_2 &amp;amp; \boldsymbol{B}_2\\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots\\&lt;br /&gt;
&amp;amp; &amp;amp; \boldsymbol{C}_{p-1} &amp;amp; \boldsymbol{A}_{p-1} &amp;amp; \boldsymbol{B}_{p-1}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \boldsymbol{C}_p &amp;amp; \boldsymbol{A}_p&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1\\&lt;br /&gt;
\boldsymbol{X}_2\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{X}_{p-1}\\&lt;br /&gt;
\boldsymbol{X}_p&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{F}_1\\&lt;br /&gt;
\boldsymbol{F}_2\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{F}_{p-1}\\&lt;br /&gt;
\boldsymbol{F}_p&lt;br /&gt;
\end{bmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Assume, for the time being, that the diagonal blocks {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} ({{math|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt; {{=}} 1,...,&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;}} with {{math|&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt; &amp;amp;ge; 2}}) are [[Invertible matrix|nonsingular]]. Define a [[Block matrix#Block diagonal matrices|block diagonal]] matrix&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} diag(&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,...,&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;)}},&lt;br /&gt;
then {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} is also nonsingular. Left-multiplying {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;−1&amp;lt;/sup&amp;gt;}} to both sides of the system gives&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I} &amp;amp; \boldsymbol{V}_1\\&lt;br /&gt;
\boldsymbol{W}_2 &amp;amp; \boldsymbol{I} &amp;amp; \boldsymbol{V}_2\\&lt;br /&gt;
&amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots\\&lt;br /&gt;
&amp;amp; &amp;amp; \boldsymbol{W}_{p-1} &amp;amp; \boldsymbol{I} &amp;amp; \boldsymbol{V}_{p-1}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_p &amp;amp; \boldsymbol{I}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1\\&lt;br /&gt;
\boldsymbol{X}_2\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{X}_{p-1}\\&lt;br /&gt;
\boldsymbol{X}_p&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_1\\&lt;br /&gt;
\boldsymbol{G}_2\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{G}_{p-1}\\&lt;br /&gt;
\boldsymbol{G}_p&lt;br /&gt;
\end{bmatrix},&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which is to be solved in the postprocessing stage. Left-multiplication by {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;−1&amp;lt;/sup&amp;gt;}} is equivalent to solving &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt; systems of the form&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;[&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt; &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt; &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;] {{=}} [&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;B&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt; &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;C&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt; &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;F&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;]}}&lt;br /&gt;
(omitting {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;}} and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;C&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;}} for &amp;lt;math&amp;gt;j=1&amp;lt;/math&amp;gt;, and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;B&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} for &amp;lt;math&amp;gt;j=p&amp;lt;/math&amp;gt;), which can be carried out in parallel.&lt;br /&gt;
&lt;br /&gt;
Due to the banded nature of {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}}, only a few leftmost columns of each {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} and a few rightmost columns of each {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} can be nonzero. These columns are called the &amp;#039;&amp;#039;spikes&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
===Postprocessing stage===&lt;br /&gt;
[[Without loss of generality]], assume that each spike contains exactly &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; columns (&amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; is much less than &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;) (pad the spike with columns of zeroes if necessary). Partition the spikes in all {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} into&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{V}_j^{(t)}\\&lt;br /&gt;
\boldsymbol{V}_j&amp;#039;\\&lt;br /&gt;
\boldsymbol{V}_j^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{W}_j^{(t)}\\&lt;br /&gt;
\boldsymbol{W}_j&amp;#039;\\&lt;br /&gt;
\boldsymbol{W}_j^{(b)}\\&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}}, {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}}, {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}} and {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}} are of dimensions &amp;lt;math&amp;gt;m\times m&amp;lt;/math&amp;gt;. Partition similarly all {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} into&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_j^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_j&amp;#039;\\&lt;br /&gt;
\boldsymbol{X}_j^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt; and &amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_j^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_j&amp;#039;\\&lt;br /&gt;
\boldsymbol{G}_j^{(b)}\\&lt;br /&gt;
\end{bmatrix}.&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice that the system produced by the preprocessing stage can be reduced to a block [[Pentadiagonal matrix|pentadiagonal]] system of much smaller size (recall that &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; is much less than &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_2^{(t)}\\&lt;br /&gt;
&amp;amp; \boldsymbol{W}_2^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_2^{(b)} &amp;amp; \boldsymbol{0} \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{W}_{p-1}^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_{p-1}^{(t)}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_{p-1}^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_{p-1}^{(b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{W}_p^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_p^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(b)}\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{X}_{p-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_{p-1}^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_p^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_p^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(b)}\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{G}_{p-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_{p-1}^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_p^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_p^{(b)}&lt;br /&gt;
\end{bmatrix}\text{,}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which we call the &amp;#039;&amp;#039;reduced system&amp;#039;&amp;#039; and denote by {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;X&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}}.&lt;br /&gt;
&lt;br /&gt;
Once all {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}} and {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}} are found, all {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;′&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} can be recovered with perfect parallelism via&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\boldsymbol{X}_1&amp;#039;=\boldsymbol{G}_1&amp;#039;-\boldsymbol{V}_1&amp;#039;\boldsymbol{X}_2^{(t)}\text{,}\\&lt;br /&gt;
\boldsymbol{X}_j&amp;#039;=\boldsymbol{G}_j&amp;#039;-\boldsymbol{V}_j&amp;#039;\boldsymbol{X}_{j+1}^{(t)}-\boldsymbol{W}_j&amp;#039;\boldsymbol{X}_{j-1}^{(b)}\text{,} &amp;amp; j=2,\ldots,p-1\text{,}\\&lt;br /&gt;
\boldsymbol{X}_p&amp;#039;=\boldsymbol{G}_p&amp;#039;-\boldsymbol{W}_p\boldsymbol{X}_{p-1}^{(b)}\text{.}&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SPIKE as a polyalgorithmic banded linear system solver==&lt;br /&gt;
Despite being logically divided into two stages, computationally, the SPIKE algorithm comprises three stages:&lt;br /&gt;
# [[Matrix decomposition|factorizing]] the diagonal blocks,&lt;br /&gt;
# computing the spikes,&lt;br /&gt;
# solving the reduced system.&lt;br /&gt;
Each of these stages can be accomplished in several ways, allowing a multitude of variants. Two notable variants are the &amp;#039;&amp;#039;recursive SPIKE&amp;#039;&amp;#039; algorithm for non-[[Diagonally dominant matrix|diagonally-dominant]] cases and the &amp;#039;&amp;#039;truncated SPIKE&amp;#039;&amp;#039; 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 [[Iterative method|Krylov subspace method]]s and [[iterative refinement]].&lt;br /&gt;
&lt;br /&gt;
===Recursive SPIKE===&lt;br /&gt;
&lt;br /&gt;
====Preprocessing stage====&lt;br /&gt;
The first step of the preprocessing stage is to factorize the diagonal blocks {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}}. For numerical stability, one can use [[LAPACK]]&amp;#039;s &amp;lt;code&amp;gt;XGBTRF&amp;lt;/code&amp;gt; routines to [[LU decomposition|LU factorize]] them with partial pivoting. Alternatively, one can also factorize them without partial pivoting but with a &amp;quot;diagonal boosting&amp;quot; strategy. The latter method tackles the issue of singular diagonal blocks.&lt;br /&gt;
&lt;br /&gt;
In concrete terms, the diagonal boosting strategy is as follows. Let {{math|0&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;&amp;amp;epsilon;&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} denote a configurable &amp;quot;machine zero&amp;quot;. In each step of LU factorization, we require that the pivot satisfy the condition&lt;br /&gt;
&lt;br /&gt;
:{{math|1={{!}}pivot{{!}} &amp;amp;gt; 0&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;&amp;amp;epsilon;&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;‖&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;‖&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
If the pivot does not satisfy the condition, it is then boosted by&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\mathrm{pivot}=&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\mathrm{pivot}+\epsilon\lVert\boldsymbol{A}_j\rVert_1 &amp;amp; \text{if }\mathrm{pivot}\geq 0\text{,}\\&lt;br /&gt;
\mathrm{pivot}-\epsilon\lVert\boldsymbol{A}_j\rVert_1 &amp;amp; \text{if }\mathrm{pivot}&amp;lt;0&lt;br /&gt;
\end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where {{math|&amp;lt;var&amp;gt;&amp;amp;epsilon;&amp;lt;/var&amp;gt;}} is a positive parameter depending on the machine&amp;#039;s [[Machine epsilon|unit roundoff]], and the factorization continues with the boosted pivot. This can be achieved by modified versions of [[ScaLAPACK]]&amp;#039;s &amp;lt;code&amp;gt;XDBTRF&amp;lt;/code&amp;gt; routines. After the diagonal blocks are factorized, the spikes are computed and passed on to the postprocessing stage.&lt;br /&gt;
&lt;br /&gt;
====Postprocessing stage====&lt;br /&gt;
&lt;br /&gt;
=====The two-partition case=====&lt;br /&gt;
In the two-partition case, i.e., when {{math|&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt; {{=}} 2}}, the reduced system {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;X&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} has the form&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; \boldsymbol{W}_2^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(b)}&lt;br /&gt;
\end{bmatrix}\text{.}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An even smaller system can be extracted from the center:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(t)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(t)}&lt;br /&gt;
\end{bmatrix}\text{,}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which can be solved using the [[Block LU decomposition|block LU factorization]]&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m\\&lt;br /&gt;
\boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)}\\&lt;br /&gt;
&amp;amp; \boldsymbol{I}_m-\boldsymbol{W}_2^{(t)}\boldsymbol{V}_1^{(b)}&lt;br /&gt;
\end{bmatrix}\text{.}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}} and {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|2|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}} are found, {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}} and {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|2|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}} can be computed via&lt;br /&gt;
&lt;br /&gt;
:{{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}} {{=}} {{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}} &amp;amp;minus; {{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|2|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}},&lt;br /&gt;
:{{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|2|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}} {{=}} {{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|2|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}} &amp;amp;minus; {{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|2|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}}.&lt;br /&gt;
&lt;br /&gt;
=====The multiple-partition case=====&lt;br /&gt;
Assume that {{math|&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;}} is a power of two, i.e., {{math|&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt; {{=}} 2&amp;lt;sup&amp;gt;&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;lt;/sup&amp;gt;}}. Consider a block diagonal matrix&lt;br /&gt;
&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; {{=}} diag({{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|[1]}},...,{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;/2|[1]}})}}&lt;br /&gt;
&lt;br /&gt;
where&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\boldsymbol{\tilde{D}}_k^{[1]}=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_{2k-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_{2k-1}^{(b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{W}_{2k}^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; \boldsymbol{W}_{2k}^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for {{math|&amp;lt;var&amp;gt;k&amp;lt;/var&amp;gt; {{=}} 1,...,&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;/2}}. Notice that {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;}} essentially consists of diagonal blocks of order {{math|4&amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt;}} extracted from {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}}. Now we factorize {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} as&lt;br /&gt;
&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
The new matrix {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}} has the form&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_{3m} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_1^{[2](t)}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{[2](b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{W}_2^{[2](t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_2^{[2](t)}\\&lt;br /&gt;
&amp;amp; \boldsymbol{W}_2^{[2](b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_{3m} &amp;amp; \boldsymbol{V}_2^{[2](b)} &amp;amp; \boldsymbol{0} \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{W}_{p/2-1}^{[2](t)} &amp;amp; \boldsymbol{I}_{3m} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_{p/2-1}^{[2](t)}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_{p/2-1}^{[2](b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_{p/2-1}^{[2](b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{W}_{p/2}^{[2](t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_{p/2}^{[2](b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_{3m}&lt;br /&gt;
\end{bmatrix}\text{.}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Its structure is very similar to that of {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}}, only differing in the number of spikes and their height (their width stays the same at {{math|&amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt;}}). Thus, a similar factorization step can be performed on {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;}} to produce&lt;br /&gt;
&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
and&lt;br /&gt;
&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;}}.&lt;br /&gt;
&lt;br /&gt;
Such factorization steps can be performed recursively. After {{math|&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt; &amp;amp;minus; 1}} steps, we obtain the factorization&lt;br /&gt;
&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;⋯&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;amp;minus;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}},&lt;br /&gt;
&lt;br /&gt;
where {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} has only two spikes. The reduced system will then be solved via&lt;br /&gt;
&lt;br /&gt;
:{{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;X&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} {{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;|&amp;amp;minus;1}}{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;amp;minus;1|&amp;amp;minus;1}}⋯{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|1|&amp;amp;minus;1}}&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;G&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}}.&lt;br /&gt;
&lt;br /&gt;
The block LU factorization technique in the two-partition case can be used to handle the solving steps involving {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;}}, ..., {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;D&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;amp;minus;1&amp;lt;/sub&amp;gt;}} and {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;S&amp;amp;#x303;&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;lt;sub&amp;gt;&amp;lt;var&amp;gt;d&amp;lt;/var&amp;gt;&amp;lt;/sub&amp;gt;}} for they essentially solve multiple independent systems of generalized two-partition forms.&lt;br /&gt;
&lt;br /&gt;
Generalization to cases where {{math|&amp;lt;var&amp;gt;p&amp;lt;/var&amp;gt;}} is not a power of two is almost trivial.&lt;br /&gt;
&lt;br /&gt;
===Truncated SPIKE===&lt;br /&gt;
When {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} is diagonally-dominant, in the reduced system&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
\boldsymbol{0} &amp;amp; \boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_2^{(t)}\\&lt;br /&gt;
&amp;amp; \boldsymbol{W}_2^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_2^{(b)} &amp;amp; \boldsymbol{0} \\&lt;br /&gt;
&amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{W}_{p-1}^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{V}_{p-1}^{(t)}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_{p-1}^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_{p-1}^{(b)} &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{W}_p^{(t)} &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{0}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_p^{(b)} &amp;amp; \boldsymbol{0} &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(b)}\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{X}_{p-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_{p-1}^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_p^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_p^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(b)}\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{G}_{p-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_{p-1}^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_p^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_p^{(b)}&lt;br /&gt;
\end{bmatrix}\text{,}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the blocks {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;V&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;t&amp;#039;&amp;#039;)}}}} and {{math|{{SubSup|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;W&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;|&amp;lt;var&amp;gt;j&amp;lt;/var&amp;gt;|(&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)}}}} are often negligible. With them omitted, the reduced system becomes block diagonal&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{I}_m\\&lt;br /&gt;
&amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_1^{(b)}\\&lt;br /&gt;
&amp;amp; \boldsymbol{W}_2^{(t)} &amp;amp; \boldsymbol{I}_m\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_2^{(b)}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; \ddots &amp;amp; \ddots &amp;amp; \ddots\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_{p-1}^{(t)} &amp;amp; \boldsymbol{I}_m\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{I}_m &amp;amp; \boldsymbol{V}_{p-1}^{(b)}\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{W}_p^{(t)} &amp;amp; \boldsymbol{I}_m\\&lt;br /&gt;
&amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; &amp;amp; \boldsymbol{I}_m&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{X}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_2^{(b)}\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{X}_{p-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_{p-1}^{(b)}\\&lt;br /&gt;
\boldsymbol{X}_p^{(t)}\\&lt;br /&gt;
\boldsymbol{X}_p^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
=&lt;br /&gt;
\begin{bmatrix}&lt;br /&gt;
\boldsymbol{G}_1^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_1^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_2^{(b)}\\&lt;br /&gt;
\vdots\\&lt;br /&gt;
\boldsymbol{G}_{p-1}^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_{p-1}^{(b)}\\&lt;br /&gt;
\boldsymbol{G}_p^{(t)}\\&lt;br /&gt;
\boldsymbol{G}_p^{(b)}&lt;br /&gt;
\end{bmatrix}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and can be easily solved in parallel {{ref|Truncated_Spike}}.&lt;br /&gt;
&lt;br /&gt;
The truncated SPIKE algorithm can be wrapped inside some outer iterative scheme (e.g., [[Biconjugate gradient stabilized method|BiCGSTAB]] or [[iterative refinement]]) to improve the accuracy of the solution.&lt;br /&gt;
&lt;br /&gt;
==SPIKE for tridiagonal systems==&lt;br /&gt;
The first SPIKE partitioning and algorithm was presented in {{ref|KuckSameh78}} 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 {{ref|Venetis_gSpike_GPU}}.  A SPIKE-based algorithm for the GPU that is based on a special  block diagonal pivoting strategy is described in {{ref|Chang_tridiagonal_GPU}}.&lt;br /&gt;
&lt;br /&gt;
==SPIKE as a preconditioner==&lt;br /&gt;
The SPIKE algorithm can also function as a preconditioner for iterative methods for solving linear systems. To solve a linear system {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;Ax&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039; {{=}} &amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;b&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} using a SPIKE-preconditioned iterative solver, one extracts center bands from {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} to form a banded preconditioner {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;M&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} and solves linear systems involving {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;M&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} in each iteration with the SPIKE algorithm.&lt;br /&gt;
&lt;br /&gt;
In order for the preconditioner to be effective, row and/or column permutation is usually necessary to move &amp;quot;heavy&amp;quot; elements of {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}} close to the diagonal so that they are covered by the preconditioner. This can be accomplished by computing the [[Algebraic connectivity#The Fiedler vector|weighted spectral reordering]] of {{math|&amp;#039;&amp;#039;&amp;#039;&amp;lt;var&amp;gt;A&amp;lt;/var&amp;gt;&amp;#039;&amp;#039;&amp;#039;}}.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Implementations==&lt;br /&gt;
[[Intel]] offers an implementation of the SPIKE algorithm under the name &amp;#039;&amp;#039;Intel Adaptive Spike-Based Solver&amp;#039;&amp;#039; {{ref|1}}. Tridiagonal solvers have also been developed for the NVIDIA GPU &lt;br /&gt;
{{ref|Venetis_gSpike_GPU}}{{ref|Chang_tridiagonal_GPU}} and the Xeon Phi co-processors. The method in  {{ref|Chang_tridiagonal_GPU}} is the basis for a tridiagonal solver in the cuSPARSE library.&amp;lt;ref&amp;gt;NVIDIA, Accessed October 28, 2014. CUDA Toolkit Documentation v. 6.5: cuSPARSE, http://docs.nvidia.com/cuda/cusparse.&amp;lt;/ref&amp;gt; The Givens rotations based solver was also implemented for the &lt;br /&gt;
GPU and the Intel Xeon Phi.&amp;lt;ref&amp;gt;{{cite web |url=https://www.researchgate.net/publication/282286515 |last1=Venetis |first1=Ioannis |last2=Sobczyk |first2=Aleksandros |last3=Kouris |first3=Alexandros |last4=Nakos |first4=Alexandros |last5=Nikoloutsakos |first5=Nikolaos |last6=Gallopoulos |first6=Efstratios |date=2015-09-03 |title=A general tridiagonal solver for coprocessors: Adapting g-Spike for the Intel Xeon Phi |via=[[ResearchGate]]}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
# {{note|Spike_Polizzi1}}{{Cite journal| last2 = Sameh| first1 = E.| first2 = A. H.| title = A parallel hybrid banded system solver: the SPIKE algorithm| journal = Parallel Computing| volume = 32| issue = 2| pages = 177–194| year = 2006| last1 = Polizzi| doi = 10.1016/j.parco.2005.07.005}}&lt;br /&gt;
# {{note|Spike_Polizzi2}}{{Cite journal| last2 = Sameh| first1 = E.| first2 = A. H.| title = SPIKE: A parallel environment for solving banded linear systems| journal = Computers &amp;amp; Fluids| volume = 36| pages = 113–141| year = 2007| last1 = Polizzi| doi = 10.1016/j.compfluid.2005.07.005}}&lt;br /&gt;
# {{note|Truncated_Spike}}{{Cite journal | first1 = C. C. K. | last2 = Manguoglu | first2 = M. | title = Analysis of the Truncated SPIKE Algorithm| last1 = Mikkelsen | journal = [[SIAM Journal on Matrix Analysis and Applications|SIAM J. Matrix Anal. Appl.]] | volume = 30| issue = 4 | pages = 1500–1519| year = 2008 | doi = 10.1137/080719571| citeseerx = 10.1.1.514.8748}}&lt;br /&gt;
#  {{note|PSPIKE}}{{cite book | last1 = Manguoglu | first1 = M. | last2 = Sameh | first2 = A. H. | last3 = Schenk | first3 = O. | title = Euro-Par 2009 Parallel Processing | chapter = PSPIKE: A Parallel Hybrid Sparse Linear System Solver | series = Lecture Notes in Computer Science | year = 2009 | volume = 5704 | pages = 797–808 | bibcode = 2009LNCS.5704..797M | doi = 10.1007/978-3-642-03869-3_74 | isbn = 978-3-642-03868-6 | doi-access = free }}&lt;br /&gt;
# {{note|1}}{{cite web|url=http://software.intel.com/en-us/articles/intel-adaptive-spike-based-solver/|title=Intel Adaptive Spike-Based Solver - Intel Software Network|access-date=2009-03-23}}&lt;br /&gt;
# {{note|KuckSameh78}}{{Cite journal| doi = 10.1145/322047.322054| title = On Stable Parallel Linear System Solvers| year = 1978| last1 = Sameh | first1 = A. H.| last2 = Kuck | first2 = D. J.| journal = Journal of the ACM| volume = 25| pages = 81–91 | s2cid = 17109524| doi-access = free}}&lt;br /&gt;
# {{note|Venetis_gSpike_GPU}}{{Cite journal| title = A direct tridiagonal solver based on Givens rotations for GPU architectures| year = 2015| last1 = Venetis|first1=I.E.|last2=Kouris|first2=A.|last3=Sobczyk|first3=A.|last4=Gallopoulos|first4=E.|last5= Sameh | first5 = A. H.| journal = Parallel Computing| volume = 25| pages = 101–116|doi=10.1016/j.parco.2015.03.008 }}&lt;br /&gt;
# {{note|Chang_tridiagonal_GPU}}{{Cite journal| title = A scalable, numerically stable, high-performance tridiagonal solver using GPUs| year = 2012| last1 = Chang|first1=L.-W.|last2=Stratton|first2=J.|last3=Kim|first3=H.|last4=Hwu|first4=W.-M.| journal = Proc. Int&amp;#039;l. Conf. High Performance Computing, Networking Storage and Analysis (SC&amp;#039;12)| pages =  27:1–27:11|location=Los Alamitos, CA, USA|publisher=IEEE Computer Soc. Press|isbn= 978-1-4673-0804-5 }}&lt;br /&gt;
&lt;br /&gt;
==Further reading==&lt;br /&gt;
* {{cite book |last1=Gallopoulos |first1=E. |last2= Philippe | first2=B.| last3=Sameh |first3= A.H.|date= 2015|title=Parallelism in Matrix Computations |url= https://www.springer.com/in/book/9789401771870 |publisher=Springer |isbn=978-94-017-7188-7}}&lt;br /&gt;
&lt;br /&gt;
{{Numerical linear algebra}}&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Spike Algorithm}}&lt;br /&gt;
[[Category:Numerical linear algebra]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Citation bot</name></author>
	</entry>
</feed>