I implemented a distributed method in Julia for computing smallest eigenvalues and the corresponding eigenvectors of large sparse (symmetric) matrices. I wanted to compare my implementation with a baseline eigensolver in Julia. However, I failed to find an eigensolver in Julia community for computing eigenpairs of large and sparse matrices. I found many packages like:
But none of them has the eigensolver I want. Some eigensolvers in Elemental.jl could would for distributed arrays/matrices, e.g., eigHermitian, but it seems they do not work for distributed sparse matrices.
Could anyone tell me if there is such an eigensolver in Julia community? Which package? It’d be better with some examples.
This is very nice! How did you define the sparse distributed matrix?
I have never done it but in principle, you could use KrylovKit on a linear mapping (e.g. a function) which accepts a distributed vector.
But none of them has the eigensolver I want.
If your matrices do not find on the memory of one node, I think your best option is to use SLEPc. There is SlepcWrap.jl to provide some interface from Julia, but you’ll need to compile PETSc and SLEPc on the cluster you’re using yourself. It doesn’t have great usability, but I think it’s the most complete option when it comes to large, distributed memory, and sparse eigen solvers. Maybe in the future there will be something more convenient written in Julia…
A sparse distributed matrix here means a large sparse matrix stored in distributed memory. For example, you could divide all the rows into several blocks and store each row block separately. KrylovKit accepts a distributed vector but I don’t know if it could still work is each part of the distributed vector is sparse. But thanks for you advice, I will give it a try.
Thanks for your advice. SlepcWrap.jl looks like a potential solution to my problem. I’ll give it a shot.
I think KrylovKit (and several of the others) should work for any distributed-vector type as long as it defines the requisite linear-algebra (basically just ±, scaling,
(Implementing a distributed matrix–vector product is up to you; one package for this is PartitionedArrays.jl.)
How about a dense matrix? Is there a similar package for a dense matrix?