## 4 Experiments
## 5 Results

The experiments conducted in this study demonstrate that our implementations yield considerable improvements in computational time compared to their counterparts in MKL and MAGMA, particularly in the case of the parallel version. Additionally, the solutions obtained through our implementations exhibit a substantial level of accuracy in maintaining eigenvector orthogonality and ensuring high-quality eigenpairs. The results of our experiments not only show that our implementations outperform the corresponding algorithms in MKL and MAGMA in terms of efficiency and computational speed but also highlight the practical benefits of these improvements. Specifically, the parallel version of our implementation demonstrates a notable improvement in performance, which can significantly reduce computational time and resources. Moreover, the solutions obtained using our implementations exhibit a significant degree of accuracy. The eigenvectors maintain their orthogonality, a crucial aspect of the eigendecomposition process. Additionally, the quality of the computed eigenpairs and eigenvectors is high, underlining the reliability and precision of our implementations. For experiments, we used an architecture with the following specifications: two six-core Intel Xeon X5675 processors at 3.07 GHz, 12 GB of RAM, Nvidia Tesla 2070, and Nvidia GeForce GTX 460. Also, the following software was used: CUDA (version 5.5), OpenMP (in gcc 4.7.3), MPI (OpenMPI version 1.7), MKL (version 11.1), and MAGMA (version 1.5.0) [6] compiled with Intel MKL. We generated test matrices with the dlarnv LAPACK function. We used the Forbenious matrix norm to determine how good our solutions were. We used this norm because it has a high degree of parallelism, so we obtain results quickly. To measure execution times, we use gettimeofday because using other functions, such as time from C, we only measure CPU usage, not GPU usage. MAGMA uses these same functions (masked) to calculate its times. In Figure 3, the execution time of our implementation is presented. The labels in the figure correspond to the different implementations as follows: The label _dstcdc_ represents the divide-and-conquer sequential MKL routine. The label _cuppen seq_ corresponds to our sequential implementation. The label _dstcdx_ represents the divide-and-conquer parallel MAGMA routine, utilizing 12 threads and 1 GPU. Lastly, the label _cuppen hib_ refers to our hybrid parallel implementation, which utilizes two nodes, each with six threads and 1 GPU. This figure shows the variation in execution times among the different implementations, allowing for a comparison of their respective performances. This information provides insights into the efficiency and speed of implementing the MKL and MAGMA routines in sequential and parallel settings. The results demonstrate that for a matrix size of 8000, the hybrid parallel implementation yields the best execution time. Furthermore, as the matrix size increases, the performance gap between the hybrid parallel implementation and other implementations becomes more pronounced. It is worth noting that the sequential implementation is the fastest for matrix sizes ranging from 2000 to 7000. This is a significant achievement, as the algorithmic modifications made in our sequential version have effectively reduced the execution time compared to its equivalent routine in MKL. For more detailed information and comprehensive results, please refer to \[A = \frac{1}{\alpha}B, \tag{11}\]5 Table 2 provides a detailed breakdown of the execution times for different matrix sizes, allowing for a more in-depth analysis of the performance of each implementation. After improving execution times, the next crucial aspect to consider is the quality of the results obtained. It is important to highlight that our implementations yield highly accurate eigenpairs and maintain excellent orthogonality among the eigenvectors.