2-dimensional (2D) process grid and restricting the communication to take place within either the row direction or the column direction. Depending on the size of the matrix, ELPA2 scales to at least tens of thousands of CPU cores [@elpa_marek_2014; @elpa_gutheil_2014; @elpa_cook_2018].

Tridiagonal-to-Banded Back-Transformation of Eigenvectors {#subsec:cpu_step4}
---------------------------------------------------------

We now summarize the tridiagonal-to-banded back-transformation algorithm and its CPU implementation in ELPA2. The reader is also referred to Refs. [@2stage_lang_1993; @2stage_bischof_1994; @elpa_auckenthaler_2011; @elpa_auckenthaler_2013]. ELPA2 relies on the “bulge chasing” algorithm [@2stage_lang_1993; @2stage_bischof_1994] to reduce a banded matrix $\boldsymbol{B}$ to a tridiagonal matrix $\boldsymbol{T}$. Let $N$ and $b$ denote the dimension and semi-bandwidth of $\boldsymbol{B}$, respectively. The banded-to-tridiagonal transformation is done in $N-2$ stages, with $(N-i)/b$ sweeps in the $i^\text{th}$ stage. The first sweep of the $i^\text{th}$ stage reduces the $i^\text{th}$ column of $\boldsymbol{B}$ to the target tridiagonal form, at the same time introducing fill-ins (“bulges”) to the remainder of $\boldsymbol{B}$. From the second sweep on, the first column of the fill-ins introduced in the previous sweep is eliminated, while introducing new fill-ins further down the matrix. The transformation applied in the $j^\text{th}$ sweep of the $i^\text{th}$ stage can be written as $$\label{eq:householder}
\boldsymbol{Q}_{(i,j)} = \boldsymbol{Q}^*_{(i,j)} = \boldsymbol{I} - \tau_{(i,j)} \boldsymbol{v}_{(i,j)} \boldsymbol{v}_{(i,j)}^* ,$$

