From 6a9ed308f84a3d917b92fd13e53c698a7d2a4e8f Mon Sep 17 00:00:00 2001 From: Ben Wilfong <48168887+wilfonba@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:11:27 -0500 Subject: [PATCH 1/7] Performance manual page and better namelist errors --- docs/documentation/expectedPerformance.md | 74 ++++ docs/res/strongScaling/S01.95 | 1 + docs/res/strongScaling/cpuStrongScaling.svg | 450 ++++++++++++++++++++ docs/res/strongScaling/strongScaling16.svg | 429 +++++++++++++++++++ docs/res/strongScaling/strongScaling64.svg | 429 +++++++++++++++++++ docs/res/weakScaling/cpuScaling.svg | 364 ++++++++++++++++ docs/res/weakScaling/frontier.svg | 1 + docs/res/weakScaling/summit.svg | 1 + src/common/m_delay_file_access.f90 | 37 ++ src/post_process/m_data_input.f90 | 140 ++++-- src/post_process/m_global_parameters.fpp | 2 + src/post_process/m_mpi_proxy.fpp | 2 +- src/post_process/m_start_up.f90 | 11 +- src/pre_process/m_data_output.fpp | 185 +++++--- src/pre_process/m_global_parameters.fpp | 2 + src/pre_process/m_mpi_proxy.fpp | 2 +- src/pre_process/m_start_up.fpp | 8 +- src/simulation/m_data_output.fpp | 179 +++++--- src/simulation/m_global_parameters.fpp | 2 + src/simulation/m_mpi_proxy.fpp | 2 +- src/simulation/m_start_up.fpp | 173 +++++--- toolchain/mfc/run/case_dicts.py | 2 +- 22 files changed, 2281 insertions(+), 215 deletions(-) create mode 100644 docs/documentation/expectedPerformance.md create mode 100644 docs/res/strongScaling/S01.95 create mode 100644 docs/res/strongScaling/cpuStrongScaling.svg create mode 100644 docs/res/strongScaling/strongScaling16.svg create mode 100644 docs/res/strongScaling/strongScaling64.svg create mode 100644 docs/res/weakScaling/cpuScaling.svg create mode 100644 src/common/m_delay_file_access.f90 diff --git a/docs/documentation/expectedPerformance.md b/docs/documentation/expectedPerformance.md new file mode 100644 index 000000000..c2455d3a0 --- /dev/null +++ b/docs/documentation/expectedPerformance.md @@ -0,0 +1,74 @@ +# Performance Results + +MFC has been extensively benchmarked on both CPUs and GPUs. A summary of these results follow. + +## Expected time-steps/hour + +The following table outlines expected performance in terms of number of time-steps per hour +(rounded to the nearest hundred) for various problem sizes and hardware for a inviscid, 6-equation, +3D simulation. CPU results utilize an entire die. + +| Hardware | # Ranks | 1M Cells | 4M Cells | 8M Cells | Compiler | Computer | +| ---: | :----: | :----: | :---: | :---: | :----: | :--- | +| Nvidia V100 | 1 | 88.5k | 18.7k | N/A | NVHPC 22.11 | PACE Phoenix | +| Nvidia A100 | 1 | 114.4k | 34.6k | 16.5k | NVHPC 23.5 | Wingtip | +| AMD MI250x | 1 | 77.5k | 22.3k | 11.2k | CCE 16.0.1 | OLCF Frontier | +| Intel Xeon Gold 6226 | 12 | 2.5k | 0.7k | 0.4k | GNU 10.3.0 | Pace Phoenix | +| Apple Silicon M2 | 6 | 2.8k | 0.6k | 0.2k | GNU 13.2.0 | N/A | + +If `'model_eqns' : 3` is replaced by `'model_eqns' : 2`, an inviscid 5-equation model is used. +The following table outlines expected performance in terms of number of time-steps per hour +(rounded to the nearest hundred) for various problem sizes and hardware for a inviscid, 5-equation, +3D simulation. CPU results utilize an entire die. + +| Hardware | # Ranks | 1M Cells | 4M Cells | 8M Cells | Compiler | Computer | +| ---: | :----: | :----: | :---: | :---: | :----: | :--- | +| Nvidia V100 | 1 | 113.4k | 26.2k | N/A | NVHPC 22.11 | PACE Phoenix | +| Nvidia A100 | 1 | 153.5k | 48.0k | 22.5k | NVHPC 23.5 | Wingtip | +| AMD MI250x | 1 | 104.2k | 31.0k | 14.8k | CCE 16.0.1 | OLCF Frontier | +| Intel Xeon Gold 6226 | 12 | 5.4k | 1.6k | 0.8k | GNU 10.3.0 | Pace Phoenix | +| Apple Silicon M2 | 6 | 3.7k | 11.0k | 0.3k | GNU 13.2.0 | N/A | + +## Weak scaling + +Strong scaling results are obtained by increasing the problem size with the number of processes +so that work per process remains constant. + +### AMD MI250X GPU +MFC weask scales to 65,536 AMD MI250X GPUs on OLCF Frontier with 96% efficiency. + + + +### Nvidia V100 GPU +MFC weak scales to 13,824 V100 Nvidia V100 GPUs on OLCF Summit with 97% efficiency. + + + +### IMB Power9 CPU +MFC Weak scales to 13,824 Power9 CPU cores on OLCF Summit with 1% of ideal scaling. + + + +## Strong scaling + +Strong scaling results are obtained by keeping the problem size constant and increasing +the number of process so that work per process decreases. + +### Nvidia V100 GPU + +For these tests, the base case utilizes 8 GPUs with one MPI process per GPU. The performance +is analyzed at two different problem sizes of 16 and 64M grid points, with the base case using +2 and 8M grid points per process. + +#### 16M Grid Points + + +#### 64M Grid Points + + +### IBM Power 9 CPU + +CPU strong scaling tests are done with problem sizes of 16, 32, and 64M grid points, with the +base case using 2, 4, and 8M cells per process. + + \ No newline at end of file diff --git a/docs/res/strongScaling/S01.95 b/docs/res/strongScaling/S01.95 new file mode 100644 index 000000000..ebd60169b --- /dev/null +++ b/docs/res/strongScaling/S01.95 @@ -0,0 +1 @@ + Towards exascale multiphase compressible flow simulation via scalable interface capturing-based solvers and GPU acceleration - Anand Radhakrishnan

Towards exascale multiphase compressible flow simulation via scalable interface capturing-based solvers and GPU acceleration

Date:

diff --git a/docs/res/strongScaling/cpuStrongScaling.svg b/docs/res/strongScaling/cpuStrongScaling.svg new file mode 100644 index 000000000..1597b20e0 --- /dev/null +++ b/docs/res/strongScaling/cpuStrongScaling.svg @@ -0,0 +1,450 @@ + +image/svg+xml10 +1 +10 +2 +10 +0 +10 +1 +10 +2 +SmallerProblemperCPUcore +8M +4M +2M +NumberofCPUcores +Walltime[s] +Ideal +MFC + \ No newline at end of file diff --git a/docs/res/strongScaling/strongScaling16.svg b/docs/res/strongScaling/strongScaling16.svg new file mode 100644 index 000000000..e391e8a0a --- /dev/null +++ b/docs/res/strongScaling/strongScaling16.svg @@ -0,0 +1,429 @@ + +image/svg+xml10 +1 +10 +2 +10 + +3 +10 + +2 +10 + +1 +10 +0 +CUMPI +MPI +NumberofGPUs +Walltime[s] +Ideal +MFC + \ No newline at end of file diff --git a/docs/res/strongScaling/strongScaling64.svg b/docs/res/strongScaling/strongScaling64.svg new file mode 100644 index 000000000..91032bf18 --- /dev/null +++ b/docs/res/strongScaling/strongScaling64.svg @@ -0,0 +1,429 @@ + +image/svg+xml10 +1 +10 +2 +10 + +3 +10 + +2 +10 + +1 +10 +0 +CUMPI +MPI +NumberofGPUs +Walltime[s] +Ideal +MFC + \ No newline at end of file diff --git a/docs/res/weakScaling/cpuScaling.svg b/docs/res/weakScaling/cpuScaling.svg new file mode 100644 index 000000000..0108f89a2 --- /dev/null +++ b/docs/res/weakScaling/cpuScaling.svg @@ -0,0 +1,364 @@ + +image/svg+xml10 +2 +10 +3 +10 +4 +0 +0 +. +5 +1 +1 +. +5 +NumberofGPUs +NormalizedWallTime +Ideal +MFC + \ No newline at end of file diff --git a/docs/res/weakScaling/frontier.svg b/docs/res/weakScaling/frontier.svg index b47bd21fa..5882a346e 100644 --- a/docs/res/weakScaling/frontier.svg +++ b/docs/res/weakScaling/frontier.svg @@ -1,5 +1,6 @@ @} logical :: parallel_io !< Format of the data files + logical :: file_per_process !< output format integer, allocatable, dimension(:) :: proc_coords !< !! Processor coordinates in MPI_CART_COMM @@ -294,6 +295,7 @@ contains flux_lim = dflt_int flux_wrt = .false. parallel_io = .false. + file_per_process = .true. E_wrt = .false. pres_wrt = .false. alpha_wrt = .false. diff --git a/src/post_process/m_mpi_proxy.fpp b/src/post_process/m_mpi_proxy.fpp index 1d67d9168..ef09f1bf3 100644 --- a/src/post_process/m_mpi_proxy.fpp +++ b/src/post_process/m_mpi_proxy.fpp @@ -168,7 +168,7 @@ contains & 'E_wrt', 'pres_wrt', 'gamma_wrt', & & 'heat_ratio_wrt', 'pi_inf_wrt', 'pres_inf_wrt', 'cons_vars_wrt', & & 'prim_vars_wrt', 'c_wrt', 'qm_wrt','schlieren_wrt', 'bubbles', & - & 'polytropic', 'polydisperse' ] + & 'polytropic', 'polydisperse', 'file_per_process' ] call MPI_BCAST(${VAR}$, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD, ierr) #:endfor diff --git a/src/post_process/m_start_up.f90 b/src/post_process/m_start_up.f90 index 3741cc3e4..1f259c85f 100644 --- a/src/post_process/m_start_up.f90 +++ b/src/post_process/m_start_up.f90 @@ -53,6 +53,8 @@ subroutine s_read_input_file() ! --------------------------------------- integer :: iostatus !! Integer to check iostat of file read + character(len=1000) :: line + ! Namelist for all of the parameters to be inputed by the user namelist /user_inputs/ case_dir, m, n, p, t_step_start, & t_step_stop, t_step_save, model_eqns, & @@ -69,7 +71,7 @@ subroutine s_read_input_file() ! --------------------------------------- flux_lim, flux_wrt, cyl_coord, & parallel_io, rhoref, pref, bubbles, qbmm, sigR, & R0ref, nb, polytropic, thermal, Ca, Web, Re_inv, & - polydisperse, poly_sigma + polydisperse, poly_sigma, file_per_process ! Inquiring the status of the post_process.inp file file_loc = 'post_process.inp' @@ -83,8 +85,11 @@ subroutine s_read_input_file() ! --------------------------------------- read (1, NML=user_inputs, iostat=iostatus) if (iostatus /= 0) then - call s_mpi_abort('Invalid line in post_process.inp. It is '// & - 'likely due to a datatype mismatch. Exiting ...') + backspace(1) + read(1,fmt='(A)') line + print*, 'Invalid line in namelist: '//trim(line) + call s_mpi_abort('Invalid line in pre_process.inp. It is '// & + 'likely due to a datatype mismatch. Exiting ...') end if close (1) diff --git a/src/pre_process/m_data_output.fpp b/src/pre_process/m_data_output.fpp index 9c57d9d76..c10fc76e5 100644 --- a/src/pre_process/m_data_output.fpp +++ b/src/pre_process/m_data_output.fpp @@ -29,6 +29,8 @@ module m_data_output use m_variables_conversion use m_helper + + use m_delay_file_access ! ========================================================================== implicit none @@ -396,80 +398,147 @@ contains integer(KIND=MPI_OFFSET_KIND) :: MOK character(LEN=path_len + 2*name_len) :: file_loc - logical :: file_exist + logical :: file_exist, dir_check ! Generic loop iterator integer :: i - ! Initialize MPI data I/O - call s_initialize_mpi_data(q_cons_vf) - - ! Open the file to write all flow variables - write (file_loc, '(I0,A)') t_step_start, '.dat' - file_loc = trim(restart_dir)//trim(mpiiofs)//trim(file_loc) - inquire (FILE=trim(file_loc), EXIST=file_exist) - if (file_exist .and. proc_rank == 0) then - call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) - end if - call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), & - mpi_info_int, ifile, ierr) - - ! Size of local arrays - data_size = (m + 1)*(n + 1)*(p + 1) - - ! Resize some integers so MPI can write even the biggest files - m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) - n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) - p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) - WP_MOK = int(8d0, MPI_OFFSET_KIND) - MOK = int(1d0, MPI_OFFSET_KIND) - str_MOK = int(name_len, MPI_OFFSET_KIND) - NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) - - ! Write the data for each variable - if (bubbles) then - do i = 1, sys_size! adv_idx%end - var_MOK = int(i, MPI_OFFSET_KIND) - - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) - - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) - call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) - end do - !Additional variables pb and mv for non-polytropic qbmm - if(qbmm .and. .not. polytropic) then - do i = sys_size + 1, sys_size + 2*nb*nnode + if (file_per_process) then + if (proc_rank == 0) then + file_loc = trim(case_dir)//'/restart_data/lustre_0' + call my_inquire(file_loc, dir_check) + if (dir_check .neqv. .true.) then + call s_create_directory(trim(file_loc)) + end if + call s_create_directory(trim(file_loc)) + end if + call s_mpi_barrier() + call DelayFileAccess (proc_rank) + ! Initialize MPI data I/O + call s_initialize_mpi_data(q_cons_vf) + + ! Open the file to write all flow variables + write (file_loc, '(I0,A,i7.7,A)') t_step_start, '_', proc_rank, '.dat' + file_loc = trim(restart_dir)//'/lustre_0'//trim(mpiiofs)//trim(file_loc) + inquire (FILE=trim(file_loc), EXIST=file_exist) + if (file_exist .and. proc_rank == 0) then + call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) + end if + if (file_exist) call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) + call MPI_FILE_OPEN(MPI_COMM_SELF, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), & + mpi_info_int, ifile, ierr) + + ! Size of local arrays + data_size = (m + 1)*(n + 1)*(p + 1) + + ! Resize some integers so MPI can write even the biggest files + m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) + n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) + p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) + WP_MOK = int(8d0, MPI_OFFSET_KIND) + MOK = int(1d0, MPI_OFFSET_KIND) + str_MOK = int(name_len, MPI_OFFSET_KIND) + NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) + + ! Write the data for each variable + if (bubbles) then + do i = 1, sys_size! adv_idx%end var_MOK = int(i, MPI_OFFSET_KIND) - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + !Additional variables pb and mv for non-polytropic qbmm + if(qbmm .and. .not. polytropic) then + do i = sys_size + 1, sys_size + 2*nb*nnode + var_MOK = int(i, MPI_OFFSET_KIND) + + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + else + do i = 1, sys_size !TODO: check if this is right + ! do i = 1, adv_idx%end + var_MOK = int(i, MPI_OFFSET_KIND) - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & MPI_DOUBLE_PRECISION, status, ierr) end do end if + + call MPI_FILE_CLOSE(ifile, ierr) + else - do i = 1, sys_size !TODO: check if this is right -! do i = 1, adv_idx%end - var_MOK = int(i, MPI_OFFSET_KIND) + ! Initialize MPI data I/O + call s_initialize_mpi_data(q_cons_vf) + + ! Open the file to write all flow variables + write (file_loc, '(I0,A)') t_step_start, '.dat' + file_loc = trim(restart_dir)//trim(mpiiofs)//trim(file_loc) + inquire (FILE=trim(file_loc), EXIST=file_exist) + if (file_exist .and. proc_rank == 0) then + call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) + end if + call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), & + mpi_info_int, ifile, ierr) + + ! Size of local arrays + data_size = (m + 1)*(n + 1)*(p + 1) + + ! Resize some integers so MPI can write even the biggest files + m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) + n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) + p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) + WP_MOK = int(8d0, MPI_OFFSET_KIND) + MOK = int(1d0, MPI_OFFSET_KIND) + str_MOK = int(name_len, MPI_OFFSET_KIND) + NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) + + ! Write the data for each variable + if (bubbles) then + do i = 1, sys_size! adv_idx%end + var_MOK = int(i, MPI_OFFSET_KIND) - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) - call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) - end do - end if + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + !Additional variables pb and mv for non-polytropic qbmm + if(qbmm .and. .not. polytropic) then + do i = sys_size + 1, sys_size + 2*nb*nnode + var_MOK = int(i, MPI_OFFSET_KIND) + + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + else + do i = 1, sys_size !TODO: check if this is right + ! do i = 1, adv_idx%end + var_MOK = int(i, MPI_OFFSET_KIND) + + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) - call MPI_FILE_CLOSE(ifile, ierr) + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + call MPI_FILE_CLOSE(ifile, ierr) + endif #endif end subroutine s_write_parallel_data_files ! --------------------------- diff --git a/src/pre_process/m_global_parameters.fpp b/src/pre_process/m_global_parameters.fpp index 3958b4ffd..a022fe61c 100644 --- a/src/pre_process/m_global_parameters.fpp +++ b/src/pre_process/m_global_parameters.fpp @@ -95,6 +95,7 @@ module m_global_parameters !! Boundary conditions in the x-, y- and z-coordinate directions logical :: parallel_io !< Format of the data files + logical :: file_per_process !< type of data output integer :: precision !< Precision of output files logical :: vel_profile !< Set hypertangent streamwise velocity profile @@ -249,6 +250,7 @@ contains bc_z%beg = dflt_int; bc_z%end = dflt_int parallel_io = .false. + file_per_process = .true. precision = 2 vel_profile = .false. instability_wave = .false. diff --git a/src/pre_process/m_mpi_proxy.fpp b/src/pre_process/m_mpi_proxy.fpp index 7e43a5242..2e8d431d1 100644 --- a/src/pre_process/m_mpi_proxy.fpp +++ b/src/pre_process/m_mpi_proxy.fpp @@ -55,7 +55,7 @@ contains #:for VAR in [ 'old_grid','old_ic','stretch_x','stretch_y','stretch_z',& & 'cyl_coord','adv_alphan','mpp_lim','hypoelasticity', & & 'parallel_io', 'perturb_flow', 'vel_profile', 'instability_wave', 'perturb_sph', & - 'bubbles', 'polytropic', 'polydisperse', 'qbmm' ] + 'bubbles', 'polytropic', 'polydisperse', 'qbmm', 'file_per_process' ] call MPI_BCAST(${VAR}$, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD, ierr) #:endfor call MPI_BCAST(fluid_rho(1), num_fluids_max, MPI_LOGICAL, 0, MPI_COMM_WORLD, ierr) diff --git a/src/pre_process/m_start_up.fpp b/src/pre_process/m_start_up.fpp index 2633ec626..abc7f0f54 100644 --- a/src/pre_process/m_start_up.fpp +++ b/src/pre_process/m_start_up.fpp @@ -105,6 +105,8 @@ contains integer :: iostatus !! Integer to check iostat of file read + character(len=1000) :: line + ! Namelist for all of the parameters to be inputed by the user namelist /user_inputs/ case_dir, old_grid, old_ic, & t_step_old, t_step_start, m, n, p, x_domain, y_domain, z_domain, & @@ -121,7 +123,8 @@ contains rhoref, pref, bubbles, R0ref, nb, & polytropic, thermal, Ca, Web, Re_inv, & polydisperse, poly_sigma, qbmm, & - sigR, sigV, dist_type, rhoRV, R0_type + sigR, sigV, dist_type, rhoRV, R0_type, & + file_per_process ! Inquiring the status of the pre_process.inp file file_loc = 'pre_process.inp' @@ -134,6 +137,9 @@ contains STATUS='old', ACTION='read') read (1, NML=user_inputs, iostat=iostatus) if (iostatus /= 0) then + backspace(1) + read(1,fmt='(A)') line + print*, 'Invalid line in namelist: '//trim(line) call s_mpi_abort('Invalid line in pre_process.inp. It is '// & 'likely due to a datatype mismatch. Exiting ...') end if diff --git a/src/simulation/m_data_output.fpp b/src/simulation/m_data_output.fpp index 6229daacf..11be64a1f 100644 --- a/src/simulation/m_data_output.fpp +++ b/src/simulation/m_data_output.fpp @@ -26,6 +26,8 @@ module m_data_output use m_compile_specific use m_helper + + use m_delay_file_access ! ========================================================================== implicit none @@ -813,78 +815,149 @@ contains integer(KIND=MPI_OFFSET_KIND) :: MOK character(LEN=path_len + 2*name_len) :: file_loc - logical :: file_exist + logical :: file_exist, dir_check + character(len = 10) :: t_step_string integer :: i !< Generic loop iterator - ! Initialize MPI data I/O + if (file_per_process) then - call s_initialize_mpi_data(q_cons_vf) + call s_int_to_str(t_step, t_step_string) - ! Open the file to write all flow variables - write (file_loc, '(I0,A)') t_step, '.dat' - file_loc = trim(case_dir)//'/restart_data'//trim(mpiiofs)//trim(file_loc) - inquire (FILE=trim(file_loc), EXIST=file_exist) - if (file_exist .and. proc_rank == 0) then - call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) - end if - call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), & - mpi_info_int, ifile, ierr) - - ! Size of local arrays - data_size = (m + 1)*(n + 1)*(p + 1) - - ! Resize some integers so MPI can write even the biggest files - m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) - n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) - p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) - WP_MOK = int(8d0, MPI_OFFSET_KIND) - MOK = int(1d0, MPI_OFFSET_KIND) - str_MOK = int(name_len, MPI_OFFSET_KIND) - NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) - - if (bubbles) then - ! Write the data for each variable - do i = 1, sys_size - var_MOK = int(i, MPI_OFFSET_KIND) + if (proc_rank == 0) then + file_loc = trim(case_dir)//'/restart_data/lustre_'//trim(t_step_string) + call my_inquire(file_loc, dir_check) + if (dir_check .neqv. .true.) then + call s_create_directory(trim(file_loc)) + end if + call s_create_directory(trim(file_loc)) + end if + call s_mpi_barrier() + call DelayFileAccess (proc_rank) - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + ! Initialize MPI data I/O - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) - call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) - end do - !Write pb and mv for non-polytropic qbmm - if(qbmm .and. .not. polytropic) then - do i = sys_size + 1, sys_size + 2*nb*nnode + call s_initialize_mpi_data(q_cons_vf) + + ! Open the file to write all flow variables + write (file_loc, '(I0,A,i7.7,A)') t_step, '_', proc_rank, '.dat' + file_loc = trim(case_dir)//'/restart_data/lustre_'//trim(t_step_string)//trim(mpiiofs)//trim(file_loc) + inquire (FILE=trim(file_loc), EXIST=file_exist) + if (file_exist .and. proc_rank == 0) then + call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) + end if + call MPI_FILE_OPEN(MPI_COMM_SELF, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), & + mpi_info_int, ifile, ierr) + + ! Size of local arrays + data_size = (m + 1)*(n + 1)*(p + 1) + + ! Resize some integers so MPI can write even the biggest files + m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) + n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) + p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) + WP_MOK = int(8d0, MPI_OFFSET_KIND) + MOK = int(1d0, MPI_OFFSET_KIND) + str_MOK = int(name_len, MPI_OFFSET_KIND) + NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) + + if (bubbles) then + ! Write the data for each variable + do i = 1, sys_size + var_MOK = int(i, MPI_OFFSET_KIND) + + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + !Write pb and mv for non-polytropic qbmm + if(qbmm .and. .not. polytropic) then + do i = sys_size + 1, sys_size + 2*nb*nnode + var_MOK = int(i, MPI_OFFSET_KIND) + + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + else + do i = 1, sys_size !TODO: check if correct (sys_size + var_MOK = int(i, MPI_OFFSET_KIND) + + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + + call MPI_FILE_CLOSE(ifile, ierr) + else + ! Initialize MPI data I/O + + call s_initialize_mpi_data(q_cons_vf) + + ! Open the file to write all flow variables + write (file_loc, '(I0,A)') t_step, '.dat' + file_loc = trim(case_dir)//'/restart_data'//trim(mpiiofs)//trim(file_loc) + inquire (FILE=trim(file_loc), EXIST=file_exist) + if (file_exist .and. proc_rank == 0) then + call MPI_FILE_DELETE(file_loc, mpi_info_int, ierr) + end if + call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, ior(MPI_MODE_WRONLY, MPI_MODE_CREATE), & + mpi_info_int, ifile, ierr) + + ! Size of local arrays + data_size = (m + 1)*(n + 1)*(p + 1) + + ! Resize some integers so MPI can write even the biggest files + m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) + n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) + p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) + WP_MOK = int(8d0, MPI_OFFSET_KIND) + MOK = int(1d0, MPI_OFFSET_KIND) + str_MOK = int(name_len, MPI_OFFSET_KIND) + NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) + + if (bubbles) then + ! Write the data for each variable + do i = 1, sys_size var_MOK = int(i, MPI_OFFSET_KIND) ! Initial displacement to skip at beginning of file disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) + 'native', mpi_info_int, ierr) call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & MPI_DOUBLE_PRECISION, status, ierr) end do - end if - else - do i = 1, sys_size !TODO: check if correct (sys_size - var_MOK = int(i, MPI_OFFSET_KIND) + !Write pb and mv for non-polytropic qbmm + if(qbmm .and. .not. polytropic) then + do i = sys_size + 1, sys_size + 2*nb*nnode + var_MOK = int(i, MPI_OFFSET_KIND) + + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + else + do i = 1, sys_size !TODO: check if correct (sys_size + var_MOK = int(i, MPI_OFFSET_KIND) - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) - call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) - end do - end if + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_WRITE_ALL(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if - call MPI_FILE_CLOSE(ifile, ierr) + call MPI_FILE_CLOSE(ifile, ierr) + end if #endif diff --git a/src/simulation/m_global_parameters.fpp b/src/simulation/m_global_parameters.fpp index a49b78bd2..590782e51 100644 --- a/src/simulation/m_global_parameters.fpp +++ b/src/simulation/m_global_parameters.fpp @@ -134,6 +134,7 @@ module m_global_parameters !> @} logical :: parallel_io !< Format of the data files + logical :: file_per_process !< shared file or not when using parallel io integer :: precision !< Precision of output files integer, allocatable, dimension(:) :: proc_coords !< @@ -373,6 +374,7 @@ contains null_weights = .false. mixture_err = .false. parallel_io = .false. + file_per_process = .true. precision = 2 hypoelasticity = .false. weno_flat = .true. diff --git a/src/simulation/m_mpi_proxy.fpp b/src/simulation/m_mpi_proxy.fpp index bfb163cb3..73ece6f0a 100644 --- a/src/simulation/m_mpi_proxy.fpp +++ b/src/simulation/m_mpi_proxy.fpp @@ -136,7 +136,7 @@ contains & 'weno_Re_flux', 'alt_soundspeed', 'null_weights', 'mixture_err', & & 'parallel_io', 'hypoelasticity', 'bubbles', 'polytropic', & & 'polydisperse', 'qbmm', 'monopole', 'probe_wrt', 'integral_wrt', & - & 'prim_vars_wrt', 'weno_avg'] + & 'prim_vars_wrt', 'weno_avg', 'file_per_process'] call MPI_BCAST(${VAR}$, 1, MPI_LOGICAL, 0, MPI_COMM_WORLD, ierr) #:endfor diff --git a/src/simulation/m_start_up.fpp b/src/simulation/m_start_up.fpp index ca1f29208..9d362ac1a 100644 --- a/src/simulation/m_start_up.fpp +++ b/src/simulation/m_start_up.fpp @@ -117,6 +117,8 @@ contains integer :: iostatus !! Integer to check iostat of file read + character(len=1000) :: line + ! Namelist of the global parameters which may be specified by user namelist /user_inputs/ case_dir, run_time_info, m, n, p, dt, & t_step_start, t_step_stop, t_step_save, & @@ -141,7 +143,7 @@ contains polytropic, thermal, & integral, integral_wrt, num_integrals, & polydisperse, poly_sigma, qbmm, & - R0_type + R0_type, file_per_process ! Checking that an input file has been provided by the user. If it ! has, then the input file is read in, otherwise, simulation exits. @@ -155,8 +157,11 @@ contains read (1, NML=user_inputs, iostat=iostatus) if (iostatus /= 0) then - call s_mpi_abort('Invalid line in simulation.inp. It is '// & - 'likely due to a datatype mismatch. Exiting ...') + backspace(1) + read(1,fmt='(A)') line + print*, 'Invalid line in namelist: '//trim(line) + call s_mpi_abort('Invalid line in pre_process.inp. It is '// & + 'likely due to a datatype mismatch. Exiting ...') end if close (1) @@ -392,6 +397,8 @@ contains character(LEN=path_len + 2*name_len) :: file_loc logical :: file_exist + character(len = 10) :: t_step_start_string + integer :: i allocate (x_cb_glb(-1:m_glb)) @@ -463,76 +470,136 @@ contains end if end if - ! Open the file to read conservative variables - write (file_loc, '(I0,A)') t_step_start, '.dat' - file_loc = trim(case_dir)//'/restart_data'//trim(mpiiofs)//trim(file_loc) - inquire (FILE=trim(file_loc), EXIST=file_exist) + if (file_per_process) then + call s_int_to_str(t_step_start, t_step_start_string) + ! Open the file to read conservative variables + write (file_loc, '(I0,A1,I7.7,A)') t_step_start, '_', proc_rank, '.dat' + file_loc = trim(case_dir)//'/restart_data/lustre_'//trim(t_step_start_string)//trim(mpiiofs)//trim(file_loc) + inquire (FILE=trim(file_loc), EXIST=file_exist) - if (file_exist) then - call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, MPI_MODE_RDONLY, mpi_info_int, ifile, ierr) + if (file_exist) then + call MPI_FILE_OPEN(MPI_COMM_SELF, file_loc, MPI_MODE_RDONLY, mpi_info_int, ifile, ierr) - ! Initialize MPI data I/O + ! Initialize MPI data I/O + call s_initialize_mpi_data(q_cons_vf) - call s_initialize_mpi_data(q_cons_vf) + ! Size of local arrays + data_size = (m + 1)*(n + 1)*(p + 1) - ! Size of local arrays - data_size = (m + 1)*(n + 1)*(p + 1) + ! Resize some integers so MPI can read even the biggest file + m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) + n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) + p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) + WP_MOK = int(8d0, MPI_OFFSET_KIND) + MOK = int(1d0, MPI_OFFSET_KIND) + str_MOK = int(name_len, MPI_OFFSET_KIND) + NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) - ! Resize some integers so MPI can read even the biggest file - m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) - n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) - p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) - WP_MOK = int(8d0, MPI_OFFSET_KIND) - MOK = int(1d0, MPI_OFFSET_KIND) - str_MOK = int(name_len, MPI_OFFSET_KIND) - NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) + ! Read the data for each variable + if (bubbles .or. hypoelasticity) then - ! Read the data for each variable - if (bubbles .or. hypoelasticity) then + do i = 1, sys_size!adv_idx%end + var_MOK = int(i, MPI_OFFSET_KIND) - do i = 1, sys_size!adv_idx%end - var_MOK = int(i, MPI_OFFSET_KIND) - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + !Read pb and mv for non-polytropic qbmm + if(qbmm .and. .not. polytropic) then + do i = sys_size + 1, sys_size + 2*nb*nnode + var_MOK = int(i, MPI_OFFSET_KIND) - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) - call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) - end do - !Read pb and mv for non-polytropic qbmm - if(qbmm .and. .not. polytropic) then - do i = sys_size + 1, sys_size + 2*nb*nnode + call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + else + do i = 1, adv_idx%end + var_MOK = int(i, MPI_OFFSET_KIND) + + call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + + call s_mpi_barrier() + + call MPI_FILE_CLOSE(ifile, ierr) + else + call s_mpi_abort('File '//trim(file_loc)//' is missing. Exiting...') + end if + else + ! Open the file to read conservative variables + write (file_loc, '(I0,A)') t_step_start, '.dat' + file_loc = trim(case_dir)//'/restart_data'//trim(mpiiofs)//trim(file_loc) + inquire (FILE=trim(file_loc), EXIST=file_exist) + + if (file_exist) then + call MPI_FILE_OPEN(MPI_COMM_WORLD, file_loc, MPI_MODE_RDONLY, mpi_info_int, ifile, ierr) + + ! Initialize MPI data I/O + + call s_initialize_mpi_data(q_cons_vf) + + ! Size of local arrays + data_size = (m + 1)*(n + 1)*(p + 1) + + ! Resize some integers so MPI can read even the biggest file + m_MOK = int(m_glb + 1, MPI_OFFSET_KIND) + n_MOK = int(n_glb + 1, MPI_OFFSET_KIND) + p_MOK = int(p_glb + 1, MPI_OFFSET_KIND) + WP_MOK = int(8d0, MPI_OFFSET_KIND) + MOK = int(1d0, MPI_OFFSET_KIND) + str_MOK = int(name_len, MPI_OFFSET_KIND) + NVARS_MOK = int(sys_size, MPI_OFFSET_KIND) + + ! Read the data for each variable + if (bubbles .or. hypoelasticity) then + + do i = 1, sys_size!adv_idx%end var_MOK = int(i, MPI_OFFSET_KIND) ! Initial displacement to skip at beginning of file disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) + 'native', mpi_info_int, ierr) call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) + MPI_DOUBLE_PRECISION, status, ierr) end do - end if - else - do i = 1, adv_idx%end - var_MOK = int(i, MPI_OFFSET_KIND) + !Read pb and mv for non-polytropic qbmm + if(qbmm .and. .not. polytropic) then + do i = sys_size + 1, sys_size + 2*nb*nnode + var_MOK = int(i, MPI_OFFSET_KIND) + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if + else + do i = 1, adv_idx%end + var_MOK = int(i, MPI_OFFSET_KIND) - ! Initial displacement to skip at beginning of file - disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) + ! Initial displacement to skip at beginning of file + disp = m_MOK*max(MOK, n_MOK)*max(MOK, p_MOK)*WP_MOK*(var_MOK - 1) - call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & - 'native', mpi_info_int, ierr) - call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & - MPI_DOUBLE_PRECISION, status, ierr) - end do - end if + call MPI_FILE_SET_VIEW(ifile, disp, MPI_DOUBLE_PRECISION, MPI_IO_DATA%view(i), & + 'native', mpi_info_int, ierr) + call MPI_FILE_READ(ifile, MPI_IO_DATA%var(i)%sf, data_size, & + MPI_DOUBLE_PRECISION, status, ierr) + end do + end if - call s_mpi_barrier() + call s_mpi_barrier() - call MPI_FILE_CLOSE(ifile, ierr) - else - call s_mpi_abort('File '//trim(file_loc)//' is missing. Exiting...') + call MPI_FILE_CLOSE(ifile, ierr) + else + call s_mpi_abort('File '//trim(file_loc)//' is missing. Exiting...') + end if end if deallocate (x_cb_glb, y_cb_glb, z_cb_glb) diff --git a/toolchain/mfc/run/case_dicts.py b/toolchain/mfc/run/case_dicts.py index 1a753d1b9..4299c67a8 100644 --- a/toolchain/mfc/run/case_dicts.py +++ b/toolchain/mfc/run/case_dicts.py @@ -7,7 +7,7 @@ "Web", "poly_sigma", "case_dir", "thermal", "polytropic", "m", "mpp_lim", "R0ref", "adv_alphan", "num_fluids", "model_eqns", "nb", "weno_order", "rhoref", "bubbles", "Re_inv", "n", "precision", - "Ca", "polydisperse" + "Ca", "polydisperse", "file_per_process" ] From b0002b3942dacfc92d2b60cf50f46e152e46be1b Mon Sep 17 00:00:00 2001 From: Ben Wilfong <48168887+wilfonba@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:19:33 -0500 Subject: [PATCH 2/7] Additional documentation --- docs/documentation/case.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/documentation/case.md b/docs/documentation/case.md index fd97d3b43..d5c03c7fb 100644 --- a/docs/documentation/case.md +++ b/docs/documentation/case.md @@ -344,6 +344,7 @@ Note that `time_stepper` $=$ 3 specifies the total variation diminishing (TVD), | `format` | Integer | Output format. [1]: Silo-HDF5; [2] Binary | | `precision` | Integer | [1] Single; [2] Double | | `parallel_io` | Logical | Parallel I/O | +| `file_per_process` | Logical | Whether or not to write one IO file per process | | `cons_vars_wrt` | Logical | Write conservative variables | | `prim_vars_wrt` | Logical | Write primitive variables | | `alpha_rho_wrt(i)` | Logical | Add the partial density of the fluid $i$ to the database \| @@ -377,7 +378,10 @@ The table lists formatted database output parameters. The parameters define vari With parallel I/O, MFC inputs and outputs a single file throughout pre-process, simulation, and post-process, regardless of the number of processors used. Parallel I/O enables the use of different number of processors in each of the processes (i.e. simulation data generated using 1000 processors can be post-processed using a single processor). -- `cons_vars_wrt` and `prim_vars_wrt} activate output of conservative and primitive state variables into the database, respectively. +- `file_per_process` deactivates shared file MPI-IO and activates file per process MPI-IO. The default behaviour is to use a shared file. + File per process is usefull when running on 10's of thousands of ranks. + +- `cons_vars_wrt` and `prim_vars_wrt` activate output of conservative and primitive state variables into the database, respectively. - `[variable's name]_wrt` activates output of the each specified variable into the database. From 9dba3bfdb19b2c4f00cc97200b3e953863f533b5 Mon Sep 17 00:00:00 2001 From: Ben Wilfong <48168887+wilfonba@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:41:15 -0500 Subject: [PATCH 3/7] add example case --- examples/2D_riemann_test/README.md | 11 +++++++++++ examples/2D_riemann_test/alpha_rho1_final.png | Bin 0 -> 140823 bytes .../2D_riemann_test/alpha_rho1_initial.png | Bin 0 -> 7163 bytes 3 files changed, 11 insertions(+) create mode 100644 examples/2D_riemann_test/README.md create mode 100644 examples/2D_riemann_test/alpha_rho1_final.png create mode 100644 examples/2D_riemann_test/alpha_rho1_initial.png diff --git a/examples/2D_riemann_test/README.md b/examples/2D_riemann_test/README.md new file mode 100644 index 000000000..4e644c988 --- /dev/null +++ b/examples/2D_riemann_test/README.md @@ -0,0 +1,11 @@ +# 2D Riemann Test (2D) + +Reference: Chamarthi, A., & Hoffmann, N., & Nishikawa, H., & Frankel S. (2023). Implicit gradients based conservative numerical scheme for compressible flows. arXiv:2110.05461 + +## Density Initial Condition + +![Density](alpha_rho1_initial.png) + +## Density Final Condition + +![Density Norms](alpha_rho1_final.png) diff --git a/examples/2D_riemann_test/alpha_rho1_final.png b/examples/2D_riemann_test/alpha_rho1_final.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b0d71e78fc586f9e93da6a5c5e8046bf26f59a GIT binary patch literal 140823 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 *~}zooS= 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 Date: Thu, 14 Dec 2023 10:59:44 -0500 Subject: [PATCH 4/7] requested changes --- docs/documentation/expectedPerformance.md | 14 ++++++++------ docs/res/strongScaling/S01.95 | 1 - src/post_process/m_global_parameters.fpp | 2 +- src/pre_process/m_global_parameters.fpp | 2 +- src/simulation/m_global_parameters.fpp | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) delete mode 100644 docs/res/strongScaling/S01.95 diff --git a/docs/documentation/expectedPerformance.md b/docs/documentation/expectedPerformance.md index c2455d3a0..8d528412c 100644 --- a/docs/documentation/expectedPerformance.md +++ b/docs/documentation/expectedPerformance.md @@ -11,9 +11,10 @@ The following table outlines expected performance in terms of number of time-ste | Hardware | # Ranks | 1M Cells | 4M Cells | 8M Cells | Compiler | Computer | | ---: | :----: | :----: | :---: | :---: | :----: | :--- | | Nvidia V100 | 1 | 88.5k | 18.7k | N/A | NVHPC 22.11 | PACE Phoenix | +| Nvidia V100 | 1 | 78.8k | 18.8k | N/A | NVHPC 22.11 | OLCF Summit | | Nvidia A100 | 1 | 114.4k | 34.6k | 16.5k | NVHPC 23.5 | Wingtip | | AMD MI250x | 1 | 77.5k | 22.3k | 11.2k | CCE 16.0.1 | OLCF Frontier | -| Intel Xeon Gold 6226 | 12 | 2.5k | 0.7k | 0.4k | GNU 10.3.0 | Pace Phoenix | +| Intel Xeon Gold 6226 | 12 | 2.5k | 0.7k | 0.4k | GNU 10.3.0 | PACE Phoenix | | Apple Silicon M2 | 6 | 2.8k | 0.6k | 0.2k | GNU 13.2.0 | N/A | If `'model_eqns' : 3` is replaced by `'model_eqns' : 2`, an inviscid 5-equation model is used. @@ -23,10 +24,11 @@ The following table outlines expected performance in terms of number of time-ste | Hardware | # Ranks | 1M Cells | 4M Cells | 8M Cells | Compiler | Computer | | ---: | :----: | :----: | :---: | :---: | :----: | :--- | -| Nvidia V100 | 1 | 113.4k | 26.2k | N/A | NVHPC 22.11 | PACE Phoenix | +| Nvidia V100 | 1 | 113.4k | 26.2k | 13.0k | NVHPC 22.11 | PACE Phoenix | +| Nvidia V100 | 1 | 107.7k | 26.3k | 13.1k | NVHPC 22.11 | OLCF Summit | | Nvidia A100 | 1 | 153.5k | 48.0k | 22.5k | NVHPC 23.5 | Wingtip | | AMD MI250x | 1 | 104.2k | 31.0k | 14.8k | CCE 16.0.1 | OLCF Frontier | -| Intel Xeon Gold 6226 | 12 | 5.4k | 1.6k | 0.8k | GNU 10.3.0 | Pace Phoenix | +| Intel Xeon Gold 6226 | 12 | 5.4k | 1.6k | 0.8k | GNU 10.3.0 | PACE Phoenix | | Apple Silicon M2 | 6 | 3.7k | 11.0k | 0.3k | GNU 13.2.0 | N/A | ## Weak scaling @@ -35,17 +37,17 @@ Strong scaling results are obtained by increasing the problem size with the numb so that work per process remains constant. ### AMD MI250X GPU -MFC weask scales to 65,536 AMD MI250X GPUs on OLCF Frontier with 96% efficiency. +MFC weask scales to 65,536 AMD MI250X GPUs on OLCF Frontier with 96% efficiency. This corresponds to 87% of the entire machine. ### Nvidia V100 GPU -MFC weak scales to 13,824 V100 Nvidia V100 GPUs on OLCF Summit with 97% efficiency. +MFC weak scales to 13,824 V100 Nvidia V100 GPUs on OLCF Summit with 97% efficiency. This corresponds to 50% of the entire machine. ### IMB Power9 CPU -MFC Weak scales to 13,824 Power9 CPU cores on OLCF Summit with 1% of ideal scaling. +MFC Weak scales to 13,824 Power9 CPU cores on OLCF Summit to within 1% of ideal scaling. diff --git a/docs/res/strongScaling/S01.95 b/docs/res/strongScaling/S01.95 deleted file mode 100644 index ebd60169b..000000000 --- a/docs/res/strongScaling/S01.95 +++ /dev/null @@ -1 +0,0 @@ - Towards exascale multiphase compressible flow simulation via scalable interface capturing-based solvers and GPU acceleration - Anand Radhakrishnan

Towards exascale multiphase compressible flow simulation via scalable interface capturing-based solvers and GPU acceleration

Date:

diff --git a/src/post_process/m_global_parameters.fpp b/src/post_process/m_global_parameters.fpp index 31521593f..ff0d06985 100644 --- a/src/post_process/m_global_parameters.fpp +++ b/src/post_process/m_global_parameters.fpp @@ -295,7 +295,7 @@ contains flux_lim = dflt_int flux_wrt = .false. parallel_io = .false. - file_per_process = .true. + file_per_process = .false. E_wrt = .false. pres_wrt = .false. alpha_wrt = .false. diff --git a/src/pre_process/m_global_parameters.fpp b/src/pre_process/m_global_parameters.fpp index 81f6898ff..8d23c22ac 100644 --- a/src/pre_process/m_global_parameters.fpp +++ b/src/pre_process/m_global_parameters.fpp @@ -251,7 +251,7 @@ contains bc_z%beg = dflt_int; bc_z%end = dflt_int parallel_io = .false. - file_per_process = .true. + file_per_process = .false. precision = 2 vel_profile = .false. instability_wave = .false. diff --git a/src/simulation/m_global_parameters.fpp b/src/simulation/m_global_parameters.fpp index 590782e51..439533ca3 100644 --- a/src/simulation/m_global_parameters.fpp +++ b/src/simulation/m_global_parameters.fpp @@ -374,7 +374,7 @@ contains null_weights = .false. mixture_err = .false. parallel_io = .false. - file_per_process = .true. + file_per_process = .false. precision = 2 hypoelasticity = .false. weno_flat = .true. From 8339fc05e6d7e440b1225430ab36a8b9eb483e80 Mon Sep 17 00:00:00 2001 From: Spencer Bryngelson Date: Thu, 14 Dec 2023 11:47:57 -0500 Subject: [PATCH 5/7] Update expectedPerformance.md --- docs/documentation/expectedPerformance.md | 64 ++++++++++++----------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/docs/documentation/expectedPerformance.md b/docs/documentation/expectedPerformance.md index 8d528412c..1992fb8c4 100644 --- a/docs/documentation/expectedPerformance.md +++ b/docs/documentation/expectedPerformance.md @@ -1,76 +1,78 @@ # Performance Results -MFC has been extensively benchmarked on both CPUs and GPUs. A summary of these results follow. +MFC has been extensively benchmarked on CPUs and GPU devices. +A summary of these results follows. ## Expected time-steps/hour -The following table outlines expected performance in terms of number of time-steps per hour -(rounded to the nearest hundred) for various problem sizes and hardware for a inviscid, 6-equation, -3D simulation. CPU results utilize an entire die. +The following table outlines expected performance in terms of the number of time steps per hour +(rounded to the nearest hundred) for various problem sizes (grid cells) and hardware for an inviscid, 6-equation (`model_eqns' : 3`), 3D simulation. +CPU results utilize an entire die. | Hardware | # Ranks | 1M Cells | 4M Cells | 8M Cells | Compiler | Computer | | ---: | :----: | :----: | :---: | :---: | :----: | :--- | -| Nvidia V100 | 1 | 88.5k | 18.7k | N/A | NVHPC 22.11 | PACE Phoenix | -| Nvidia V100 | 1 | 78.8k | 18.8k | N/A | NVHPC 22.11 | OLCF Summit | -| Nvidia A100 | 1 | 114.4k | 34.6k | 16.5k | NVHPC 23.5 | Wingtip | -| AMD MI250x | 1 | 77.5k | 22.3k | 11.2k | CCE 16.0.1 | OLCF Frontier | +| NVIDIA V100 | 1 | 88.5k | 18.7k | N/A | NVHPC 22.11 | PACE Phoenix | +| NVIDIA V100 | 1 | 78.8k | 18.8k | N/A | NVHPC 22.11 | OLCF Summit | +| NVIDIA A100 | 1 | 114.4k | 34.6k | 16.5k | NVHPC 23.5 | Wingtip | +| AMD MI250X | 1 | 77.5k | 22.3k | 11.2k | CCE 16.0.1 | OLCF Frontier | | Intel Xeon Gold 6226 | 12 | 2.5k | 0.7k | 0.4k | GNU 10.3.0 | PACE Phoenix | | Apple Silicon M2 | 6 | 2.8k | 0.6k | 0.2k | GNU 13.2.0 | N/A | If `'model_eqns' : 3` is replaced by `'model_eqns' : 2`, an inviscid 5-equation model is used. -The following table outlines expected performance in terms of number of time-steps per hour -(rounded to the nearest hundred) for various problem sizes and hardware for a inviscid, 5-equation, -3D simulation. CPU results utilize an entire die. +The following table outlines expected performance in terms of the number of time-steps per hour (rounded to the nearest hundred) for various problem sizes and hardware for an inviscid, 5-equation, +3D simulation. +CPU results utilize an entire die. | Hardware | # Ranks | 1M Cells | 4M Cells | 8M Cells | Compiler | Computer | | ---: | :----: | :----: | :---: | :---: | :----: | :--- | -| Nvidia V100 | 1 | 113.4k | 26.2k | 13.0k | NVHPC 22.11 | PACE Phoenix | -| Nvidia V100 | 1 | 107.7k | 26.3k | 13.1k | NVHPC 22.11 | OLCF Summit | -| Nvidia A100 | 1 | 153.5k | 48.0k | 22.5k | NVHPC 23.5 | Wingtip | -| AMD MI250x | 1 | 104.2k | 31.0k | 14.8k | CCE 16.0.1 | OLCF Frontier | +| NVIDIA V100 | 1 | 113.4k | 26.2k | 13.0k | NVHPC 22.11 | PACE Phoenix | +| NVIDIA V100 | 1 | 107.7k | 26.3k | 13.1k | NVHPC 22.11 | OLCF Summit | +| NVIDIA A100 | 1 | 153.5k | 48.0k | 22.5k | NVHPC 23.5 | Wingtip | +| AMD MI250X | 1 | 104.2k | 31.0k | 14.8k | CCE 16.0.1 | OLCF Frontier | | Intel Xeon Gold 6226 | 12 | 5.4k | 1.6k | 0.8k | GNU 10.3.0 | PACE Phoenix | | Apple Silicon M2 | 6 | 3.7k | 11.0k | 0.3k | GNU 13.2.0 | N/A | ## Weak scaling -Strong scaling results are obtained by increasing the problem size with the number of processes -so that work per process remains constant. +Strong scaling results are obtained by increasing the problem size with the number of processes so that work per process remains constant. ### AMD MI250X GPU -MFC weask scales to 65,536 AMD MI250X GPUs on OLCF Frontier with 96% efficiency. This corresponds to 87% of the entire machine. + +MFC weask scales to (at least) 65,536 AMD MI250X GPUs on OLCF Frontier with 96% efficiency. +This corresponds to 87% of the entire machine. -### Nvidia V100 GPU -MFC weak scales to 13,824 V100 Nvidia V100 GPUs on OLCF Summit with 97% efficiency. This corresponds to 50% of the entire machine. +### NVIDIA V100 GPU + +MFC weak scales to (at least) 13,824 V100 NVIDIA V100 GPUs on OLCF Summit with 97% efficiency. +This corresponds to 50% of the entire machine. -### IMB Power9 CPU +### IBM Power9 CPU MFC Weak scales to 13,824 Power9 CPU cores on OLCF Summit to within 1% of ideal scaling. ## Strong scaling -Strong scaling results are obtained by keeping the problem size constant and increasing -the number of process so that work per process decreases. +Strong scaling results are obtained by keeping the problem size constant and increasing the number of processes so that work per process decreases. -### Nvidia V100 GPU +### NVIDIA V100 GPU -For these tests, the base case utilizes 8 GPUs with one MPI process per GPU. The performance -is analyzed at two different problem sizes of 16 and 64M grid points, with the base case using -2 and 8M grid points per process. +For these tests, the base case utilizes 8 GPUs with one MPI process per GPU. +The performance is analyzed at two different problem sizes of 16M and 64M grid points, with the base case using 2M and 8M grid points per process. #### 16M Grid Points + #### 64M Grid Points -### IBM Power 9 CPU +### IBM Power9 CPU -CPU strong scaling tests are done with problem sizes of 16, 32, and 64M grid points, with the -base case using 2, 4, and 8M cells per process. +CPU strong scaling tests are done with problem sizes of 16, 32, and 64M grid points, with the base case using 2, 4, and 8M cells per process. - \ No newline at end of file + From 7994f5d67ba3d1ec5ce66a83e7acc9bfa7fe975f Mon Sep 17 00:00:00 2001 From: Ben Wilfong <48168887+wilfonba@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:08:04 -0500 Subject: [PATCH 6/7] small .md correction and added performance to list of pages. --- docs/documentation/expectedPerformance.md | 2 +- docs/documentation/readme.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/documentation/expectedPerformance.md b/docs/documentation/expectedPerformance.md index 1992fb8c4..ddfe38d75 100644 --- a/docs/documentation/expectedPerformance.md +++ b/docs/documentation/expectedPerformance.md @@ -34,7 +34,7 @@ CPU results utilize an entire die. ## Weak scaling -Strong scaling results are obtained by increasing the problem size with the number of processes so that work per process remains constant. +Weak scaling results are obtained by increasing the problem size with the number of processes so that work per process remains constant. ### AMD MI250X GPU diff --git a/docs/documentation/readme.md b/docs/documentation/readme.md index cfe9e4eb5..6d8256c51 100644 --- a/docs/documentation/readme.md +++ b/docs/documentation/readme.md @@ -8,6 +8,7 @@ - [Example Cases](examples.md) - [Running MFC](running.md) - [Flow Visualisation](visualisation.md) +- [Performance Results](expectedPerformance.md) - [MFC's Authors](authors.md) - [References](references.md) From 61688cd03281dea4f8140948cd5c28eebf243424 Mon Sep 17 00:00:00 2001 From: Henry LE BERRE Date: Thu, 14 Dec 2023 09:10:50 -0800 Subject: [PATCH 7/7] #255: CMake Docs: Missing call to examples.sh --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dcd976ca..3d656d124 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -446,15 +446,16 @@ if (MFC_SYSCHECK) endif() if (MFC_DOCUMENTATION) - # Files in docs/examples are used to generate docs/documentation/examples.md - file(GLOB_RECURSE examples_DOCs CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/examples/*") + # Files in examples/ are used to generate docs/documentation/examples.md + file(GLOB_RECURSE examples_DOCs CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/examples/*") add_custom_command( OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/examples.md" - DEPENDS "${examples_DOCs}" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/examples.sh;${examples_DOCs}" COMMAND "bash" "${CMAKE_CURRENT_SOURCE_DIR}/docs/examples.sh" "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Generating examples.md" + VERBATIM ) file(GLOB common_DOCs CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/docs/*") @@ -486,7 +487,7 @@ if (MFC_DOCUMENTATION) "${CMAKE_CURRENT_BINARY_DIR}/${target}-Doxyfile" @ONLY) set(opt_example_dependency "") - if (target STREQUAL "documentation") + if (${target} STREQUAL documentation) set(opt_example_dependency "${CMAKE_CURRENT_SOURCE_DIR}/docs/documentation/examples.md") endif()