process. Likewise, the bottom three rows of $\boldsymbol{X}_\text{local}$ must be exchanged with the lower adjacent process in the same process column. The middle part of $\boldsymbol{X}_\text{local}$ is not involved in any data exchange. It appears in Fig. \[fig:step4\] that almost the entire $\boldsymbol{X}_\text{local}$ matrix needs to be exchanged between adjacent process rows, as there is only one row in the middle part. However, the height of the middle part actually increases with the matrix size $N$, whereas the height of the top and bottom parts can never exceed the semi-bandwidth $b$. Therefore, the amount of data that needs to be exchanged, i.e., data in the top and bottom parts, is limited by $b$, usually accounting for a small fraction of $\boldsymbol{X}_\text{local}$.

GPU Acceleration of ELPA2 {#sec:gpu_2stage}
=========================

In ELPA2, the two-stage tridiagonalization is implemented as five separate subroutines corresponding to the five steps in Eq. \[eq:2stage\]. The input, output, and internal working matrices of ELPA2 are distributed across CPU cores. ELPA2 relies on its own explicit MPI calls to handle distributed linear algebra operations. The efficient MPI communication pattern in the CPU version of ELPA2 is not altered in the GPU version, where GPU acceleration is mainly realized by substituting 