Skip to content

Commit

Permalink
Merge pull request #2815 from GEOS-ESM/feature/mathomp4/update-checkp…
Browse files Browse the repository at this point in the history
…oint-sim

Do not create file if not writing
  • Loading branch information
mathomp4 authored May 16, 2024
2 parents 910fe5b + f485be6 commit 5794f19
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 22 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- Updated `checkpoint_simulator` to not create and close file if not writing

### Fixed

### Removed
Expand Down
6 changes: 3 additions & 3 deletions benchmarks/io/checkpoint_simulator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ The code has the following options and needs an ESMF rc file named checkpoint\_b
- "NX:" the x distribution for each face
- "NY:" the y distribution for each face
- "IM\_WORLD:" the cube resolution
- "LM:" the nubmer of levels
- "LM:" the number of levels
- "NUM\_WRITERS:" the number of writing processes either to a single or independent files
- "NUM\_ARRAYS:" the number of 3D variables to write to the file
- "CHUNK:" whether to chunk, default true
- "GATHER\_3D:" gather all levels at once (default is false which means a level at a time is gathered)
- "SPLIT\_FILE:" default false, if true, each writer writes to and independent file
- "WRITE\_BARRIER:" default false, add a barrier before each write to for synchronization
- "DO\_WRITES:" default true, if false skips writing (so just an mpi test at that point)
- "NTRIAL:" default 1, the number of trials to make writing
- "NTRIALS:" default 1, the number of trials to make writing
- "RANDOM\_DATA:" default true, if true will arrays with random data, if false sets the array to the rank of the process

Note that whatever you set NX and NY to the program must be run on 6*NY*NY processors and the number of writers must evenly divide 6*NY
Note that whatever you set NX and NY to the program must be run on `6*NX*NY` processors and the number of writers must evenly divide `6*NY`
38 changes: 19 additions & 19 deletions benchmarks/io/checkpoint_simulator/checkpoint_simulator.F90
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ module mapl_checkpoint_support_mod
procedure :: write_level
procedure :: write_variable
procedure :: reset
end type
end type

contains

Expand Down Expand Up @@ -98,7 +98,7 @@ subroutine set_parameters(this,config_file)
this%mpi_time = 0.0
call MPI_COMM_SIZE(MPI_COMM_WORLD,comm_size,status)
if (comm_size /= (this%nx*this%ny*6)) call MPI_Abort(mpi_comm_world,error_code,status)

contains

function get_logical_key(config,label,default_val) result(val)
Expand All @@ -115,7 +115,7 @@ function get_logical_key(config,label,default_val) result(val)
val = default_val
end if
end function

function get_integer_key(config,label,default_val) result(val)
integer :: val
type(ESMF_Config), intent(Inout) :: config
Expand All @@ -130,7 +130,7 @@ function get_integer_key(config,label,default_val) result(val)
val = default_val
end if
end function

end subroutine

subroutine reset(this)
Expand All @@ -144,7 +144,7 @@ subroutine reset(this)
this%time_writing = 0.d0
this%mpi_time = 0.0
end subroutine

function compute_decomposition(this,axis) result(decomp)
integer, allocatable :: decomp(:)
class(test_support), intent(inout) :: this
Expand Down Expand Up @@ -172,7 +172,7 @@ subroutine allocate_n_arrays(this,im,jm)
class(test_support), intent(inout) :: this
integer, intent(in) :: im
integer, intent(in) :: jm

integer :: n,rank,status
character(len=3) :: formatted_int
integer :: seed_size
Expand Down Expand Up @@ -201,7 +201,7 @@ subroutine create_arrays(this)
integer, allocatable :: ims(:),jms(:)
integer :: rank, status,comm_size,n,i,j,rank_counter,offset,index_offset

call MPI_Comm_Rank(MPI_COMM_WORLD,rank,status)
call MPI_Comm_Rank(MPI_COMM_WORLD,rank,status)
call MPI_Comm_Size(MPI_COMM_WORLD,comm_size,status)
allocate(this%bundle(this%num_arrays))
ims = this%compute_decomposition(axis=1)
Expand Down Expand Up @@ -244,13 +244,13 @@ subroutine create_arrays(this)
rank_counter = rank_counter + 1
enddo
enddo
enddo
enddo

end subroutine

subroutine create_communicators(this)
class(test_support), intent(inout) :: this

integer :: myid,status,nx0,ny0,color,j,ny_by_writers,local_ny,key

local_ny = this%ny*6
Expand Down Expand Up @@ -280,7 +280,7 @@ subroutine create_communicators(this)

call MPI_BARRIER(mpi_comm_world,status)


end subroutine

subroutine close_file(this)
Expand Down Expand Up @@ -344,7 +344,7 @@ subroutine create_file(this)
status = nf90_def_dim(this%ncid,"lon",this%im_world,xdim)
if (this%split_file) then
y_size = this%im_world*6/this%num_writers
else
else
y_size = this%im_world*6
end if
status = nf90_def_dim(this%ncid,"lat",y_size,ydim)
Expand Down Expand Up @@ -384,7 +384,7 @@ subroutine create_file(this)
subroutine write_file(this)
class(test_support), intent(inout) :: this
integer :: status,i,l

integer(kind=INT64) :: sub_start,sub_end

call MPI_BARRIER(MPI_COMM_WORLD,status)
Expand Down Expand Up @@ -619,7 +619,7 @@ subroutine write_level(this,var_name,local_var,z_index)
io_time = end_time-start_time
this%data_volume = this%data_volume+byte_to_mega*4.d0*size(var,kind=INT64)
this%time_writing = this%time_writing + real(io_time,kind=REAL64)/real(count_rate,kind=REAL64)

deallocate(VAR, stat=status)

endif ! myiorank
Expand Down Expand Up @@ -676,13 +676,13 @@ program checkpoint_tester

call system_clock(count=start_write)
call MPI_Barrier(MPI_COMM_WORLD,status)
call support%create_file()
if (support%do_writes) call support%create_file()
call MPI_Barrier(MPI_COMM_WORLD,status)

call support%write_file()
call MPI_Barrier(MPI_COMM_WORLD,status)

call support%close_file()
if (support%do_writes) call support%close_file()
call MPI_Barrier(MPI_COMM_WORLD,status)

call system_clock(count=end_time)
Expand All @@ -707,7 +707,7 @@ program checkpoint_tester
all_proc_throughput(i) = real(support%num_writers,kind=REAL32)*average_volume/average_time
end if
enddo

call system_clock(count=end_app)
application_time = real(end_app - start_app,kind=REAL64)/real(count_rate,kind=REAL64)
if (rank == 0) then
Expand Down Expand Up @@ -741,7 +741,7 @@ program checkpoint_tester
std_fs_throughput = sqrt(std_fs_throughput/real(support%n_trials,kind=REAL64))
write(*,'(G16.8,G16.8,G16.8,G16.8)')mean_throughput,std_throughput,mean_fs_throughput,std_fs_throughput
end if


call MPI_Finalize(status)
end program

0 comments on commit 5794f19

Please sign in to comment.