13 #define MAXCHARLEN 256
14 #define sion_int64 integer*8
28 integer ierr, np, rank, rankl
30 integer*8 totalsize, chunksize,bufsize
31 character,
dimension(:),
pointer :: localbuffer
32 character(len=MAXCHARLEN) :: filename =
'test_sionfile.sion'
33 character(len=MAXCHARLEN) :: newfname =
'newfile'
35 integer :: narg, nfiles
36 character(len=256) argv
38 logical collectiveread
40 double precision gstarttime,starttime,opentime,gwritetime,writetime,closetime,readtime,greadtime
41 double precision barr1time,barr2time,barr3time
43 integer*8 bsumwrote,sumsize,bsumread, left
45 real*8 checksum_fp, checksum_read_fp
46 integer globalrank, sid, i
48 integer*8 bwrite,bwrote,btoread,bread
51 integer chunkcnt,size1
56 integer comm,gComm,lComm
59 call mpi_comm_size(mpi_comm_world, np, ierr)
60 call mpi_comm_rank(mpi_comm_world, rank, ierr)
68 collectiveread = .true.
73 narg = command_argument_count()
75 call get_command_argument(i, argv)
77 if( argv(:1) ==
'-' )
then
79 select case( argv(2:) )
82 call get_command_argument(i, argv)
86 call get_command_argument(i, argv)
90 call get_command_argument(i, argv)
91 read(argv,
'(I20)') bufsize
94 call get_command_argument(i, argv)
95 read(argv,
'(I20)') bufsize
99 call get_command_argument(i, argv)
100 read(argv,
'(I20)') totalsize
103 call get_command_argument(i, argv)
104 read(argv,
'(I20)') nfiles
107 call get_command_argument(i, argv)
108 read(argv,
'(I20)') totalsize
109 totalsize = totalsize mb
112 call get_command_argument(i, argv)
113 read(argv,
'(I20)') chunksize
116 call get_command_argument(i, argv)
117 read(argv,
'(I20)') chunksize
118 chunksize = chunksize mb
121 call get_command_argument(i, argv)
122 read(argv,
'(I20)') fsblksize
125 call get_command_argument(i, argv)
126 read(argv,
'(I20)') fsblksize
127 fsblksize = fsblksize mb
130 call get_command_argument(i, argv)
131 if (argv /=
'0')
then
132 collectiveread = .true.
134 collectiveread = .false.
137 call get_command_argument(0, argv)
142 call get_command_argument(0, argv)
150 call mpi_bcast(filename,maxcharlen,mpi_character,0,mpi_comm_world, ierr)
151 call mpi_bcast(bufsize,1,mpi_integer4,0,mpi_comm_world, ierr)
152 call mpi_bcast(totalsize,1,mpi_integer8,0,mpi_comm_world, ierr)
153 call mpi_bcast(chunksize,1,mpi_integer8,0,mpi_comm_world, ierr)
154 call mpi_bcast(fsblksize,1,mpi_integer,0,mpi_comm_world, ierr)
155 call mpi_bcast(collectiveread,1,mpi_logical,0,mpi_comm_world, ierr)
156 call mpi_bcast(nfiles,1,mpi_integer,0,mpi_comm_world, ierr)
161 write(0,
'(A)')
"partest parameter: Checksum DISABLED!!",
" "
163 write(0, 100)
"datafile", trim(filename)
164 write(0, 103)
"number of files",nfiles
166 write(0, 101)
"local buffer size / task", bufsize, bufsize/(1.0 mb)
167 write(0, 101)
"total data size / task", totalsize, totalsize/(1.0 mb)
168 write(0, 101)
"sion chunk size", chunksize, chunksize/(1.0 mb)
169 write(0, 101)
"fs block size", fsblksize, fsblksize/(1.0 mb)
170 write(0, 102)
"Collective", collectiveread
173 100
format(
"partest parameter: ",a30,tr1,
" = ",a)
174 101
format(
"partest parameter: ",a30,tr1,
" = ",i10,
" bytes (",f10.4,
" MB)")
175 102
format(
"partest parameter: ",a30,tr1,
" = ",l5)
176 103
format(
"partest parameter: ",a30,tr1,
" = ",i10)
180 call barrier_after_start(mpi_comm_world)
182 allocate( localbuffer(bufsize) )
183 localbuffer(:) = achar(ichar(
'a')+rank)
185 call barrier_after_malloc(mpi_comm_world)
188 comm = mpi_comm_world
195 starttime = mpi_wtime()
196 call fsion_paropen_mpi(trim(filename),
'bw',nfiles, gcomm,lcomm,chunksize,fsblksize,globalrank,newfname,sid)
199 write(0, 101)
"fs block size (calc)", fsblksize, fsblksize/(1.0 mb)
202 opentime = mpi_wtime() - starttime
204 call mpi_comm_rank(lcomm, rankl, ierr)
208 starttime = mpi_wtime()
209 call barrier_after_open(lcomm)
210 barr1time = mpi_wtime()-starttime
217 starttime = mpi_wtime()
218 gstarttime = starttime
222 if (bwrite > left) bwrite = left
224 call fsion_ensure_free_space(sid,bwrite,ierr)
225 call fsion_write(localbuffer, 1, bwrite, sid, bwrote)
230 checksum_fp = checksum_fp + real(iachar(localbuffer(i)))
235 bsumwrote = bsumwrote + bwrote
236 chunkcnt = chunkcnt + 1
241 writetime = mpi_wtime() - starttime
243 starttime = mpi_wtime()
244 call barrier_after_write(lcomm)
245 barr2time = mpi_wtime() - starttime
246 gwritetime = mpi_wtime() - gstarttime
248 starttime = mpi_wtime()
249 call fsion_parclose_mpi(sid,ierr)
250 closetime = mpi_wtime() - starttime
252 starttime = mpi_wtime()
253 call barrier_after_close(lcomm)
254 barr3time = mpi_wtime()-starttime
256 if (writetime == 0) writetime = -1
268 call mpi_reduce(bsumwrote, sumsize, 1, mpi_integer8, mpi_sum, 0, lcomm, ierr)
270 write (0,111) 1.0*sumsize/1024.0/1024.0, newfname
271 111
format(
"Write partest result: wrote ",f10.4,
" MB to >",a30,
"<")
275 call mpi_reduce(bsumwrote, sumsize, 1, mpi_integer8, mpi_sum, 0, gcomm, ierr)
276 call mpi_barrier(gcomm,ierr)
279 write(0,
'(A)')
"-----------------------------------------------------------------------"
280 write(0,112) 1.0*sumsize/1024.0/1024.0, gwritetime, 1.0*sumsize/1024.0/1024.0/gwritetime
282 112
format(
"TOTAL: Write partest result: wrote ",f10.4,
" MB write+barrier= ",f10.6,
"s bw= ",f10.4,
" MB/s")
283 write(0,
'(A)')
"-----------------------------------------------------------------------"
287 call mpi_barrier(lcomm,ierr)
288 call mpi_comm_free(lcomm,ierr)
291 if (rank == 0)
write(0,
'(A)')
"***********************************************************************"
296 starttime = mpi_wtime();
297 if (collectiveread)
then
298 call fsion_paropen_mpi(trim(filename),
'br',nfiles, gcomm,lcomm,chunksize,fsblksize,globalrank,newfname,sid)
300 call fsion_open_rank(trim(filename),
"br",rchunksize,rblocksize,rank,sid)
303 opentime = mpi_wtime()-starttime
305 call mpi_comm_rank(lcomm, rankl, ierr)
307 starttime = mpi_wtime()
308 call barrier_after_open(lcomm)
309 barr1time = mpi_wtime()-starttime
311 starttime = mpi_wtime()
312 gstarttime = starttime
319 call fsion_feof(sid,feof)
321 do while( (left > 0) .AND. (feof /= 1 ) )
324 if( btoread>left ) btoread = left
326 call fsion_read(localbuffer, 1, btoread, sid, bread)
330 checksum_read_fp = checksum_read_fp + real(iachar(localbuffer(i)))
335 bsumread = bsumread + bread
336 chunkcnt = chunkcnt + 1
339 call fsion_feof(sid,feof)
342 readtime = mpi_wtime()-starttime
344 starttime = mpi_wtime()
345 call barrier_after_read(lcomm)
346 barr2time = mpi_wtime()-starttime
348 greadtime = mpi_wtime()-gstarttime
350 starttime = mpi_wtime()
351 if(collectiveread)
then
352 call fsion_parclose_mpi(sid,ierr)
354 call fsion_close(sid,ierr)
356 closetime = mpi_wtime()-starttime
358 if(readtime == 0) readtime = -1
361 if (abs(checksum_fp-checksum_read_fp)>1e-5)
then
362 write(0,*)
"ERROR in double checksum ",checksum_fp,
"!=",checksum_read_fp,
" diff=",(checksum_fp-checksum_read_fp)
367 call mpi_reduce(bsumread, sumsize, 1, mpi_integer8, mpi_sum, 0, lcomm, ierr)
369 write (0,113) 1.0*sumsize/1024.0/1024.0, newfname
370 113
format(
"Read partest result: read ",f10.4,
" MB from >",a30,
"<")
376 call mpi_reduce(bsumread, sumsize, 1, mpi_integer8, mpi_sum, 0, gcomm, ierr)
377 call mpi_barrier(gcomm,ierr)
380 write(0,
'(A)')
"-----------------------------------------------------------------------"
381 write(0,114) 1.0*sumsize/1024.0/1024.0, greadtime, 1.0*sumsize/1024.0/1024.0/greadtime
383 114
format(
"TOTAL: Read partest result: read ",f10.4,
" MB read+barrier= ",f10.6,
"s bw= ",f10.4,
" MB/s")
384 write(0,
'(A)')
"-----------------------------------------------------------------------"
388 call mpi_barrier(lcomm,ierr)
389 call mpi_comm_free(lcomm,ierr)
392 deallocate(localbuffer)
394 call mpi_finalize(ierr)
398 subroutine barrier_after_start(comm)
399 integer,
intent(in) :: comm
401 call mpi_barrier(comm,ierr)
404 subroutine barrier_after_malloc(comm)
405 integer,
intent(in) :: comm
408 call mpi_barrier(comm,ierr)
411 subroutine barrier_after_open(comm)
412 integer,
intent(in) :: comm
414 call mpi_barrier(comm,ierr)
418 subroutine barrier_after_write(comm)
419 integer,
intent(in) :: comm
421 call mpi_barrier(comm,ierr)
424 subroutine barrier_after_read(comm)
425 integer,
intent(in) :: comm
427 call mpi_barrier(comm,ierr)
430 subroutine barrier_after_close(comm)
431 integer,
intent(in) :: comm
433 call mpi_barrier(comm,ierr)
436 subroutine collective_print_gather ( cbuffer, comm)
437 character,
dimension(:),
intent(in) :: cbuffer
438 integer,
intent(in) :: comm
440 integer rank, np, p, ierr
441 character,
dimension(:),
allocatable :: lbuffer
444 allocate( lbuffer(maxcharlen*maxpe) )
446 call mpi_comm_size(comm, np, ierr)
447 call mpi_comm_rank(comm, rank, ierr)
449 call mpi_gather(cbuffer, maxcharlen, mpi_character, lbuffer, maxcharlen, mpi_character, 0, comm, ierr)
453 write(0,*) lbuffer( (p*maxcharlen+1):((p+1)*maxcharlen) )
461 subroutine usage(name)
462 character(len=64),
intent(in) :: name
464 write(0,
'(A,A,A,/,A)')
"Usage: ",trim(name),
" <options>",&
465 "with the following optional options (default values in parathesis)"
466 write(0,
'(/,A)')
" Sion File Settings:"
467 write(0, *)
" [-f filename] filename of direct access file"
468 write(0, *)
" [-r <chunksize>] sion chunk size in bytes"
469 write(0, *)
" [-R <chunksize>] sion chunk size in MBytes"
470 write(0, *)
" [-q <fsblksize>] size of filesystem blocks in bytes"
471 write(0, *)
" [-Q <fsblksize>] size of filesystem blocks in MBytes"
473 write(0, *)
" [-b <bufsize>] size of blocks written in ONE fwrite in bytes"
474 write(0, *)
" [-B <bufsize>] size of blocks written in ONE fwrite in MBytes"
475 write(0, *)
" [-s <totalsize>] total size of data written by each processor in bytes"
476 write(0, *)
" [-S <totalsize>] total size of data written by each processor in MBytes"
477 write(0, *)
" [-T <type>] type of test (0): w/o collective read "