Preconditioners

KrylovPreconditioners.kp_ic0Function
P = kp_ic0(A)

Construct an incomplete Cholesky preconditioner with zero fill-in – IC(0), to accelerate Krylov solvers on GPU architectures.

The preconditioner is compatible with sparse matrices in CSR or CSC format stored on NVIDIA and AMD GPUs.

Input argument

  • A: The sparse Hermitian and positive definite matrix on the GPU to factorize incompletely.

Output argument

  • P: preconditioner of type AbstractKrylovPreconditioner.
source
KrylovPreconditioners.kp_ilu0Function
P = kp_ic0(A)

Construct an incomplete LU preconditioner with zero fill-in – ILU(0), to accelerate Krylov solvers on GPU architectures.

The preconditioner is compatible with sparse matrices in CSR or CSC format stored on NVIDIA and AMD GPUs.

Input argument

  • A: The square sparse matrix on the GPU to factorize incompletely.

Output argument

  • P: preconditioner of type AbstractKrylovPreconditioner.
source
KrylovPreconditioners.kp_block_jacobiFunction
P = kp_block_jacobi(A)

Construct a block-Jacobi preconditioner to accelerate Krylov solvers on GPU architectures.

The preconditioner is compatible with sparse matrices in CSR or CSC format stored on NVIDIA, AMD, and Intel GPUs. It also works on CPU with the CSC format.

Input argument

  • A: The square sparse matrix on the CPU or GPU from which diagonal blocks are extracted.

Output argument

  • P: preconditioner of type AbstractKrylovPreconditioner.
source

Nvidia GPUs

using CUDA, CUDA.CUSPARSE
using SparseArrays
using KrylovPreconditioners

if CUDA.functional()
  # CPU Arrays
  A_cpu = sprand(100, 100, 0.3) + I

  # GPU Arrays
  A_csc_gpu = CuSparseMatrixCSC(A_cpu)
  A_csr_gpu = CuSparseMatrixCSR(A_cpu)

  # Krylov operators
  P_csc = kp_ilu0(A_csc_gpu)
  P_csr = kp_ilu0(A_csr_gpu)
end

AMD GPUs

using AMDGPU, AMDGPU.rocSPARSE
using SparseArrays
using KrylovPreconditioners

if AMDGPU.functional()
  # CPU Arrays
  A_cpu = sprand(200, 200, 0.05)
  A_cpu = A_cpu' * A_cpu + I

  # GPU Arrays
  A_csc_gpu = ROCSparseMatrixCSC(A_cpu)
  A_csr_gpu = ROCSparseMatrixCSR(A_cpu)

  # Krylov operators
  P_csc = kp_ic0(A_csc_gpu)
  P_csr = kp_ic0(A_csr_gpu)
end