Initialize the DBCSR library Prepares the DBCSR library for use.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | mp_comm | |||
integer, | intent(in), | optional | :: | io_unit | ||
integer, | intent(in), | optional | :: | accdrv_active_device_id |
SUBROUTINE dbcsr_init_lib_pre(mp_comm, io_unit, accdrv_active_device_id)
!! Initialize the DBCSR library
!! Prepares the DBCSR library for use.
#if defined(__LIBXSMM)
USE libxsmm, ONLY: libxsmm_init
#endif
INTEGER, INTENT(IN) :: mp_comm
INTEGER, INTENT(IN), OPTIONAL :: io_unit, accdrv_active_device_id
INTEGER :: numnodes, mynode
#if defined(__DBCSR_ACC)
INTEGER :: dbcsr_thread_safe, libsmm_acc_thread_safe
#endif
! construct defaults which were unknown at compile-time (dbcsr_config_type)
CALL dbcsr_set_config()
CALL mp_environ(numnodes, mynode, mp_comm)
IF (PRESENT(io_unit)) THEN
ext_io_unit = io_unit
ELSE
ext_io_unit = 0
IF (mynode .EQ. 0) ext_io_unit = default_output_unit
END IF
! if MPI was not initialized in DBCSR, then need to check for the number of communicators
! when we finalize DBCSR
IF (mp_get_comm_count() .EQ. 0) THEN
check_comm_count = .TRUE.
END IF
CALL dbcsr_mp_make_env(mp_env, default_group, mp_comm)
#if defined(__LIBXSMM)
CALL libxsmm_init()
#endif
! Initialize Acc and set active device
IF (has_acc) THEN
IF (PRESENT(accdrv_active_device_id)) THEN
CALL set_accdrv_active_device_id(accdrv_active_device_id)
ELSEIF (dbcsr_acc_get_ndevices() > 0) THEN
! Use round-robin assignment per rank
CALL set_accdrv_active_device_id(MOD(mynode, dbcsr_acc_get_ndevices()))
ELSE
DBCSR_ABORT("dbcsr_init_lib: No recongnized GPU devices")
END IF
CALL acc_init()
END IF
#if defined(__DBCSR_ACC)
! Checks related to DBCSR's GPU backend: check consistency in threading level
libsmm_acc_thread_safe = libsmm_acc_is_thread_safe() ! 0: not threaded, 1: threaded
dbcsr_thread_safe = 0 ! not threaded
!$ dbcsr_thread_safe = 1 ! if DBCSR is compiled with openmp, set to threaded
! Check whether DBCSR and libsmm_acc (GPU backend) have the same level of threading
IF (dbcsr_thread_safe /= libsmm_acc_thread_safe) then
IF (dbcsr_thread_safe /= 0) then
CALL dbcsr_abort(__LOCATION__, &
"DBCSR compiled w/ threading support while libsmm_acc compiled w/o threading support.")
ELSE
CALL dbcsr_abort(__LOCATION__, &
"DBCSR compiled w/o threading support while libsmm_acc is compiled w/ threading support.")
END IF
END IF
#endif
END SUBROUTINE dbcsr_init_lib_pre