24 #include "partest_util.h" 27 test_single_mpi(
char *filename,
36 double starttime, write_starttime, read_starttime, unlinktime, gunlinktime;
37 double timings[TIMINGS_MAX_NUM],ftimings[TIMINGS_MAX_NUM],gtimings[TIMINGS_MAX_NUM];
38 sion_int64 stats[STATS_MAX_NUM], fstats[STATS_MAX_NUM], gstats[STATS_MAX_NUM];
41 sion_int64 bsumwrote, bsumread;
42 size_t bwrite, bwrote, btoread, bread, chunkcnt;
43 double checksum_fp, checksum_read_fp;
44 int ser_count,ser_step,ser_done;
49 if (communicators->work_size == -1) {
54 if(options->use_posix) {
60 for(i=0;i<TIMINGS_MAX_NUM;i++) timings[i]=ftimings[i]=gtimings[i]=0.0;
61 for(i=0;i<STATS_MAX_NUM;i++) stats[i]=fstats[i]=gstats[i]=0;
63 do_debug=(((options->debug && communicators->all_rank == 0)) || ((options->Debug && (communicators->all_rank+1) == communicators->all_size)));
65 sprintf(fname,
"%s.%06d", filename, communicators->work_rank);
67 if(options->do_write) {
72 barrier_after_start(communicators->
local);
74 write_starttime = starttime = MPI_Wtime();
79 fprintf(stderr,
"cannot open %s for writing, aborting ...\n", fname);
80 MPI_Abort(communicators->
all, 1);
82 stats[STATS_WR_NUM_FILES]=communicators->work_size;
83 timings[TIMINGS_WR_CREATE] = MPI_Wtime()-starttime;
85 starttime = MPI_Wtime();
86 barrier_after_open(communicators->
work);
87 timings[TIMINGS_WR_CREATE_BARR_OPEN] = MPI_Wtime()-starttime;
89 starttime = MPI_Wtime();
91 timings[TIMINGS_WR_CREATE_CLOSE] = MPI_Wtime()-starttime;
93 starttime = MPI_Wtime();
94 barrier_after_open(communicators->
work);
95 timings[TIMINGS_WR_CREATE_BARR_CLOSE] = MPI_Wtime()-starttime;
98 starttime = MPI_Wtime();
102 fprintf(stderr,
"cannot open %s for writing, aborting ...\n", fname);
103 MPI_Abort(communicators->
all, 1);
105 timings[TIMINGS_WR_OPEN] = MPI_Wtime()-starttime;
107 starttime = MPI_Wtime();
108 barrier_after_open(communicators->
work);
109 timings[TIMINGS_WR_OPEN_BARR_GLOBAL] = MPI_Wtime()-starttime;
111 starttime = MPI_Wtime();
112 if(options->serialize_blocknum>0) ser_step=options->serialize_blocknum;
113 else ser_step=communicators->local_size;
115 timings[TIMINGS_WR_WRITE_SYNC] += MPI_Wtime()-starttime;
118 for(ser_count=0;ser_count<communicators->local_size;ser_count+=ser_step) {
120 if ((!ser_done) && communicators->local_rank<(ser_count+ser_step)) {
123 starttime = MPI_Wtime();
124 left = options->totalsize;
130 bwrite = options->bufsize;
135 fprintf(stderr,
"timings[%03d] write %lld bytes\n", communicators->all_rank, (sion_int64) bwrite);
140 left -= (sion_int64) bwrote;
141 bsumwrote += (sion_int64) bwrote;
145 if(!options->suppress_checksum) {
147 for (i = 0; i < bwrote; i++)
148 checksum_fp += (
double) localbuffer[i];
153 fprintf(stderr,
"timings[%03d] wrote (%lld bytes) %lld bytes (%10.4f MB) (%lld left)\n",
154 communicators->all_rank, (sion_int64) bwrote, bsumwrote, bsumwrote / 1024.0 / 1024.0, (sion_int64) left);
159 timings[TIMINGS_WR_WRITE] += MPI_Wtime()-starttime;
160 stats[STATS_BYTES_WR_WROTE]+=bsumwrote;
161 stats[STATS_BYTES_WR_NUM_CHUNKS]+=chunkcnt;
165 starttime = MPI_Wtime();
166 barrier_after_write(communicators->
local);
167 timings[TIMINGS_WR_WRITE_BARR_FILE] += MPI_Wtime()-starttime;
171 starttime = MPI_Wtime();
172 barrier_after_write(communicators->
work);
173 timings[TIMINGS_WR_WRITE_BARR_GLOBAL] = MPI_Wtime()-starttime;
175 starttime = MPI_Wtime();
177 timings[TIMINGS_WR_CLOSE] = MPI_Wtime()-starttime;
179 starttime = MPI_Wtime();
180 barrier_after_close(communicators->
work);
181 timings[TIMINGS_WR_CLOSE_BARR_GLOBAL] = MPI_Wtime()-starttime;
183 timings[TIMINGS_WR_TOTAL] = MPI_Wtime()-write_starttime;
185 starttime = MPI_Wtime();
188 if (options->verbose) {
189 write_timings(
"TASK",TIMINGS_METHOD_WRITE,timings,stats,communicators,options,1);
193 write_timings(
"TASK",TIMINGS_METHOD_WRITE,timings,stats,communicators,options,0);
196 MPI_Reduce(timings, gtimings, TIMINGS_MAX_NUM, MPI_DOUBLE, MPI_MAX, 0, communicators->
work);
197 MPI_Reduce(stats, gstats, STATS_MAX_NUM, SION_MPI_INT64, MPI_SUM, 0, communicators->
work);
199 if (communicators->work_rank == 0) {
200 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
201 write_timings(
"TOTAL",TIMINGS_METHOD_WRITE,gtimings,gstats,communicators,options,0);
202 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
208 barrier_after_close(communicators->
work);
210 if(options->do_read) {
213 sprintf(fname,
"%s.%06d", filename, communicators->workread_rank);
218 barrier_after_start(communicators->
local);
220 read_starttime = starttime = MPI_Wtime();
224 fprintf(stderr,
"cannot open %s for writing, aborting ...\n", fname);
225 MPI_Abort(communicators->
all, 1);
227 stats[STATS_RD_NUM_FILES]=communicators->work_size;
228 timings[TIMINGS_RD_OPEN] = MPI_Wtime()-starttime;
230 starttime = MPI_Wtime();
231 barrier_after_open(communicators->
work);
232 timings[TIMINGS_RD_OPEN_BARR_GLOBAL] = MPI_Wtime()-starttime;
235 starttime = MPI_Wtime();
236 if(options->serialize_blocknum>0) ser_step=options->serialize_blocknum;
237 else ser_step=communicators->local_size;
239 timings[TIMINGS_RD_READ_SYNC] += MPI_Wtime()-starttime;
241 for(ser_count=0;ser_count<communicators->local_size;ser_count+=ser_step) {
243 if ((!ser_done) && communicators->local_rank<(ser_count+ser_step)) {
246 starttime = MPI_Wtime();
247 left = options->totalsize;
252 btoread = options->bufsize;
263 if(!options->suppress_checksum) {
264 checksum_read_fp=0.0;
265 for (i = 0; i < bread; i++)
266 checksum_read_fp += (
double) localbuffer[i];
271 fprintf(stderr,
"timings[%03d] read (%lld bytes) %lld bytes (%10.4f MB) (%lld left)\n", communicators->all_rank, (sion_int64) bread, bsumread,
272 bsumread / 1024.0 / 1024.0, (sion_int64) left);
277 timings[TIMINGS_RD_READ] += MPI_Wtime()-starttime;
279 stats[STATS_BYTES_RD_READ]+=bsumread;
280 stats[STATS_BYTES_RD_NUM_CHUNKS]+=chunkcnt;
282 starttime = MPI_Wtime();
283 barrier_after_read(communicators->
local);
284 timings[TIMINGS_RD_READ_BARR_FILE] += MPI_Wtime()-starttime;
290 starttime = MPI_Wtime();
291 barrier_after_read(communicators->
workread);
292 timings[TIMINGS_RD_READ_BARR_GLOBAL] = MPI_Wtime()-starttime;
294 starttime = MPI_Wtime();
296 timings[TIMINGS_RD_CLOSE] = MPI_Wtime()-starttime;
298 starttime = MPI_Wtime();
299 barrier_after_close(communicators->
workread);
300 timings[TIMINGS_RD_CLOSE_BARR_GLOBAL] = MPI_Wtime()-starttime;
301 timings[TIMINGS_RD_TOTAL] = MPI_Wtime()-read_starttime;
303 starttime = MPI_Wtime();
305 if (timings[TIMINGS_RD_TOTAL] == 0) timings[TIMINGS_RD_TOTAL] = -1;
307 if (options->verbose) {
308 write_timings(
"TASK",TIMINGS_METHOD_READ,timings,stats,communicators,options,1);
312 write_timings(
"TASK",TIMINGS_METHOD_READ,timings,stats,communicators,options,0);
315 timings[TIMINGS_MSGS] += MPI_Wtime()-starttime;
316 if (options->numfiles > 1) {
318 MPI_Reduce(timings, ftimings, TIMINGS_MAX_NUM, MPI_DOUBLE, MPI_MAX, 0, communicators->
local);
319 MPI_Reduce(stats, fstats, STATS_MAX_NUM, SION_MPI_INT64, MPI_SUM, 0, communicators->
local);
321 if (communicators->local_rank == 0) {
322 write_timings(
"FILE",TIMINGS_METHOD_READ,ftimings,fstats,communicators,options,0);
327 MPI_Reduce(timings, gtimings, TIMINGS_MAX_NUM, MPI_DOUBLE, MPI_MAX, 0, communicators->
workread);
328 MPI_Reduce(stats, gstats, STATS_MAX_NUM, SION_MPI_INT64, MPI_SUM, 0, communicators->
workread);
330 DPRINTFTS(communicators->all_rank,
"after red.");
331 if (communicators->workread_rank == 0) {
332 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
333 write_timings(
"TOTAL",TIMINGS_METHOD_READ,gtimings,gstats,communicators,options,0);
334 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
338 if(!options->suppress_checksum) {
339 if (fabs(checksum_fp - checksum_read_fp) > 1e-5) {
340 fprintf(stderr,
"timings[%03d] ERROR in double checksum %14.10f==%14.10f, diff=%14.10f\n", communicators->all_rank,
341 checksum_fp, checksum_read_fp, checksum_fp - checksum_read_fp);
348 if(options->unlink_files) {
349 starttime = MPI_Wtime();
350 barrier_before_unlink(communicators->
work);
352 barrier_after_unlink(communicators->
work);
353 unlinktime = MPI_Wtime() - starttime;
354 MPI_Reduce(&unlinktime, &gunlinktime, 1, MPI_DOUBLE, MPI_MAX, 0, communicators->
work);
355 if (communicators->work_rank == 0) {
356 fprintf(stderr,
"partest result: ultime=%10.6fs unlink %s\n", gunlinktime, fname);
sion_int64 _sion_file_write(const void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Write data to file.
_sion_fileptr * _sion_file_open(const char *fname, unsigned int flags, unsigned int addflags)
Create and open a new file for writing.
#define SION_FILE_FLAG_WRITE
sion_int64 _sion_file_read(void *data, sion_int64 bytes, _sion_fileptr *sion_fileptr)
Read data from file.
#define SION_FILE_FLAG_READ
#define SION_FILE_FLAG_POSIX
#define SION_FILE_FLAG_ANSI
#define SION_FILE_FLAG_CREATE
int _sion_file_close(_sion_fileptr *sion_fileptr)
Close file and destroys fileptr structure.