1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-12-22 20:36:01 +01:00

Fixed efence compilation

This commit is contained in:
Anthony Scemama 2022-05-06 11:29:46 +02:00
commit d1e88ad475
4 changed files with 87 additions and 71 deletions

View File

@ -330,6 +330,26 @@ AS_IF([test "$HAVE_CUBLAS_OFFLOAD" = "yes"], [
esac esac
]) ])
AC_ARG_ENABLE(malloc-trace, [AS_HELP_STRING([--enable-malloc-trace],[use debug malloc/free])], ok=$enableval, ok=no)
if test "$ok" = "yes"; then
AC_DEFINE(MALLOC_TRACE,"malloc_trace.dat",[Define to use debugging malloc/free])
ARGS="${ARGS} malloc-trace"
fi
AC_ARG_ENABLE(prof, [AS_HELP_STRING([--enable-prof],[compile for profiling])], ok=$enableval, ok=no)
if test "$ok" = "yes"; then
CFLAGS="${CFLAGS} -pg"
AC_DEFINE(ENABLE_PROF,1,[Define when using the profiler tool])
ARGS="${ARGS} prof"
fi
AC_ARG_WITH(efence, [AS_HELP_STRING([--with-efence],[use ElectricFence library])], ok=$withval, ok=no)
if test "$ok" = "yes"; then
AC_CHECK_LIB([efence], [malloc])
ARGS="${ARGS} efence"
fi
## ##
@ -356,26 +376,6 @@ if test "$ok" = "yes"; then
ARGS="${ARGS} debug" ARGS="${ARGS} debug"
fi fi
AC_ARG_ENABLE(malloc-trace, [AS_HELP_STRING([--enable-malloc-trace],[use debug malloc/free])], ok=$enableval, ok=no)
if test "$ok" = "yes"; then
AC_DEFINE(MALLOC_TRACE,"malloc_trace.dat",[Define to use debugging malloc/free])
ARGS="${ARGS} malloc-trace"
fi
AC_ARG_ENABLE(prof, [AS_HELP_STRING([--enable-prof],[compile for profiling])], ok=$enableval, ok=no)
if test "$ok" = "yes"; then
CFLAGS="${CFLAGS} -pg"
AC_DEFINE(ENABLE_PROF,1,[Define when using the profiler tool])
ARGS="${ARGS} prof"
fi
AC_ARG_WITH(efence, [AS_HELP_STRING([--with-efence],[use ElectricFence library])], ok=$withval, ok=no)
if test "$ok" = "yes"; then
AC_CHECK_LIB(efence, malloc)
ARGS="${ARGS} efence"
fi
# Checks for header files. # Checks for header files.
## qmckl ## qmckl

View File

@ -256,10 +256,8 @@ bool qmckl_mo_basis_provided(const qmckl_context context) {
#+end_src #+end_src
*** Fortran interfaces *** Fortran interfaces
#+begin_src f90 :tangle (eval fh_func) :comments org
interface interface
integer(c_int32_t) function qmckl_get_mo_basis_mo_num (context, & integer(c_int32_t) function qmckl_get_mo_basis_mo_num (context, &
mo_num) bind(C) mo_num) bind(C)
@ -665,6 +663,10 @@ integer function qmckl_compute_mo_basis_mo_vgl_doc_f(context, &
integer*8 :: i,j,k integer*8 :: i,j,k
double precision :: c1, c2, c3, c4, c5 double precision :: c1, c2, c3, c4, c5
integer*8 :: LDA, LDB, LDC
info = QMCKL_SUCCESS
if (.True.) then ! fast algorithm
do j=1,point_num do j=1,point_num
mo_vgl(:,:,j) = 0.d0 mo_vgl(:,:,j) = 0.d0
do k=1,ao_num do k=1,ao_num
@ -684,7 +686,18 @@ integer function qmckl_compute_mo_basis_mo_vgl_doc_f(context, &
end if end if
end do end do
end do end do
info = QMCKL_SUCCESS
else ! dgemm
LDA = size(coef_normalized_t,1)
LDB = size(ao_vgl,1)
LDC = size(mo_vgl,1)
info = qmckl_dgemm(context,'N', 'N', mo_num, point_num*5_8, ao_num*1_8, 1.d0, &
coef_normalized_t, LDA, ao_vgl, LDB, &
0.d0, mo_vgl, LDC)
end if
end function qmckl_compute_mo_basis_mo_vgl_doc_f end function qmckl_compute_mo_basis_mo_vgl_doc_f
#+end_src #+end_src
@ -789,16 +802,19 @@ qmckl_compute_mo_basis_mo_vgl_hpc (const qmckl_context context,
const double* restrict ao_vgl, const double* restrict ao_vgl,
double* restrict const mo_vgl ) double* restrict const mo_vgl )
{ {
assert (context != QMCKL_NULL_CONTEXT);
#ifdef HAVE_OPENMP #ifdef HAVE_OPENMP
#pragma omp parallel for #pragma omp parallel for
#endif #endif
for (int64_t ipoint=0 ; ipoint < point_num ; ++ipoint) { for (int64_t ipoint=0 ; ipoint < point_num ; ++ipoint) {
double* restrict const vgl1 = &(mo_vgl[ipoint*5*mo_num]); double* restrict const vgl1 = &(mo_vgl[ipoint*5*mo_num]);
const double* restrict avgl1 = &(ao_vgl[ipoint*5*ao_num]);
double* restrict const vgl2 = vgl1 + mo_num; double* restrict const vgl2 = vgl1 + mo_num;
double* restrict const vgl3 = vgl1 + (mo_num << 1); double* restrict const vgl3 = vgl1 + (mo_num << 1);
double* restrict const vgl4 = vgl1 + (mo_num << 1) + mo_num; double* restrict const vgl4 = vgl1 + (mo_num << 1) + mo_num;
double* restrict const vgl5 = vgl1 + (mo_num << 2); double* restrict const vgl5 = vgl1 + (mo_num << 2);
const double* restrict avgl1 = &(ao_vgl[ipoint*5*ao_num]);
const double* restrict avgl2 = avgl1 + ao_num; const double* restrict avgl2 = avgl1 + ao_num;
const double* restrict avgl3 = avgl1 + (ao_num << 1); const double* restrict avgl3 = avgl1 + (ao_num << 1);
const double* restrict avgl4 = avgl1 + (ao_num << 1) + ao_num; const double* restrict avgl4 = avgl1 + (ao_num << 1) + ao_num;
@ -832,6 +848,7 @@ qmckl_compute_mo_basis_mo_vgl_hpc (const qmckl_context context,
} }
int64_t n; int64_t n;
for (n=0 ; n < nidx-4 ; n+=4) { for (n=0 ; n < nidx-4 ; n+=4) {
const double* restrict ck1 = coef_normalized_t + idx[n ]*mo_num; const double* restrict ck1 = coef_normalized_t + idx[n ]*mo_num;
const double* restrict ck2 = coef_normalized_t + idx[n+1]*mo_num; const double* restrict ck2 = coef_normalized_t + idx[n+1]*mo_num;
@ -875,8 +892,7 @@ qmckl_compute_mo_basis_mo_vgl_hpc (const qmckl_context context,
} }
} }
int64_t n0 = nidx-4; const int64_t n0 = n < 0 ? 0 : n;
n0 = n0 < 0 ? 0 : n0;
for (int64_t m=n0 ; m < nidx ; m+=1) { for (int64_t m=n0 ; m < nidx ; m+=1) {
const double* restrict ck = coef_normalized_t + idx[m]*mo_num; const double* restrict ck = coef_normalized_t + idx[m]*mo_num;
const double a1 = av1[m]; const double a1 = av1[m];

View File

@ -250,19 +250,19 @@ qmckl_exit_code qmckl_set_numprec_range(const qmckl_context context, const int r
# Fortran interface # Fortran interface
#+begin_src f90 :tangle (eval fh_func) #+begin_src f90 :tangle (eval fh_func)
interface interface
integer (qmckl_exit_code) function qmckl_numprec_set_range(context, range) bind(C) integer (qmckl_exit_code) function qmckl_set_numprec_range(context, range) bind(C)
use, intrinsic :: iso_c_binding use, intrinsic :: iso_c_binding
import import
integer (qmckl_context), intent(in), value :: context integer (qmckl_context), intent(in), value :: context
integer (c_int32_t), intent(in), value :: range integer (c_int32_t), intent(in), value :: range
end function qmckl_numprec_set_range end function qmckl_set_numprec_range
end interface end interface
#+end_src #+end_src
~qmckl_get_numprec_range~ returns the value of the numerical range in the context. ~qmckl_get_numprec_range~ returns the value of the numerical range in the context.
#+begin_src c :comments org :tangle (eval h_func) :exports none #+begin_src c :comments org :tangle (eval h_func) :exports none
int32_t qmckl_get_numprec_get_range(const qmckl_context context); int32_t qmckl_get_numprec_range(const qmckl_context context);
#+end_src #+end_src
# Source # Source