Initialize the DBCSR library Prepares the DBCSR library for use.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(mp_comm_type), | 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 TYPE(mp_comm_type), 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 (use_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 recognized 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