Skip to content

Commit 5451b70

Browse files
dyzhengdyzheng
andauthored
Fix(hsolver): sync d_eigenvalue before GPU refresh in Diago_DavSubspace (#7743)
The GPU path of Diago_DavSubspace::refresh() reads this->d_eigenvalue which was last synchronized in cal_grad() — before diag_zhegvx() computed the latest eigenvalues. This caused the restarted subspace Hamiltonian to receive stale diagonal entries on GPU, leading to: - Davidson eigenvalue oscillation and divergence - Non-positive-definite overlap matrix - zhegvx failure and zeroed wavefunctions The CPU path already used the up-to-date eigenvalue_in_hsolver argument. Fix the GPU path to re-sync d_eigenvalue from eigenvalue_in_hsolver. Bug introduced by 8f7d319 (PR #6493). Co-authored-by: dyzheng <zhengdy@bjaisi.com>
1 parent 2c6ce39 commit 5451b70

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

source/source_hsolver/diago_dav_subspace.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,9 @@ void Diago_DavSubspace<T, Device>::refresh(const int& dim,
795795

796796
if (this->device == base_device::GpuDevice)
797797
{
798+
#if defined(__CUDA) || defined(__ROCM)
799+
syncmem_var_h2d_op()(this->d_eigenvalue, eigenvalue_in_hsolver, nbase);
800+
#endif
798801
refresh_hcc_scc_vcc_op<T, Device>()(nbase, hcc, scc, vcc, this->nbase_x, this->d_eigenvalue, this->one_);
799802
}
800803
else

0 commit comments

Comments
 (0)