13 #define _XOPEN_SOURCE 700
27 #include "partest_util.h"
28 #include "partest_split_comm.h"
41 int main(
int argc,
char **argv)
43 int rank, size, rc = 0;
46 sion_int64 commwork_size64 = 1;
54 MPI_Init(&argc, &argv);
55 MPI_Comm_size(MPI_COMM_WORLD, &size);
56 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
57 DPRINTFTS(rank,
"after MPI_Init");
63 init_options(&options);
69 parse_options_std(argc, argv, &options);
74 rc=parse_options_long(argc, argv, &options);
80 MPI_Bcast(&rc, 1, MPI_INT, 0, MPI_COMM_WORLD);
82 MPI_Abort(MPI_COMM_WORLD, 1);
85 distribute_options_mpi(&options);
88 communicators.
all = MPI_COMM_WORLD;
89 MPI_Comm_size(MPI_COMM_WORLD, &communicators.all_size);
90 MPI_Comm_rank(MPI_COMM_WORLD, &communicators.all_rank);
91 split_communicator(&communicators, options.bluegene, options.bluegene_np, options.bluegene_sort, options.numfiles, options.read_task_offset, options.verbose);
94 commwork_size64 = (sion_int64) communicators.work_size;
95 if (options.globalsize > 0) {
96 options.totalsize = (sion_int64) options.globalsize / commwork_size64;
100 options.globalsize = options.totalsize * commwork_size64;
103 if((options.totalsize>options.bufsize) || (options.read_task_offset>0) || (options.do_write==0) ) {
104 options.suppress_checksum=1;
107 if(options.fsblksize<0) options.fsblksize=-1;
110 if(options.chunksize<0) options.chunksize=options.totalsize;
112 if ( (communicators.work_size>0) && (communicators.work_rank==0) ) {
114 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
115 fprintf(stderr,
"SION parallel file I/O benchmark 'partest': start at %s", ctime(&t));
116 fprintf(stderr,
"partest Number of tasks that will use the file tasks: running on %d tasks\n", size);
117 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
119 fprintf(stderr,
"partest parameter: CHECKSUM DISABLED!\n\n");
121 if(options.suppress_checksum) {
122 fprintf(stderr,
"partest parameter: CHECKSUM not possible, DISABLED!\n\n");
125 fprintf(stderr,
"partest parameter: (-f) datafile = %s\n", options.filename);
126 fprintf(stderr,
"partest parameter: (-n) number of files = %d\n", options.numfiles);
127 fprintf(stderr,
"partest parameter: (-F) random factor = %13.4f\n", options.factor);
128 fprintf(stderr,
"partest parameter: (-X) remove files after test = %d\n", options.unlink_files);
129 fprintf(stderr,
"partest parameter: (-b/-B) local buffer size / task = %15lld bytes %10.3f MB\n", options.bufsize, options.bufsize / (1.0 MB));
130 fprintf(stderr,
"partest parameter: (-g/-G) global total data size = %15lld bytes %10.3f GB\n", options.globalsize, options.globalsize / (1024.0 MB));
131 fprintf(stderr,
"partest parameter: (-s/-S) total data size / task = %15lld bytes %10.3f MB\n", options.totalsize, options.totalsize / (1.0 MB));
132 fprintf(stderr,
"partest parameter: (-r/-R) sion chunk size = %15lld bytes %10.3f MB\n", options.chunksize, options.chunksize / (1.0 MB));
133 fprintf(stderr,
"partest parameter: (-Q) fs block size = %15d bytes %10.3f MB\n", options.fsblksize, options.fsblksize / (1.0 MB));
134 if (options.type == 0)
135 fprintf(stderr,
"partest parameter: (-T) test type = %d (sion, collective read)\n", options.type);
136 if (options.type == 1)
137 fprintf(stderr,
"partest parameter: (-T) test type = %d (sion, independant read)\n", options.type);
138 if (options.type == 2)
139 fprintf(stderr,
"partest parameter: (-T) test type = %d (mpi-io)\n", options.type);
140 if (options.type == 3)
141 fprintf(stderr,
"partest parameter: (-T) test type = %d (single files)\n", options.type);
142 fprintf(stderr,
"partest parameter: (-j) serialize_blocknum = %d\n", options.serialize_blocknum);
143 fprintf(stderr,
"partest parameter: (-Z) read task offset = %d\n", options.read_task_offset);
144 fprintf(stderr,
"partest parameter: (-o) start offset bytes = %d\n", options.startoffset);
145 fprintf(stderr,
"partest parameter: (-v) verbose = %d\n", options.verbose);
146 fprintf(stderr,
"partest parameter: (-d) debug = %d\n", options.debug);
147 fprintf(stderr,
"partest parameter: (-D) Debug = %d\n", options.Debug);
148 fprintf(stderr,
"partest parameter: (-M) collective write = %d\n", options.collectivewrite);
149 fprintf(stderr,
"partest parameter: (-m) collective read = %d\n", options.collectiveread);
150 fprintf(stderr,
"partest parameter: (-c) MSA-aware collective I/O = %d\n", options.collmsa);
153 fprintf(stderr,
"partest parameter: (-w) MPI-IO, IBM, Large Block IO = %d\n", options.mpiio_lb);
154 fprintf(stderr,
"partest parameter: (-W) MPI-IO, IBM, IO bufsize = %d KB\n", options.mpiio_bs);
155 fprintf(stderr,
"partest parameter: (-x) MPI-IO, IBM, sparse access = %d\n", options.mpiio_sa);
156 fprintf(stderr,
"partest parameter: (-C) suppress_checksum = %d\n", options.suppress_checksum);
157 fprintf(stderr,
"partest parameter: (-O) do_write = %d\n", options.do_write);
158 fprintf(stderr,
"partest parameter: (-I) do_read = %d\n", options.do_read);
159 fprintf(stderr,
"partest parameter: (-L) use_posix = %d\n", options.use_posix);
160 #if defined(_SION_SIONFWD)
161 fprintf(stderr,
"partest parameter: (-l) use_sionfwd = %d\n", options.use_sionfwd);
163 #ifdef _SION_IME_NATIVE
164 fprintf(stderr,
"partest parameter: (-i) use_ime_native = %d\n", options.use_ime_native);
167 fprintf(stderr,
"partest parameter: (-P) Blue Gene, I/O nodes = %d\n", options.bluegene);
168 fprintf(stderr,
"partest parameter: (-p) Blue Gene: task/IO-nodes = %d\n", options.bluegene_np);
169 fprintf(stderr,
"partest parameter: (-Y) Blue Gene: task sort = %d\n", options.bluegene_sort);
171 fprintf(stderr,
"partest parameter: ( ) commwork_size64 = %lld\n", commwork_size64);
173 fprintf(stderr,
"partest versioninfo: SION_MAIN_VERSION = %d\n", SION_MAIN_VERSION);
174 fprintf(stderr,
"partest versioninfo: SION_SUB_VERSION = %d\n", SION_SUB_VERSION);
175 fprintf(stderr,
"partest versioninfo: SION_VERSION_PATCHLEVEL = %d\n", SION_VERSION_PATCHLEVEL);
176 fprintf(stderr,
"partest versioninfo: SION_FILEFORMAT_VERSION = %d\n", SION_FILEFORMAT_VERSION);
177 fprintf(stderr,
"partest versioninfo: SION_GIT_REVISION = %s\n", GIT_REV);
182 barrier_after_start(MPI_COMM_WORLD);
184 if ( (communicators.work_size>0) && (communicators.work_rank==0) ) {
185 fprintf(stderr,
"partest parameter: ( ) comm(all) = %d of %d\n", communicators.all_rank, communicators.all_size);
186 fprintf(stderr,
"partest parameter: ( ) comm(work) = %d of %d\n", communicators.work_rank, communicators.work_size);
187 fprintf(stderr,
"partest parameter: ( ) comm(local) = %d of %d\n", communicators.local_rank, communicators.local_size);
188 fprintf(stderr,
"------------------------------------------------------------------------------------------\n");
191 barrier_after_start(MPI_COMM_WORLD);
192 DPRINTFTS(rank,
"after pstart");
194 localbuffer = (
char *) malloc(options.bufsize);
196 srand(time(NULL)*communicators.work_rank);
201 memset (localbuffer,
'a'+rank%26, options.bufsize);
202 barrier_after_malloc(MPI_COMM_WORLD);
203 DPRINTFTS(rank,
"after malloc");
206 if(options.factor>0.0) {
207 if((options.collectivewrite) || (options.collectiveread)) {
208 if(options.bufsize<options.totalsize*(1+options.factor)) {
209 fprintf(stderr,
"partest: ERROR deadlock possible if collective read/write and random factor used, and buffer is too small aborting\n");
210 MPI_Abort(MPI_COMM_WORLD,0);
215 options.totalsize += ((sion_int64) (options.factor * (sion_int64) options.totalsize * (sion_int64) rand() / (sion_int64) RAND_MAX));
216 options.chunksize += ((sion_int64) (options.factor * (sion_int64) options.totalsize * (sion_int64) rand() / (sion_int64) RAND_MAX));
217 fprintf(stderr,
"partest parameter: ( ) new totalsize[%4d] = %lld\n", communicators.work_rank, options.totalsize);
222 DPRINTFTS(rank,
"before scall2");
223 if ( (communicators.work_size>0) && (communicators.work_rank==0) ) {
224 fprintf(stderr,
"partest parameter: ( ) new totalsize = %lld\n", options.totalsize);
226 barrier_after_malloc(MPI_COMM_WORLD);
227 if (options.type == 0) {
228 options.collectiveopenforread = 1;
229 test_paropen_multi_mpi(options.filename, localbuffer, &communicators, &options);
232 else if (options.type == 1) {
233 options.collectiveopenforread = 0;
234 test_paropen_multi_mpi(options.filename, localbuffer, &communicators, &options);
236 else if (options.type == 2) {
237 options.collectiveopenforread = 1;
238 test_mpiio_multi_mpi(options.filename, localbuffer, &communicators, &options);
240 else if (options.type == 3) {
241 options.collectiveopenforread = 1;
242 test_single_mpi(options.filename, localbuffer, &communicators, &options);
245 DPRINTFTS(rank,
"before MPI_Finalize");
246 barrier_after_malloc(MPI_COMM_WORLD);
248 if ( (communicators.work_size>0) && (communicators.work_rank==0) ) {
250 fprintf(stderr,
"SION parallel file I/O benchmark 'partest': end at %s\n", ctime(&t));