1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-08-16 18:38:28 +02:00

Cleanup before merging into QMCkl's GPU branch

This commit is contained in:
Aurélien Delval 2022-04-04 12:12:11 +02:00
parent 1173bb2586
commit 84013a5f76
2 changed files with 93 additions and 1 deletions

View File

@ -2288,6 +2288,98 @@ qmckl_transpose (qmckl_context context,
#+end_src
* cuBLAS interface (optional)
We propose a cuBLAS version of some QMCkl kernels. However, because cuBLAS is written in C, we need to define a Fortran interface for it. We start by defining functions to manage the cuBLAS handle structure from Fortran, before writing interfaces for the specific cuBLAS functions we are interested in.
TODO These are the C functions that are supposed to be called from Fortran. We still need to write the interfaces themselves.
#+begin_src c :tangle (eval h_private_func) :comments org
#ifdef HAVE_CUBLAS_OFFLOAD
#include <cublas_v2.h>
#endif
#+end_src
#+begin_src c :tangle (eval h_private_func) :comments org
#ifdef HAVE_CUBLAS_OFFLOAD
cublasHandle_t* get_cublas_handle_interfaced();
#endif
#+end_src
#+begin_src c :comments org :tangle (eval c) :exports none
#ifdef HAVE_CUBLAS_OFFLOAD
cublasHandle_t* get_cublas_handle_interfaced() {
cublasHandle_t* handle = malloc(sizeof(cublasHandle_t));
cublasStatus_t status = cublasCreate(handle);
if (status != CUBLAS_STATUS_SUCCESS){
fprintf(stderr, "Error while initializing cuBLAS\n");
exit(1);
}
return handle;
}
#endif
#+end_src
#+begin_src c :tangle (eval h_private_func) :comments org
#ifdef HAVE_CUBLAS_OFFLOAD
void destroy_cublas_handle_interfaced(cublasHandle_t* handle);
#endif
#+end_src
#+begin_src c :comments org :tangle (eval c) :exports none
#ifdef HAVE_CUBLAS_OFFLOAD
void destroy_cublas_handle_interfaced(cublasHandle_t* handle) {
if(handle != NULL) {
free(handle);
}
}
#endif
#+end_src
** DGEMM
#+begin_src c :tangle (eval h_private_func) :comments org
#ifdef HAVE_CUBLAS_OFFLOAD
cublasStatus_t cublasDgemm_f(
cublasHandle_t* handle,
cublasOperation_t* transa, cublasOperation_t* transb,
int* m, int* n, int* k,
const double* alpha,
const double*A, int* lda,
const double* B, int* ldb,
const double* beta,
double*C, int* ldc
);
#endif
#+end_src
#+begin_src c :comments org :tangle (eval c) :exports none
#ifdef HAVE_CUBLAS_OFFLOAD
cublasStatus_t cublasDgemm_f(
cublasHandle_t* handle,
cublasOperation_t* transa, cublasOperation_t* transb,
int* m, int* n, int* k,
const double* alpha,
const double*A, int* lda,
const double* B, int* ldb,
const double* beta,
double*C, int* ldc
) {
return cublasDgemm_f(
handle,
transa, transb,
m, n, k,
alpha, A, lda, B,ldb,
beta, C, ldc
);
}
#endif
#+end_src
* End of files :noexport:

View File

@ -5592,7 +5592,7 @@ integer function qmckl_compute_tmp_c_cublas_offload_f(context, cord_num, elec_nu
LDB = size(een_rescaled_n,1)
LDC = size(tmp_c,1)
! Alloc and copy memory on device
! TODO Replace with calls to cuBLAS
do nw=1, walk_num
do i=0, cord_num-1