GPU implementation using CuPyΒΆ
The current implementation focuses on using the GPU for many internal wave function operations, so that
- Wave function parameters are stored on the GPU
- This allows the calculations to be done on the GPU without copying the parameters over each time.
- When assigning wf parameters, arrays need to be moved to GPU
- During optimization, parameters serialize to CPU and deserialize back to GPU
- Wave function methods return values on the CPU
- This allows functions like vmc and dmc to remain unchanged, and operate only on CPU.
The Slater determinant helper functions use the GPU:
- Orbitals object returns AOs and MOs on GPU.
- determinant_tools.compute_value takes in GPU arrays from the Slater object and outputs CPU arrays.
In addition, some calculations outside of wf evaluation are also carried out on GPU
RDM: since the RDM accumulators evaluate orbitals directly, the orbital arrays and internal calculations are on GPU. All return values are on CPU.
(Note: wf.testvalue_many returns an array on CPU. Since it is only used in RDMs, which move the arrays back to GPU anyway, it might make sense for testvalue_many to return GPU arrays instead.)
Ewald: reciprocal_space_electron() uses GPU internally. Its inputs and outpus are CPU arrays.