@@ -259,6 +259,8 @@ class ChaseMpiDLAMultiGPU : public ChaseMpiDLAInterface<T>
259259 cudaMalloc ((void **)&d_ritz_, sizeof (Base<T>) * (nev_ + nex_)));
260260 cuda_exec (
261261 cudaMalloc ((void **)&states_, sizeof (curandStatePhilox4_32_10_t) * (256 * 32 )));
262+ cuda_exec (cudaMalloc ((void **)&d_v_, sizeof (T) * m_));
263+ cuda_exec (cudaMalloc ((void **)&d_w_, sizeof (T) * n_));
262264
263265 cublasCreate (&cublasH_);
264266 cusolverDnCreate (&cusolverH_);
@@ -486,7 +488,21 @@ class ChaseMpiDLAMultiGPU : public ChaseMpiDLAInterface<T>
486488 // ! - All required operations for this function has been done in for
487489 // ! ChaseMpiDLA::applyVec().
488490 // ! - This function contains nothing in this class.
489- void applyVec (T* B, T* C) override {}
491+ void applyVec (T* v, T* w) override
492+ {
493+ T alpha = T (1.0 );
494+ T beta = T (0.0 );
495+
496+ cuda_exec (cudaMemcpy (d_v_, v, m_ * sizeof (T), cudaMemcpyHostToDevice));
497+ std::size_t k = 1 ;
498+ cublas_status_ = cublasTgemm (
499+ cublasH_, CUBLAS_OP_C , CUBLAS_OP_N , n_, k, m_, &alpha, d_H_, m_,
500+ d_v_, m_, &beta, d_w_, n_);
501+ assert (cublas_status_ == CUBLAS_STATUS_SUCCESS );
502+
503+ cuda_exec (cudaMemcpy (w, d_w_, n_ * sizeof (T), cudaMemcpyDeviceToHost));
504+
505+ }
490506 int get_nprocs () const override { return matrix_properties_->get_nprocs (); }
491507 void Start () override {}
492508 void End () override {}
@@ -786,6 +802,9 @@ class ChaseMpiDLAMultiGPU : public ChaseMpiDLAInterface<T>
786802 T* d_work_ =
787803 NULL ; // !< a pointer to a local buffer on GPU, which is reserved for the
788804 // !< extra buffer required for any cuSOLVER routines
805+ T *d_v_;
806+ T *d_w_;
807+
789808 std::size_t pitchB; // !< pitch for `B_` and `d_B_`
790809 std::size_t pitchB2; // !< pitch for `B2_` and `d_B2_`
791810 std::size_t pitchC; // !< pitch for `C_` and `d_C_`
0 commit comments