diff options
-rw-r--r-- | tools/h5diff/h5diff_common.c | 62 | ||||
-rw-r--r-- | tools/h5diff/h5diff_common.h | 3 | ||||
-rw-r--r-- | tools/h5diff/ph5diff_main.c | 13 | ||||
-rw-r--r-- | tools/lib/h5diff.c | 102 | ||||
-rw-r--r-- | tools/lib/h5diff_util.c | 2 | ||||
-rw-r--r-- | tools/lib/ph5diff.h | 6 |
6 files changed, 101 insertions, 87 deletions
diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c index 48bcedb..5387f2a 100644 --- a/tools/h5diff/h5diff_common.c +++ b/tools/h5diff/h5diff_common.c @@ -17,9 +17,6 @@ #include "h5diff.h" #include "h5diff_common.h" -extern int g_Parallel; -extern int g_nTasks; - /*------------------------------------------------------------------------- * Function: parse_input * @@ -185,36 +182,35 @@ void parse_input(int argc, const char* argv[], const char** fname1, const char** void print_results(hsize_t nfound, diff_opt_t* options) { -/*------------------------------------------------------------------------- - * print how many differences were found - *------------------------------------------------------------------------- - */ - if (!options->m_quiet) - { - printf("----------------------------------------------------\n"); - printf("Summary\n"); - printf("----------------------------------------------------\n"); - - if (options->cmn_objs==0 && !options->err_stat) - { - printf("No common objects found. Files are not comparable.\n"); - if (!options->m_verbose) - printf("Use -v for a list of objects.\n"); - } - else - { - /* no errors found */ - if (!options->err_stat) - { - /* objects were not compared */ - if (options->not_cmp==1) - printf("Some objects are not comparable\n"); - else - /* objects were compared, print the number of differences */ - print_found(nfound); - } - } - } + /*------------------------------------------------------------------------- + * print how many differences were found + *------------------------------------------------------------------------- + */ + if (!options->m_quiet) + { + printf("----------------------------------------------------\n"); + printf("Summary\n"); + printf("----------------------------------------------------\n"); + if (options->cmn_objs==0 && !options->err_stat) + { + printf("No common objects found. Files are not comparable.\n"); + if (!options->m_verbose) + printf("Use -v for a list of objects.\n"); + } + else + { + /* no errors found */ + if (!options->err_stat) + { + /* objects were not compared */ + if (options->not_cmp==1) + printf("Some objects are not comparable\n"); + else + /* objects were compared, print the number of differences */ + print_found(nfound); + } + } + } } /*------------------------------------------------------------------------- diff --git a/tools/h5diff/h5diff_common.h b/tools/h5diff/h5diff_common.h index 3a6f01d..728b022 100644 --- a/tools/h5diff/h5diff_common.h +++ b/tools/h5diff/h5diff_common.h @@ -1,3 +1,6 @@ +extern unsigned char g_Parallel; +extern int g_nTasks; + void usage(void); int check_n_input( const char* ); int check_f_input( const char* ); diff --git a/tools/h5diff/ph5diff_main.c b/tools/h5diff/ph5diff_main.c index 082a6bd..3b6267d 100644 --- a/tools/h5diff/ph5diff_main.c +++ b/tools/h5diff/ph5diff_main.c @@ -131,6 +131,7 @@ ph5diff_worker(int nID) char filenames[2][1024]; char out_data[PRINT_DATA_MAX_SIZE] = {0}; hsize_t nfound=0; + struct diffs_found diffs; int i; MPI_Status Status; @@ -169,6 +170,8 @@ ph5diff_worker(int nID) MPI_Recv(&args, sizeof(struct diff_args), MPI_BYTE, 0, MPI_TAG_ARGS, MPI_COMM_WORLD, &Status); /*Do the diff */ nfound = diff(file1_id, args.name, file2_id, args.name, &(args.options), args.type); + diffs.nfound = nfound; + diffs.not_cmp = args.options.not_cmp; /*If print buffer has something in it, request print token.*/ if(outBuffOffset>0) @@ -213,16 +216,10 @@ ph5diff_worker(int nID) memset(outBuff, 0, OUTBUFF_SIZE); outBuffOffset = 0; - /* Since the data type of diff value is hsize_t which can - * be arbitary large such that there is no MPI type that - * matches it, the value is passed between processes as - * an array of bytes in order to be portable. But this - * may not work in non-homogeneous MPI environments. - */ - MPI_Send(&nfound, sizeof(nfound), MPI_BYTE, 0, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD); + MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD); } else - MPI_Send(&nfound, sizeof(nfound), MPI_BYTE, 0, MPI_TAG_DONE, MPI_COMM_WORLD); + MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_DONE, MPI_COMM_WORLD); } else if(Status.MPI_TAG == MPI_TAG_END) { diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c index c7828e8..16e5af7 100644 --- a/tools/lib/h5diff.c +++ b/tools/lib/h5diff.c @@ -52,7 +52,7 @@ void phdiff_dismiss_workers(void) { int i; for(i=1; i<g_nTasks; i++) - MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD); + MPI_Send(NULL, 0, MPI_BYTE, i, MPI_TAG_END, MPI_COMM_WORLD); } @@ -72,31 +72,31 @@ void phdiff_dismiss_workers(void) */ void print_manager_output(void) { - /* If there was something we buffered, let's print it now */ - if( (outBuffOffset>0) && g_Parallel) - { - printf("%s", outBuff); + /* If there was something we buffered, let's print it now */ + if( (outBuffOffset>0) && g_Parallel) + { + printf("%s", outBuff); - if(overflow_file) - { - int tmp; + if(overflow_file) + { + int tmp; - rewind(overflow_file); - while((tmp = getc(overflow_file)) >= 0) - putchar(tmp); + rewind(overflow_file); + while((tmp = getc(overflow_file)) >= 0) + putchar(tmp); - fclose(overflow_file); - overflow_file = NULL; - } + fclose(overflow_file); + overflow_file = NULL; + } - fflush(stdout); - memset(outBuff, 0, OUTBUFF_SIZE); - outBuffOffset = 0; - } - else if( (outBuffOffset>0) && !g_Parallel) - { - printf("h5diff error: outBuffOffset>0, but we're not in parallel!\n"); - } + fflush(stdout); + memset(outBuff, 0, OUTBUFF_SIZE); + outBuffOffset = 0; + } + else if( (outBuffOffset>0) && !g_Parallel) + { + fprintf(stderr, "h5diff error: outBuffOffset>0, but we're not in parallel!\n"); + } } /*------------------------------------------------------------------------- @@ -119,17 +119,17 @@ static void print_incoming_data(void) char data[PRINT_DATA_MAX_SIZE+1]; int incomingMessage; MPI_Status Status; - + do { - MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &incomingMessage, &Status); - if(incomingMessage) - { - memset(data, 0, PRINT_DATA_MAX_SIZE+1); - MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status); - - printf("%s", data); - } + MPI_Iprobe(MPI_ANY_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &incomingMessage, &Status); + if(incomingMessage) + { + memset(data, 0, PRINT_DATA_MAX_SIZE+1); + MPI_Recv(data, PRINT_DATA_MAX_SIZE, MPI_CHAR, Status.MPI_SOURCE, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD, &Status); + + printf("%s", data); + } } while(incomingMessage); } #endif @@ -163,6 +163,7 @@ h5diff (const char *fname1, hid_t file1_id=(-1), file2_id=(-1); char filenames[2][1024]; hsize_t nfound = 0; + int not_cmp = 0; memset(filenames, 0, 1024*2); @@ -308,7 +309,7 @@ h5diff (const char *fname1, if( (strlen(fname1) > 1024) || (strlen(fname2) > 1024)) { - printf("The parallel diff only supports path names up to 1024 characters\n"); + fprintf(stderr, "The parallel diff only supports path names up to 1024 characters\n"); MPI_Abort(MPI_COMM_WORLD, 0); } @@ -323,6 +324,7 @@ h5diff (const char *fname1, #endif nfound = diff_match (file1_id, nobjects1, info1, file2_id, nobjects2, info2, options); + } @@ -475,7 +477,7 @@ diff_match (hid_t file1_id, char* workerTasks = malloc((g_nTasks-1) * sizeof(char)); int n; int busyTasks=0; - hsize_t nFoundbyWorker; + struct diffs_found nFoundbyWorker; struct diff_args args; int havePrintToken = 1; MPI_Status Status; @@ -532,7 +534,8 @@ diff_match (hid_t file1_id, { workerTasks[Status.MPI_SOURCE-1] = 1; MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; } @@ -547,7 +550,8 @@ diff_match (hid_t file1_id, { workerTasks[Status.MPI_SOURCE-1] = 1; MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; havePrintToken = 1; } @@ -598,9 +602,10 @@ diff_match (hid_t file1_id, * if we don't have the token, some task is currently printing so we'll wait for that task to return it. */ if(!havePrintToken) { - MPI_Recv(&nFoundbyWorker, sizeof(hsize_t), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); + MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); havePrintToken = 1; - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; /* send this task the work unit. */ MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } @@ -614,7 +619,8 @@ diff_match (hid_t file1_id, if(Status.MPI_TAG == MPI_TAG_DONE) { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } else if(Status.MPI_TAG == MPI_TAG_TOK_REQUEST) @@ -623,7 +629,8 @@ diff_match (hid_t file1_id, MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; MPI_Send(&args, sizeof(struct diff_args), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_ARGS, MPI_COMM_WORLD); } else @@ -647,14 +654,16 @@ diff_match (hid_t file1_id, MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); if(Status.MPI_TAG == MPI_TAG_DONE) { - MPI_Recv(&nFoundbyWorker, sizeof(hsize_t), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; } else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_DONE, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; havePrintToken = 1; } @@ -665,14 +674,16 @@ diff_match (hid_t file1_id, { MPI_Send(NULL, 0, MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; } else /* someone else must have it...wait for them to return it, then give it to the task that just asked for it. */ { int source = Status.MPI_SOURCE; MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, MPI_ANY_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; MPI_Send(NULL, 0, MPI_BYTE, source, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD); } @@ -680,7 +691,8 @@ diff_match (hid_t file1_id, else if(Status.MPI_TAG == MPI_TAG_TOK_RETURN) { MPI_Recv(&nFoundbyWorker, sizeof(nFoundbyWorker), MPI_BYTE, Status.MPI_SOURCE, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD, &Status); - nfound += nFoundbyWorker; + nfound += nFoundbyWorker.nfound; + options->not_cmp = options->not_cmp | nFoundbyWorker.not_cmp; busyTasks--; havePrintToken = 1; } diff --git a/tools/lib/h5diff_util.c b/tools/lib/h5diff_util.c index d29434c..3a9e7e4 100644 --- a/tools/lib/h5diff_util.c +++ b/tools/lib/h5diff_util.c @@ -64,7 +64,7 @@ void parallel_print(const char* format, ...) overflow_file = HDtmpfile(); if(overflow_file == NULL) - printf("Warning: Could not create overflow file. Output may be truncated.\n"); + fprintf(stderr, "Warning: Could not create overflow file. Output may be truncated.\n"); else bytes_written = HDvfprintf(overflow_file, format, ap); } diff --git a/tools/lib/ph5diff.h b/tools/lib/ph5diff.h index b8b38b2..864ae49 100644 --- a/tools/lib/ph5diff.h +++ b/tools/lib/ph5diff.h @@ -44,6 +44,12 @@ struct diff_args diff_opt_t options; }; +struct diffs_found +{ + hsize_t nfound; + int not_cmp; +}; + #ifdef H5_HAVE_PARALLEL #include <mpi.h> #endif |