diff options
Diffstat (limited to 'tools/h5diff')
-rw-r--r-- | tools/h5diff/h5diff_common.c | 8 | ||||
-rw-r--r-- | tools/h5diff/h5diff_common.h | 2 | ||||
-rw-r--r-- | tools/h5diff/h5diff_main.c | 15 | ||||
-rw-r--r-- | tools/h5diff/ph5diff_main.c | 226 |
4 files changed, 132 insertions, 119 deletions
diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c index 254fb1a..bf0b63a 100644 --- a/tools/h5diff/h5diff_common.c +++ b/tools/h5diff/h5diff_common.c @@ -180,14 +180,14 @@ void parse_input(int argc, } /*------------------------------------------------------------------------- - * Function: print_results + * Function: print_info * * Purpose: print several information messages * *------------------------------------------------------------------------- */ -void print_results(diff_opt_t* options) +void print_info(diff_opt_t* options) { if (options->m_quiet || options->err_stat) return; @@ -299,8 +299,8 @@ void usage(void) printf("[obj2] Name of an HDF5 object, in absolute path\n"); printf("[OPTIONS] are:\n"); printf("[-h] Print out this information\n"); - printf("[-r] Report mode. Print the differences\n"); - printf("[-v] Verbose mode. Print the differences, list of objects, warnings\n"); + printf("[-r] Report mode. Print differences\n"); + printf("[-v] Verbose mode. Print differences, list of objects, warnings\n"); printf("[-q] Quiet mode. Do not do output\n"); printf("[-n count] Print difference up to count number\n"); printf("[-d delta] Print difference when it is greater than limit delta\n"); diff --git a/tools/h5diff/h5diff_common.h b/tools/h5diff/h5diff_common.h index 3c0dcd0..f540a20 100644 --- a/tools/h5diff/h5diff_common.h +++ b/tools/h5diff/h5diff_common.h @@ -21,5 +21,5 @@ int check_n_input( const char* ); int check_f_input( const char* ); void parse_input(int argc, const char* argv[], const char** fname1, const char** fname2, const char** objname1, const char** objname2, diff_opt_t* options); void h5diff_exit(int status); -void print_results(diff_opt_t* options); +void print_info(diff_opt_t* options); diff --git a/tools/h5diff/h5diff_main.c b/tools/h5diff/h5diff_main.c index 0dfd192..13059f2 100644 --- a/tools/h5diff/h5diff_main.c +++ b/tools/h5diff/h5diff_main.c @@ -46,6 +46,19 @@ * h5diff and ph5diff split into two files, one that is used * to build a serial h5diff and one used to build a parallel h5diff * Common functions have been moved to h5diff_common.c + * + * October 2005 + * Introduced a new field 'not_cmp' to 'diff_opt_t' that detects + * if some objects are not comparable and prints the message + * "Some objects are not comparable" + * + * February 2007 + * Added comparison for dataset regions. + * Added support for reading and comparing by hyperslabs for large files. + * Inclusion of a relative error formula to compare floating + * point numbers in order to deal with floating point uncertainty. + * Printing of dataset dimensions along with dataset name + * *------------------------------------------------------------------------- */ @@ -64,7 +77,7 @@ int main(int argc, const char *argv[]) nfound = h5diff(fname1,fname2,objname1,objname2,&options); - print_results(&options); + print_info(&options); /*------------------------------------------------------------------------- * exit code diff --git a/tools/h5diff/ph5diff_main.c b/tools/h5diff/ph5diff_main.c index faf7c35..989a74b 100644 --- a/tools/h5diff/ph5diff_main.c +++ b/tools/h5diff/ph5diff_main.c @@ -43,7 +43,7 @@ static void ph5diff_worker(int ); * Quiet mode: do not print output * * November 2004: Leon Arber (larber@uiuc.edu) - * Additions that allow h5diff to be run in parallel + * Additions that allow h5diff to be run in parallel * * This function drives the diff process and will do a serial or parallel diff depending * on the value of the global variable g_Parallel (default is 0), set to 1 when the program @@ -54,7 +54,7 @@ static void ph5diff_worker(int ); int main(int argc, const char *argv[]) { - int nID = 0; + int nID = 0; const char *fname1 = NULL; const char *fname2 = NULL; const char *objname1 = NULL; @@ -72,40 +72,40 @@ int main(int argc, const char *argv[]) if(g_nTasks == 1) { - printf("Only 1 task available...doing serial diff\n"); + printf("Only 1 task available...doing serial diff\n"); - g_Parallel = 0; + g_Parallel = 0; - parse_input(argc, argv, &fname1, &fname2, &objname1, &objname2, &options); + parse_input(argc, argv, &fname1, &fname2, &objname1, &objname2, &options); - nfound = h5diff(fname1,fname2,objname1,objname2,&options); + nfound = h5diff(fname1,fname2,objname1,objname2,&options); - print_results(&options); + print_info(&options); - MPI_Finalize(); + MPI_Finalize(); - return 0; + return 0; } /* Have the manager process the command-line */ if(nID == 0) { - parse_input(argc, argv, &fname1, &fname2, &objname1, &objname2, &options); + parse_input(argc, argv, &fname1, &fname2, &objname1, &objname2, &options); - nfound = h5diff(fname1,fname2,objname1,objname2,&options); + nfound = h5diff(fname1,fname2,objname1,objname2,&options); - MPI_Barrier(MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); - print_results(&options); - print_manager_output(); + print_info(&options); + print_manager_output(); - MPI_Finalize(); + MPI_Finalize(); - return 0; + return 0; } /* All other tasks become workers and wait for assignments. */ else - ph5diff_worker(nID); + ph5diff_worker(nID); } /*------------------------------------------------------------------------- @@ -129,10 +129,10 @@ ph5diff_worker(int nID) { struct diff_args args; hid_t file1_id, file2_id; - char filenames[2][1024]; - char out_data[PRINT_DATA_MAX_SIZE] = {0}; + char filenames[2][1024]; + char out_data[PRINT_DATA_MAX_SIZE] = {0}; hsize_t nfound=0; - struct diffs_found diffs; + struct diffs_found diffs; int i; MPI_Status Status; @@ -142,99 +142,99 @@ ph5diff_worker(int nID) MPI_Recv(filenames, 1024*2, MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); if(Status.MPI_TAG == MPI_TAG_PARALLEL) { - /* disable error reporting */ - H5E_BEGIN_TRY - { - /* Open the files */ - if ((file1_id = H5Fopen (filenames[0], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) - { - printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[0]); - MPI_Abort(MPI_COMM_WORLD, 0); - } - if ((file2_id = H5Fopen (filenames[1], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) - { - printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[1]); - MPI_Abort(MPI_COMM_WORLD, 0); - } - /* enable error reporting */ - } - H5E_END_TRY; - - - while(1) - { - MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); - - if(Status.MPI_TAG == MPI_TAG_ARGS) - { - /*Recv parameters for diff from manager task */ - 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) - { - MPI_Send(NULL, 0, MPI_BYTE, 0, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD); - /*Wait for print token. */ - MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD, &Status); - - /*When get token, send all of our output to the manager task and then return the token */ - for(i=0; i<outBuffOffset; i+=PRINT_DATA_MAX_SIZE) - MPI_Send(outBuff+i, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD); - - - /* An overflow file exists, so we send it's output to the manager too and then delete it */ - if(overflow_file) - { - int tmp; - memset(out_data, 0, PRINT_DATA_MAX_SIZE); - i=0; - - rewind(overflow_file); - while((tmp = getc(overflow_file)) >= 0) - { - *(out_data + i++) = (char)tmp; - if(i==PRINT_DATA_MAX_SIZE) - { - MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD); - i=0; - memset(out_data, 0, PRINT_DATA_MAX_SIZE); - } - } - - if(i>0) - MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD); - - fclose(overflow_file); - overflow_file = NULL; - } - - fflush(stdout); - memset(outBuff, 0, OUTBUFF_SIZE); - outBuffOffset = 0; - - MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD); - } - else - MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_DONE, MPI_COMM_WORLD); - } - else if(Status.MPI_TAG == MPI_TAG_END) - { - MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_END, MPI_COMM_WORLD, &Status); - /* printf("exiting..., task: %d\n", nID); - fflush(stdout);*/ - break; - } - else - { - printf("ph5diff_worker: ERROR: invalid tag (%d) received\n", Status.MPI_TAG); - MPI_Abort(MPI_COMM_WORLD, 0); - } - - } + /* disable error reporting */ + H5E_BEGIN_TRY + { + /* Open the files */ + if ((file1_id = H5Fopen (filenames[0], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) + { + printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[0]); + MPI_Abort(MPI_COMM_WORLD, 0); + } + if ((file2_id = H5Fopen (filenames[1], H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) + { + printf ("h5diff Task [%d]: <%s>: unable to open file\n", nID, filenames[1]); + MPI_Abort(MPI_COMM_WORLD, 0); + } + /* enable error reporting */ + } + H5E_END_TRY; + + + while(1) + { + MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status); + + if(Status.MPI_TAG == MPI_TAG_ARGS) + { + /*Recv parameters for diff from manager task */ + 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) + { + MPI_Send(NULL, 0, MPI_BYTE, 0, MPI_TAG_TOK_REQUEST, MPI_COMM_WORLD); + /*Wait for print token. */ + MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_PRINT_TOK, MPI_COMM_WORLD, &Status); + + /*When get token, send all of our output to the manager task and then return the token */ + for(i=0; i<outBuffOffset; i+=PRINT_DATA_MAX_SIZE) + MPI_Send(outBuff+i, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD); + + + /* An overflow file exists, so we send it's output to the manager too and then delete it */ + if(overflow_file) + { + int tmp; + memset(out_data, 0, PRINT_DATA_MAX_SIZE); + i=0; + + rewind(overflow_file); + while((tmp = getc(overflow_file)) >= 0) + { + *(out_data + i++) = (char)tmp; + if(i==PRINT_DATA_MAX_SIZE) + { + MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD); + i=0; + memset(out_data, 0, PRINT_DATA_MAX_SIZE); + } + } + + if(i>0) + MPI_Send(out_data, PRINT_DATA_MAX_SIZE, MPI_BYTE, 0, MPI_TAG_PRINT_DATA, MPI_COMM_WORLD); + + fclose(overflow_file); + overflow_file = NULL; + } + + fflush(stdout); + memset(outBuff, 0, OUTBUFF_SIZE); + outBuffOffset = 0; + + MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_TOK_RETURN, MPI_COMM_WORLD); + } + else + MPI_Send(&diffs, sizeof(diffs), MPI_BYTE, 0, MPI_TAG_DONE, MPI_COMM_WORLD); + } + else if(Status.MPI_TAG == MPI_TAG_END) + { + MPI_Recv(NULL, 0, MPI_BYTE, 0, MPI_TAG_END, MPI_COMM_WORLD, &Status); + /* printf("exiting..., task: %d\n", nID); + fflush(stdout);*/ + break; + } + else + { + printf("ph5diff_worker: ERROR: invalid tag (%d) received\n", Status.MPI_TAG); + MPI_Abort(MPI_COMM_WORLD, 0); + } + + } } MPI_Barrier(MPI_COMM_WORLD); |