Proper CUDA library for huge Hermitian eigenvalue tasks

I am trying to update some fortran code from using CPU to using GPU. The task is to diagonalize a massive (10^6x10^6) sparse, complex, Hermitian matrix. Since I’m working with a Tesla K80 CUDA seems the best choice. Of the libraries that are listed on nVidia’s boast page:

  • cuSolver has sparse functions but the only sparse eigenvalue function is a shift-inverse algorithm which can only find the nearest eigenvalue to an initial guess.
  • CULA doesn’t seem to have a sparse eigenvalue solver.
  • cuSparse doesn’t seem to have a sparse eigenvalue solver.
  • ArrayFire doesn’t seem to have a sparse eigenvalue solver.
  • MAGMA has a symmetric/Hermitian sparse eigenvalue solver but would require me to build an interface.

So it seems that MAGMA is my only choice but does require some interfacing to work with fortran. Also, I’m not entirely convinced the standard CUDA toolkit (which I’ve installed) comes with MAGMA so I’ll have to install it.

Am I basically right in my characterizations?

I believe MAGMA does provide interface modules under the “control” directory. Though, it looks like they are configured to use integers to pass in the pointers to the device data. Hence if you want to use CUDA Fortran, then you’d probably need to create the interface yourself.


Unfortunately I am using CUDA Fortran to make it easier for other members on my team to work with the code (I pretty much only know C# and Matlab anyway). Do you have any suggestion of documentation for interface building in Fortran?
Also, I am a bit nervous about installing MAGMA myself and was wondering if you knew what happens if I install it improperly (with the wrong make options or some such) - whether it’s a matter of deleting some files and trying again or something more drastic?

I don’t have any experience with MAGMA so unless another user jumps in here, I’d suggest directing your questions to the MAGMA user forums:

For example CUDA Fortran interfaces, we document all of the CUDA Library interfaces here:
Hopefully this can give you ideas on how best to add interfaces to MAGMA.