Initialize/finalize SIRIUS only when used

This commit is contained in:
Matthias Krack 2021-10-14 18:45:19 +02:00
parent 180a1bf52c
commit d3703bf5c6

View file

@ -204,7 +204,7 @@ CONTAINS
accdrv_active_device_id=offload_get_device_id())
ELSE
CALL dbcsr_init_lib(mpi_comm, io_unit=output_unit)
ENDIF
END IF
#else
CALL dbcsr_init_lib(mpi_comm, io_unit=output_unit)
#endif
@ -213,8 +213,6 @@ CONTAINS
CALL pw_fpga_init()
CALL cp_sirius_init()
NULLIFY (globenv, force_env)
CALL cite_reference(Hutter2014)
@ -240,13 +238,11 @@ CONTAINS
i_val=prog_name_id)
CALL section_vals_val_get(input_file, "GLOBAL%RUN_TYPE", &
i_val=run_type_id)
CALL section_vals_val_get(root_section, "FORCE_EVAL%METHOD", i_val=method_name_id)
IF (prog_name_id /= do_cp2k) THEN
! initial setup (cp2k does in in the creation of the force_env)
CALL globenv_create(globenv)
! XXXXXXXXX
! root_section => input_file
! XXXXXXXXX
CALL section_vals_retain(input_file)
CALL cp2k_init(para_env, output_unit, globenv, input_file_name=input_file_name)
CALL cp2k_read(root_section, para_env, globenv)
@ -258,7 +254,7 @@ CONTAINS
cp_logger_would_log(logger, cp_note_level)) THEN
CALL dbcsr_print_config(unit_nr=output_unit)
WRITE (UNIT=output_unit, FMT='()')
ENDIF
END IF
! Configure the grid library.
CALL section_vals_val_get(root_section, "GLOBAL%GRID%BACKEND", i_val=grid_backend)
@ -282,7 +278,7 @@ CONTAINS
! But, we don't want to change the public f77_interface.
! TODO: refactor cp2k's startup code
CALL dbcsr_finalize_lib()
CALL cp_sirius_finalize()
IF (method_name_id == do_sirius) CALL cp_sirius_finalize()
CALL pw_cuda_finalize()
CALL pw_fpga_finalize()
CALL farming_run(input_declaration, root_section, para_env, initial_variables)
@ -292,13 +288,13 @@ CONTAINS
accdrv_active_device_id=offload_get_device_id())
ELSE
CALL dbcsr_init_lib(mpi_comm, io_unit=output_unit)
ENDIF
END IF
#else
CALL dbcsr_init_lib(mpi_comm, io_unit=output_unit)
#endif
CALL pw_cuda_init()
CALL pw_fpga_init()
CALL cp_sirius_init()
IF (method_name_id == do_sirius) CALL cp_sirius_init()
CASE (do_opt_basis)
CALL run_optimize_basis(input_declaration, root_section, para_env)
globenv%run_type_id = none_run
@ -315,8 +311,7 @@ CONTAINS
force_env => f_env%force_env
CALL force_env_get(force_env, globenv=globenv)
CALL globenv_retain(globenv)
CALL section_vals_val_get(force_env%force_env_section, "METHOD", i_val=method_name_id)
IF (method_name_id == do_sirius) CALL cp_sirius_init()
CASE (do_test)
CALL lib_test(root_section, para_env, globenv)
CASE (do_tree_mc) ! TMC entry point
@ -420,7 +415,7 @@ CONTAINS
!sample peak memory
CALL m_memory()
CALL cp_sirius_finalize()
IF (method_name_id == do_sirius) CALL cp_sirius_finalize()
CALL pw_cuda_finalize()
@ -436,7 +431,7 @@ CONTAINS
WRITE (output_unit, *)
WRITE (output_unit, '(T2,"MEMORY| Estimated peak process memory [MiB]",T73,I8)') &
(m_memory_max_mpi + (1024*1024) - 1)/(1024*1024)
ENDIF
END IF
IF (prog_name_id == do_cp2k) THEN
f_env%force_env => force_env ! for mc
@ -545,14 +540,14 @@ CONTAINS
CPASSERT(num_slaves == 1)
num_slaves = para_env%num_pe - 1
slave_rank = -1
ENDIF
END IF
CPASSERT(num_slaves == para_env%num_pe - 1)
ELSE
! all processes are slaves
IF (output_unit > 0) WRITE (output_unit, FMT="(T2,A)") "FARMING| using a slave-only setup"
CALL mp_comm_dup(para_env%group, slave_group)
CALL mp_environ(num_slaves, slave_rank, slave_group)
ENDIF
END IF
IF (output_unit > 0) WRITE (output_unit, FMT="(T2,A,I0)") "FARMING| number of slaves ", num_slaves
! keep track of which para_env rank is which slave/master
@ -564,7 +559,7 @@ CONTAINS
primus_slave = 0
DO i = 1, para_env%num_pe - 1
IF (slave_distribution(i) == 0) primus_slave = i
ENDDO
END DO
! split the current communicator for the slaves
! in a new_group, new_size and new_rank according to the number of groups required according to the input
@ -583,12 +578,12 @@ CONTAINS
ELSE
CALL mp_comm_split(slave_group, new_group, ngroups, group_distribution, &
n_subgroups=farming_env%ngroup_wish, stride=farming_env%stride)
ENDIF
END IF
ELSE
CPABORT("must set either group_size_wish or ngroup_wish")
ENDIF
END IF
CALL mp_environ(new_size, new_rank, new_group)
ENDIF
END IF
! transfer the info about the slave group distribution to the master
IF (farming_env%master_slave) THEN
@ -597,14 +592,14 @@ CONTAINS
CALL mp_send(group_distribution, 0, tag, para_env%group)
tag = 2
CALL mp_send(ngroups, 0, tag, para_env%group)
ENDIF
END IF
IF (para_env%mepos == 0) THEN
tag = 1
CALL mp_recv(group_distribution, primus_slave, tag, para_env%group)
tag = 2
CALL mp_recv(ngroups, primus_slave, tag, para_env%group)
ENDIF
ENDIF
END IF
END IF
! write info on group distribution
IF (output_unit > 0) THEN
@ -617,7 +612,7 @@ CONTAINS
END DO
WRITE (output_unit, *)
CALL m_flush(output_unit)
ENDIF
END IF
! protect about too many jobs being run in single go. Not more jobs are allowed than the number in the input file
! and determine the future restart point
@ -628,14 +623,14 @@ CONTAINS
n_jobs_to_run = MIN(farming_env%njobs, farming_env%max_steps*ngroups)
n_jobs_to_run = MIN(n_jobs_to_run, farming_env%njobs - farming_env%restart_n + 1)
i_job_to_restart = n_jobs_to_run + farming_env%restart_n
ENDIF
END IF
! and write the restart now, that's the point where the next job starts, even if this one is running
iunit = cp_print_key_unit_nr(logger, root_section, "FARMING%RESTART", &
extension=".restart")
IF (iunit > 0) THEN
WRITE (iunit, *) i_job_to_restart
ENDIF
END IF
CALL cp_print_key_finished_output(iunit, logger, root_section, "FARMING%RESTART")
! this is the job range to be executed.
@ -646,7 +641,7 @@ CONTAINS
WRITE (output_unit, FMT="(T2,A)") "FARMING| is the cycle keyword required ?"
WRITE (output_unit, FMT="(T2,A)") "FARMING| or is a stray RESTART file present ?"
WRITE (output_unit, FMT="(T2,A)") "FARMING| or is the group_size requested smaller than the number of CPUs?"
ENDIF
END IF
! actual executions of the jobs in two different modes
IF (farming_env%master_slave) THEN
@ -670,7 +665,7 @@ CONTAINS
CALL mp_bcast(todo, 0, new_group)
ELSE
CALL mp_bcast(todo, 0, new_group)
ENDIF
END IF
! if the todo is do_nothing we are flagged to quit. Otherwise it is the job number
SELECT CASE (todo)
@ -680,13 +675,13 @@ CONTAINS
DO
t2 = m_walltime()
IF (t2 - t1 > farming_env%wait_time) EXIT
ENDDO
END DO
CASE (do_nothing)
EXIT
CASE (1:)
CALL execute_job(todo)
END SELECT
ENDDO
END DO
ELSE ! master
ALLOCATE (slave_status(0:ngroups - 1))
slave_status = slave_status_wait
@ -704,8 +699,8 @@ CONTAINS
IF (output_unit > 0) THEN
WRITE (output_unit, FMT=*) "Job finished: ", todo
CALL m_flush(output_unit)
ENDIF
ENDIF
END IF
END IF
! get the next job in line, this could be do_nothing, if we're finished
CALL get_next_job(farming_env, ijob_start, ijob_end, ijob_current, todo)
@ -719,31 +714,31 @@ CONTAINS
WRITE (output_unit, FMT=*) "Job: ", todo, " Dir: ", TRIM(farming_env%Job(todo)%cwd), &
" assigned to group ", group_distribution(slave_distribution(dest))
CALL m_flush(output_unit)
ENDIF
END IF
ELSE
IF (todo == do_nothing) THEN
slave_status(group_distribution(slave_distribution(dest))) = slave_status_done
IF (output_unit > 0) THEN
WRITE (output_unit, FMT=*) "group done: ", group_distribution(slave_distribution(dest))
CALL m_flush(output_unit)
ENDIF
ENDIF
END IF
END IF
IF (todo == do_deadlock) THEN
IF (output_unit > 0) THEN
WRITE (output_unit, FMT=*) ""
WRITE (output_unit, FMT=*) "FARMING JOB DEADLOCKED ... CIRCULAR DEPENDENCIES"
WRITE (output_unit, FMT=*) ""
CALL m_flush(output_unit)
ENDIF
END IF
CPASSERT(todo .NE. do_deadlock)
ENDIF
ENDIF
END IF
END IF
ENDDO
END DO
DEALLOCATE (slave_status)
ENDIF
END IF
ELSE
! this is the non-master-slave mode way of executing the jobs
! the i-th job in the input is always executed by the MODULO(i-1,ngroups)-th group
@ -755,10 +750,10 @@ CONTAINS
i = MODULO(ijob - 1, farming_env%njobs) + 1
WRITE (output_unit, FMT=*) "Job: ", i, " Dir: ", TRIM(farming_env%Job(i)%cwd), " Input: ", &
TRIM(farming_env%Job(i)%input), " MPI group:", MODULO(i - 1, ngroups)
ENDDO
ENDIF
END DO
END IF
CALL m_flush(output_unit)
ENDIF
END IF
DO ijob = ijob_start, ijob_end
i = MODULO(ijob - 1, farming_env%njobs) + 1
@ -768,15 +763,15 @@ CONTAINS
WRITE (output_unit, FMT="(T2,A,I5.5,A)", ADVANCE="NO") " Running Job ", i, &
" in "//TRIM(farming_env%Job(i)%cwd)//"."
CALL m_flush(output_unit)
ENDIF
END IF
CALL execute_job(i)
IF (output_unit > 0) THEN
WRITE (output_unit, FMT="(A)") " Done, output in "//TRIM(output_file)
CALL m_flush(output_unit)
ENDIF
ENDIF
ENDDO
ENDIF
END IF
END IF
END DO
END IF
! keep information about how long each process has to wait
! i.e. the load imbalance
@ -793,9 +788,9 @@ CONTAINS
WRITE (output_unit, FMT='(A2,I6,A3,F8.3,A1)', ADVANCE="NO") &
" (", i, " : ", waittime(i), ")"
IF (MOD(i + 1, 4) == 0) WRITE (output_unit, '(A)') ""
ENDDO
END DO
CALL m_flush(output_unit)
ENDIF
END IF
DEALLOCATE (waittime)
! give back the communicators of the split groups
@ -855,7 +850,7 @@ CONTAINS
CALL parser_release(my_parser)
ELSE
output_file = farming_env%Job(i)%output
ENDIF
END IF
CALL open_file(file_name=TRIM(output_file), &
file_action="WRITE", &
@ -867,7 +862,7 @@ CONTAINS
! start writing output (to the same file, adding to confusion).
! error handling should be careful, asking for a local output unit if required
new_output_unit = -1
ENDIF
END IF
CALL cp2k_run(input_declaration, TRIM(farming_env%Job(i)%input), new_output_unit, new_group, initial_variables)