1*59599516SKenneth E. Jansen /* 2*59599516SKenneth E. Jansen * 3*59599516SKenneth E. Jansen * This is the SyncIO library that uses MPI-IO collective functions to 4*59599516SKenneth E. Jansen * implement a flexible I/O checkpoint solution for a large number of 5*59599516SKenneth E. Jansen * processors. 6*59599516SKenneth E. Jansen * 7*59599516SKenneth E. Jansen * Previous developer: Ning Liu (liun2@cs.rpi.edu) 8*59599516SKenneth E. Jansen * Jing Fu (fuj@cs.rpi.edu) 9*59599516SKenneth E. Jansen * Current developers: Michel Rasquin (Michel.Rasquin@colorado.edu), 10*59599516SKenneth E. Jansen * Ben Matthews (benjamin.a.matthews@colorado.edu) 11*59599516SKenneth E. Jansen * 12*59599516SKenneth E. Jansen */ 13*59599516SKenneth E. Jansen 14*59599516SKenneth E. Jansen #include <map> 15*59599516SKenneth E. Jansen #include <vector> 16*59599516SKenneth E. Jansen #include <string> 17*59599516SKenneth E. Jansen #include <string.h> 18*59599516SKenneth E. Jansen #include <ctype.h> 19*59599516SKenneth E. Jansen #include <stdlib.h> 20*59599516SKenneth E. Jansen #include <stdio.h> 21*59599516SKenneth E. Jansen #include <math.h> 22*59599516SKenneth E. Jansen #include "phastaIO.h" 23*59599516SKenneth E. Jansen #include "mpi.h" 24*59599516SKenneth E. Jansen #include "phiotmrc.h" 25*59599516SKenneth E. Jansen 26*59599516SKenneth E. Jansen #define VERSION_INFO_HEADER_SIZE 8192 27*59599516SKenneth E. Jansen #define DB_HEADER_SIZE 1024 28*59599516SKenneth E. Jansen #define ONE_MEGABYTE 1048576 29*59599516SKenneth E. Jansen #define TWO_MEGABYTE 2097152 30*59599516SKenneth E. Jansen #define ENDIAN_TEST_NUMBER 12180 // Troy's Zip Code!! 31*59599516SKenneth E. Jansen #define MAX_PHASTA_FILES 64 32*59599516SKenneth E. Jansen #define MAX_PHASTA_FILE_NAME_LENGTH 1024 33*59599516SKenneth E. Jansen #define MAX_FIELDS_NUMBER ((VERSION_INFO_HEADER_SIZE/MAX_FIELDS_NAME_LENGTH)-4) // The meta data include - MPI_IO_Tag, nFields, nFields*names of the fields, nppf 34*59599516SKenneth E. Jansen // -3 for MPI_IO_Tag, nFields and nppf, -4 for extra security (former nFiles) 35*59599516SKenneth E. Jansen #define MAX_FIELDS_NAME_LENGTH 128 36*59599516SKenneth E. Jansen #define DefaultMHSize (4*ONE_MEGABYTE) 37*59599516SKenneth E. Jansen //#define DefaultMHSize (8350) //For test 38*59599516SKenneth E. Jansen #define LATEST_WRITE_VERSION 1 39*59599516SKenneth E. Jansen #define inv1024sq 953.674316406e-9 // = 1/1024/1024 40*59599516SKenneth E. Jansen int MasterHeaderSize = -1; 41*59599516SKenneth E. Jansen 42*59599516SKenneth E. Jansen bool PRINT_PERF = false; // default print no perf results 43*59599516SKenneth E. Jansen int irank = -1; // global rank, should never be manually manipulated 44*59599516SKenneth E. Jansen int mysize = -1; 45*59599516SKenneth E. Jansen 46*59599516SKenneth E. Jansen // Static variables are bad but used here to store the subcommunicator and associated variables 47*59599516SKenneth E. Jansen // Prevent MPI_Comm_split to be called more than once, especially on BGQ with the V1R2M1 driver (leak detected in MPI_Comm_split - IBM working on it) 48*59599516SKenneth E. Jansen static int s_assign_local_comm = 0; 49*59599516SKenneth E. Jansen static MPI_Comm s_local_comm; 50*59599516SKenneth E. Jansen static int s_local_size = -1; 51*59599516SKenneth E. Jansen static int s_local_rank = -1; 52*59599516SKenneth E. Jansen 53*59599516SKenneth E. Jansen //unsigned long long pool_align = 8; 54*59599516SKenneth E. Jansen //unsigned long long mem_address; 55*59599516SKenneth E. Jansen 56*59599516SKenneth E. Jansen // the following defines are for debug printf 57*59599516SKenneth E. Jansen #define PHASTAIO_PREFIX "phastaIO debug: " 58*59599516SKenneth E. Jansen #define PHASTAIO_DEBUG 0 //default to not print any debugging info 59*59599516SKenneth E. Jansen 60*59599516SKenneth E. Jansen #if PHASTAIO_DEBUG 61*59599516SKenneth E. Jansen #define phprintf( s, arg...) printf(PHASTAIO_PREFIX s "\n", ##arg) 62*59599516SKenneth E. Jansen #define phprintf_0( s, arg...) do{ \ 63*59599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); \ 64*59599516SKenneth E. Jansen if(irank == 0){ \ 65*59599516SKenneth E. Jansen printf(PHASTAIO_PREFIX "irank=0: " s "\n", ##arg); \ 66*59599516SKenneth E. Jansen } \ 67*59599516SKenneth E. Jansen } while(0) 68*59599516SKenneth E. Jansen #else 69*59599516SKenneth E. Jansen #define phprintf( s, arg...) 70*59599516SKenneth E. Jansen #define phprintf_0( s, arg...) 71*59599516SKenneth E. Jansen #endif 72*59599516SKenneth E. Jansen 73*59599516SKenneth E. Jansen enum PhastaIO_Errors 74*59599516SKenneth E. Jansen { 75*59599516SKenneth E. Jansen MAX_PHASTA_FILES_EXCEEDED = -1, 76*59599516SKenneth E. Jansen UNABLE_TO_OPEN_FILE = -2, 77*59599516SKenneth E. Jansen NOT_A_MPI_FILE = -3, 78*59599516SKenneth E. Jansen GPID_EXCEEDED = -4, 79*59599516SKenneth E. Jansen DATA_TYPE_ILLEGAL = -5, 80*59599516SKenneth E. Jansen }; 81*59599516SKenneth E. Jansen 82*59599516SKenneth E. Jansen using namespace std; 83*59599516SKenneth E. Jansen 84*59599516SKenneth E. Jansen namespace{ 85*59599516SKenneth E. Jansen 86*59599516SKenneth E. Jansen map< int , char* > LastHeaderKey; 87*59599516SKenneth E. Jansen vector< FILE* > fileArray; 88*59599516SKenneth E. Jansen vector< bool > byte_order; 89*59599516SKenneth E. Jansen vector< int > header_type; 90*59599516SKenneth E. Jansen int DataSize=0; 91*59599516SKenneth E. Jansen bool LastHeaderNotFound = false; 92*59599516SKenneth E. Jansen bool Wrong_Endian = false ; 93*59599516SKenneth E. Jansen bool Strict_Error = false ; 94*59599516SKenneth E. Jansen bool binary_format = true; 95*59599516SKenneth E. Jansen 96*59599516SKenneth E. Jansen /***********************************************************************/ 97*59599516SKenneth E. Jansen /***************** NEW PHASTA IO CODE STARTS HERE **********************/ 98*59599516SKenneth E. Jansen /***********************************************************************/ 99*59599516SKenneth E. Jansen 100*59599516SKenneth E. Jansen typedef struct 101*59599516SKenneth E. Jansen { 102*59599516SKenneth E. Jansen char filename[MAX_PHASTA_FILE_NAME_LENGTH]; /* defafults to 1024 */ 103*59599516SKenneth E. Jansen unsigned long long my_offset; 104*59599516SKenneth E. Jansen unsigned long long next_start_address; 105*59599516SKenneth E. Jansen unsigned long long **my_offset_table; 106*59599516SKenneth E. Jansen unsigned long long **my_read_table; 107*59599516SKenneth E. Jansen 108*59599516SKenneth E. Jansen double * double_chunk; 109*59599516SKenneth E. Jansen double * read_double_chunk; 110*59599516SKenneth E. Jansen 111*59599516SKenneth E. Jansen int field_count; 112*59599516SKenneth E. Jansen int part_count; 113*59599516SKenneth E. Jansen int read_field_count; 114*59599516SKenneth E. Jansen int read_part_count; 115*59599516SKenneth E. Jansen int GPid; 116*59599516SKenneth E. Jansen int start_id; 117*59599516SKenneth E. Jansen 118*59599516SKenneth E. Jansen int mhsize; 119*59599516SKenneth E. Jansen 120*59599516SKenneth E. Jansen int myrank; 121*59599516SKenneth E. Jansen int numprocs; 122*59599516SKenneth E. Jansen int local_myrank; 123*59599516SKenneth E. Jansen int local_numprocs; 124*59599516SKenneth E. Jansen 125*59599516SKenneth E. Jansen int nppp; 126*59599516SKenneth E. Jansen int nPPF; 127*59599516SKenneth E. Jansen int nFiles; 128*59599516SKenneth E. Jansen int nFields; 129*59599516SKenneth E. Jansen 130*59599516SKenneth E. Jansen int * int_chunk; 131*59599516SKenneth E. Jansen int * read_int_chunk; 132*59599516SKenneth E. Jansen 133*59599516SKenneth E. Jansen int Wrong_Endian; /* default to false */ 134*59599516SKenneth E. Jansen char * master_header; 135*59599516SKenneth E. Jansen MPI_File file_handle; 136*59599516SKenneth E. Jansen MPI_Comm local_comm; 137*59599516SKenneth E. Jansen } phastaio_file_t; 138*59599516SKenneth E. Jansen 139*59599516SKenneth E. Jansen typedef struct 140*59599516SKenneth E. Jansen { 141*59599516SKenneth E. Jansen //unsigned long long my_offset; 142*59599516SKenneth E. Jansen //unsigned long long **offset_table; 143*59599516SKenneth E. Jansen //int fileID; 144*59599516SKenneth E. Jansen int nppf, nfields; 145*59599516SKenneth E. Jansen //int GPid; 146*59599516SKenneth E. Jansen //int read_field_count; 147*59599516SKenneth E. Jansen char * masterHeader; 148*59599516SKenneth E. Jansen }serial_file; 149*59599516SKenneth E. Jansen 150*59599516SKenneth E. Jansen serial_file *SerialFile; 151*59599516SKenneth E. Jansen phastaio_file_t *PhastaIOActiveFiles[MAX_PHASTA_FILES]; 152*59599516SKenneth E. Jansen int PhastaIONextActiveIndex = 0; /* indicates next index to allocate */ 153*59599516SKenneth E. Jansen 154*59599516SKenneth E. Jansen // the caller has the responsibility to delete the returned string 155*59599516SKenneth E. Jansen // TODO: StringStipper("nbc value? ") returns NULL? 156*59599516SKenneth E. Jansen char* 157*59599516SKenneth E. Jansen StringStripper( const char istring[] ) { 158*59599516SKenneth E. Jansen 159*59599516SKenneth E. Jansen int length = strlen( istring ); 160*59599516SKenneth E. Jansen 161*59599516SKenneth E. Jansen //char* dest = new char [ length + 1 ]; 162*59599516SKenneth E. Jansen char* dest = (char *)malloc( length + 1 ); 163*59599516SKenneth E. Jansen 164*59599516SKenneth E. Jansen //char * dest; 165*59599516SKenneth E. Jansen //dest = (char *)malloc( length + 1 + pool_align ); 166*59599516SKenneth E. Jansen //if (dest & 0x0F != 0) printf("not aligned!!!!\n"); 167*59599516SKenneth E. Jansen //mem_address = (long long )dest; 168*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 169*59599516SKenneth E. Jansen // dest += pool_align - (mem_address & (pool_align -1)); 170*59599516SKenneth E. Jansen 171*59599516SKenneth E. Jansen strcpy( dest, istring ); 172*59599516SKenneth E. Jansen dest[ length ] = '\0'; 173*59599516SKenneth E. Jansen 174*59599516SKenneth E. Jansen if ( char* p = strpbrk( dest, " ") ) 175*59599516SKenneth E. Jansen *p = '\0'; 176*59599516SKenneth E. Jansen 177*59599516SKenneth E. Jansen return dest; 178*59599516SKenneth E. Jansen } 179*59599516SKenneth E. Jansen 180*59599516SKenneth E. Jansen inline int 181*59599516SKenneth E. Jansen cscompare( const char teststring[], 182*59599516SKenneth E. Jansen const char targetstring[] ) { 183*59599516SKenneth E. Jansen 184*59599516SKenneth E. Jansen char* s1 = const_cast<char*>(teststring); 185*59599516SKenneth E. Jansen char* s2 = const_cast<char*>(targetstring); 186*59599516SKenneth E. Jansen 187*59599516SKenneth E. Jansen while( *s1 == ' ') s1++; 188*59599516SKenneth E. Jansen while( *s2 == ' ') s2++; 189*59599516SKenneth E. Jansen while( ( *s1 ) 190*59599516SKenneth E. Jansen && ( *s2 ) 191*59599516SKenneth E. Jansen && ( *s2 != '?') 192*59599516SKenneth E. Jansen && ( tolower( *s1 )==tolower( *s2 ) ) ) { 193*59599516SKenneth E. Jansen s1++; 194*59599516SKenneth E. Jansen s2++; 195*59599516SKenneth E. Jansen while( *s1 == ' ') s1++; 196*59599516SKenneth E. Jansen while( *s2 == ' ') s2++; 197*59599516SKenneth E. Jansen } 198*59599516SKenneth E. Jansen if ( !( *s1 ) || ( *s1 == '?') ) return 1; 199*59599516SKenneth E. Jansen else return 0; 200*59599516SKenneth E. Jansen } 201*59599516SKenneth E. Jansen 202*59599516SKenneth E. Jansen inline void 203*59599516SKenneth E. Jansen isBinary( const char iotype[] ) { 204*59599516SKenneth E. Jansen 205*59599516SKenneth E. Jansen char* fname = StringStripper( iotype ); 206*59599516SKenneth E. Jansen if ( cscompare( fname, "binary" ) ) binary_format = true; 207*59599516SKenneth E. Jansen else binary_format = false; 208*59599516SKenneth E. Jansen free (fname); 209*59599516SKenneth E. Jansen 210*59599516SKenneth E. Jansen } 211*59599516SKenneth E. Jansen 212*59599516SKenneth E. Jansen inline size_t 213*59599516SKenneth E. Jansen typeSize( const char typestring[] ) { 214*59599516SKenneth E. Jansen 215*59599516SKenneth E. Jansen char* ts1 = StringStripper( typestring ); 216*59599516SKenneth E. Jansen 217*59599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 218*59599516SKenneth E. Jansen free (ts1); 219*59599516SKenneth E. Jansen return sizeof(int); 220*59599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 221*59599516SKenneth E. Jansen free (ts1); 222*59599516SKenneth E. Jansen return sizeof( double ); 223*59599516SKenneth E. Jansen } else { 224*59599516SKenneth E. Jansen free (ts1); 225*59599516SKenneth E. Jansen fprintf(stderr,"unknown type : %s\n",ts1); 226*59599516SKenneth E. Jansen return 0; 227*59599516SKenneth E. Jansen } 228*59599516SKenneth E. Jansen } 229*59599516SKenneth E. Jansen 230*59599516SKenneth E. Jansen int 231*59599516SKenneth E. Jansen readHeader( FILE* fileObject, 232*59599516SKenneth E. Jansen const char phrase[], 233*59599516SKenneth E. Jansen int* params, 234*59599516SKenneth E. Jansen int expect ) { 235*59599516SKenneth E. Jansen 236*59599516SKenneth E. Jansen char* text_header; 237*59599516SKenneth E. Jansen char* token; 238*59599516SKenneth E. Jansen char Line[1024]; 239*59599516SKenneth E. Jansen char junk; 240*59599516SKenneth E. Jansen bool FOUND = false ; 241*59599516SKenneth E. Jansen int real_length; 242*59599516SKenneth E. Jansen int skip_size, integer_value; 243*59599516SKenneth E. Jansen int rewind_count=0; 244*59599516SKenneth E. Jansen 245*59599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 246*59599516SKenneth E. Jansen rewind( fileObject ); 247*59599516SKenneth E. Jansen clearerr( fileObject ); 248*59599516SKenneth E. Jansen rewind_count++; 249*59599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 250*59599516SKenneth E. Jansen } 251*59599516SKenneth E. Jansen 252*59599516SKenneth E. Jansen while( !FOUND && ( rewind_count < 2 ) ) { 253*59599516SKenneth E. Jansen if ( ( Line[0] != '\n' ) && ( real_length = strcspn( Line, "#" )) ){ 254*59599516SKenneth E. Jansen //text_header = new char [ real_length + 1 ]; 255*59599516SKenneth E. Jansen text_header = (char *)malloc( real_length + 1 ); 256*59599516SKenneth E. Jansen //text_header = (char *)malloc( real_length + 1 + pool_align ); 257*59599516SKenneth E. Jansen //mem_address = (long long )text_header; 258*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 259*59599516SKenneth E. Jansen // text_header += pool_align - (mem_address & (pool_align -1)); 260*59599516SKenneth E. Jansen 261*59599516SKenneth E. Jansen strncpy( text_header, Line, real_length ); 262*59599516SKenneth E. Jansen text_header[ real_length ] =static_cast<char>(NULL); 263*59599516SKenneth E. Jansen token = strtok ( text_header, ":" ); 264*59599516SKenneth E. Jansen //if( cscompare( phrase , token ) ) { 265*59599516SKenneth E. Jansen // Double comparison required because different fields can still start 266*59599516SKenneth E. Jansen // with the same name for mixed meshes (nbc code, nbc values, etc). 267*59599516SKenneth E. Jansen // Would be easy to fix cscompare instead but would it break sth else? 268*59599516SKenneth E. Jansen if( cscompare( phrase , token ) && cscompare( token , phrase ) ) { 269*59599516SKenneth E. Jansen FOUND = true ; 270*59599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 271*59599516SKenneth E. Jansen skip_size = atoi( token ); 272*59599516SKenneth E. Jansen int i; 273*59599516SKenneth E. Jansen for( i=0; i < expect && ( token = strtok( NULL," ,;<>") ); i++) { 274*59599516SKenneth E. Jansen params[i] = atoi( token ); 275*59599516SKenneth E. Jansen } 276*59599516SKenneth E. Jansen if ( i < expect ) { 277*59599516SKenneth E. Jansen fprintf(stderr,"Aloha Expected # of ints not found for: %s\n",phrase ); 278*59599516SKenneth E. Jansen } 279*59599516SKenneth E. Jansen } else if ( cscompare(token,"byteorder magic number") ) { 280*59599516SKenneth E. Jansen if ( binary_format ) { 281*59599516SKenneth E. Jansen fread((void*)&integer_value,sizeof(int),1,fileObject); 282*59599516SKenneth E. Jansen fread( &junk, sizeof(char), 1 , fileObject ); 283*59599516SKenneth E. Jansen if ( 362436 != integer_value ) Wrong_Endian = true; 284*59599516SKenneth E. Jansen } else{ 285*59599516SKenneth E. Jansen fscanf(fileObject, "%d\n", &integer_value ); 286*59599516SKenneth E. Jansen } 287*59599516SKenneth E. Jansen } else { 288*59599516SKenneth E. Jansen /* some other header, so just skip over */ 289*59599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 290*59599516SKenneth E. Jansen skip_size = atoi( token ); 291*59599516SKenneth E. Jansen if ( binary_format) 292*59599516SKenneth E. Jansen fseek( fileObject, skip_size, SEEK_CUR ); 293*59599516SKenneth E. Jansen else 294*59599516SKenneth E. Jansen for( int gama=0; gama < skip_size; gama++ ) 295*59599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 296*59599516SKenneth E. Jansen } 297*59599516SKenneth E. Jansen free (text_header); 298*59599516SKenneth E. Jansen } // end of if before while loop 299*59599516SKenneth E. Jansen 300*59599516SKenneth E. Jansen if ( !FOUND ) 301*59599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 302*59599516SKenneth E. Jansen rewind( fileObject ); 303*59599516SKenneth E. Jansen clearerr( fileObject ); 304*59599516SKenneth E. Jansen rewind_count++; 305*59599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 306*59599516SKenneth E. Jansen } 307*59599516SKenneth E. Jansen } 308*59599516SKenneth E. Jansen 309*59599516SKenneth E. Jansen if ( !FOUND ) { 310*59599516SKenneth E. Jansen //fprintf(stderr, "Error: Could not find: %s\n", phrase); 311*59599516SKenneth E. Jansen if(irank == 0) printf("WARNING: Could not find: %s\n", phrase); 312*59599516SKenneth E. Jansen return 1; 313*59599516SKenneth E. Jansen } 314*59599516SKenneth E. Jansen return 0; 315*59599516SKenneth E. Jansen } 316*59599516SKenneth E. Jansen 317*59599516SKenneth E. Jansen } // end unnamed namespace 318*59599516SKenneth E. Jansen 319*59599516SKenneth E. Jansen 320*59599516SKenneth E. Jansen // begin of publicly visible functions 321*59599516SKenneth E. Jansen 322*59599516SKenneth E. Jansen /** 323*59599516SKenneth E. Jansen * This function takes a long long pointer and assign (start) phiotmrc value to it 324*59599516SKenneth E. Jansen */ 325*59599516SKenneth E. Jansen //void startTimer(unsigned long long* start) { 326*59599516SKenneth E. Jansen void startTimer(double* start) { 327*59599516SKenneth E. Jansen 328*59599516SKenneth E. Jansen if( !PRINT_PERF ) return; 329*59599516SKenneth E. Jansen 330*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 331*59599516SKenneth E. Jansen *start = phiotmrc(); 332*59599516SKenneth E. Jansen } 333*59599516SKenneth E. Jansen 334*59599516SKenneth E. Jansen /** 335*59599516SKenneth E. Jansen * This function takes a long long pointer and assign (end) phiotmrc value to it 336*59599516SKenneth E. Jansen */ 337*59599516SKenneth E. Jansen void endTimer(double* end) { 338*59599516SKenneth E. Jansen 339*59599516SKenneth E. Jansen if( !PRINT_PERF ) return; 340*59599516SKenneth E. Jansen 341*59599516SKenneth E. Jansen *end = phiotmrc(); 342*59599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 343*59599516SKenneth E. Jansen } 344*59599516SKenneth E. Jansen 345*59599516SKenneth E. Jansen /** 346*59599516SKenneth E. Jansen * choose to print some performance results (or not) according to 347*59599516SKenneth E. Jansen * the PRINT_PERF macro 348*59599516SKenneth E. Jansen */ 349*59599516SKenneth E. Jansen void printPerf( 350*59599516SKenneth E. Jansen const char* func_name, 351*59599516SKenneth E. Jansen double start, 352*59599516SKenneth E. Jansen double end, 353*59599516SKenneth E. Jansen unsigned long long datasize, 354*59599516SKenneth E. Jansen int printdatainfo, 355*59599516SKenneth E. Jansen const char* extra_msg) { 356*59599516SKenneth E. Jansen 357*59599516SKenneth E. Jansen if( !PRINT_PERF ) return; 358*59599516SKenneth E. Jansen 359*59599516SKenneth E. Jansen unsigned long long data_size = datasize; 360*59599516SKenneth E. Jansen 361*59599516SKenneth E. Jansen double time = end - start; 362*59599516SKenneth E. Jansen 363*59599516SKenneth E. Jansen unsigned long long isizemin,isizemax,isizetot; 364*59599516SKenneth E. Jansen double sizemin,sizemax,sizeavg,sizetot,rate; 365*59599516SKenneth E. Jansen double tmin, tmax, tavg, ttot; 366*59599516SKenneth E. Jansen 367*59599516SKenneth E. Jansen MPI_Allreduce(&time, &tmin,1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); 368*59599516SKenneth E. Jansen MPI_Allreduce(&time, &tmax,1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); 369*59599516SKenneth E. Jansen MPI_Allreduce(&time, &ttot,1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); 370*59599516SKenneth E. Jansen tavg = ttot/mysize; 371*59599516SKenneth E. Jansen 372*59599516SKenneth E. Jansen if(irank == 0) { 373*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) printf("** 1PFPP "); 374*59599516SKenneth E. Jansen else printf("** syncIO "); 375*59599516SKenneth E. Jansen printf("%s(): Tmax = %f sec, Tmin = %f sec, Tavg = %f sec", func_name, tmax, tmin, tavg); 376*59599516SKenneth E. Jansen } 377*59599516SKenneth E. Jansen 378*59599516SKenneth E. Jansen if(printdatainfo == 1) { // if printdatainfo ==1, compute I/O rate and block size 379*59599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemin,1,MPI_LONG_LONG_INT,MPI_MIN,MPI_COMM_WORLD); 380*59599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemax,1,MPI_LONG_LONG_INT,MPI_MAX,MPI_COMM_WORLD); 381*59599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizetot,1,MPI_LONG_LONG_INT,MPI_SUM,MPI_COMM_WORLD); 382*59599516SKenneth E. Jansen 383*59599516SKenneth E. Jansen sizemin=(double)(isizemin*inv1024sq); 384*59599516SKenneth E. Jansen sizemax=(double)(isizemax*inv1024sq); 385*59599516SKenneth E. Jansen sizetot=(double)(isizetot*inv1024sq); 386*59599516SKenneth E. Jansen sizeavg=(double)(1.0*sizetot/mysize); 387*59599516SKenneth E. Jansen rate=(double)(1.0*sizetot/tmax); 388*59599516SKenneth E. Jansen 389*59599516SKenneth E. Jansen if( irank == 0) { 390*59599516SKenneth E. Jansen printf(", Rate = %f MB/s [%s] \n \t\t\t block size: Min= %f MB; Max= %f MB; Avg= %f MB; Tot= %f MB\n", rate, extra_msg, sizemin,sizemax,sizeavg,sizetot); 391*59599516SKenneth E. Jansen } 392*59599516SKenneth E. Jansen } 393*59599516SKenneth E. Jansen else { 394*59599516SKenneth E. Jansen if(irank == 0) { 395*59599516SKenneth E. Jansen printf(" \n"); 396*59599516SKenneth E. Jansen //printf(" (%s) \n", extra_msg); 397*59599516SKenneth E. Jansen } 398*59599516SKenneth E. Jansen } 399*59599516SKenneth E. Jansen } 400*59599516SKenneth E. Jansen 401*59599516SKenneth E. Jansen /** 402*59599516SKenneth E. Jansen * This function is normally called at the beginning of a read operation, before 403*59599516SKenneth E. Jansen * init function. 404*59599516SKenneth E. Jansen * This function (uses rank 0) reads out nfields, nppf, master header size, 405*59599516SKenneth E. Jansen * endianess and allocates for masterHeader string. 406*59599516SKenneth E. Jansen * These values are essential for following read operations. Rank 0 will bcast 407*59599516SKenneth E. Jansen * these values to other ranks in the commm world 408*59599516SKenneth E. Jansen * 409*59599516SKenneth E. Jansen * If the file set is of old POSIX format, it would throw error and exit 410*59599516SKenneth E. Jansen */ 411*59599516SKenneth E. Jansen void queryphmpiio(const char filename[],int *nfields, int *nppf) 412*59599516SKenneth E. Jansen { 413*59599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 414*59599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 415*59599516SKenneth E. Jansen 416*59599516SKenneth E. Jansen if(irank == 0) { 417*59599516SKenneth E. Jansen FILE * fileHandle; 418*59599516SKenneth E. Jansen char* fname = StringStripper( filename ); 419*59599516SKenneth E. Jansen 420*59599516SKenneth E. Jansen fileHandle = fopen (fname,"rb"); 421*59599516SKenneth E. Jansen if (fileHandle == NULL ) { 422*59599516SKenneth E. Jansen printf("\nError: File %s doesn't exist! Please check!\n",fname); 423*59599516SKenneth E. Jansen } 424*59599516SKenneth E. Jansen else { 425*59599516SKenneth E. Jansen SerialFile =(serial_file *)calloc( 1, sizeof( serial_file) ); 426*59599516SKenneth E. Jansen //SerialFile = (serial_file *)malloc( sizeof( serial_file ) + pool_align ); 427*59599516SKenneth E. Jansen //mem_address = (long long )SerialFile; 428*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 429*59599516SKenneth E. Jansen // SerialFile += pool_align - (mem_address & (pool_align -1)); 430*59599516SKenneth E. Jansen 431*59599516SKenneth E. Jansen //SerialFile->masterHeader = (char *)malloc(MasterHeaderSize); 432*59599516SKenneth E. Jansen //int meta_size_limit = 4*ONE_MEGABYTE; 433*59599516SKenneth E. Jansen //int meta_size_limit = (4+ MAX_FIELDS_NUMBER ) * MAX_FIELDS_NAME_LENGTH; 434*59599516SKenneth E. Jansen int meta_size_limit = VERSION_INFO_HEADER_SIZE; 435*59599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc( meta_size_limit ); 436*59599516SKenneth E. Jansen //SerialFile->masterHeader = (char *)malloc( meta_size_limit + pool_align ); 437*59599516SKenneth E. Jansen //mem_address = (long long )SerialFile; 438*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 439*59599516SKenneth E. Jansen // SerialFile->masterHeader += pool_align - (mem_address & (pool_align -1)); 440*59599516SKenneth E. Jansen 441*59599516SKenneth E. Jansen fread(SerialFile->masterHeader, 1, meta_size_limit, fileHandle); 442*59599516SKenneth E. Jansen 443*59599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 444*59599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 445*59599516SKenneth E. Jansen int mhsize; 446*59599516SKenneth E. Jansen char * token; 447*59599516SKenneth E. Jansen int magic_number; 448*59599516SKenneth E. Jansen 449*59599516SKenneth E. Jansen memcpy( read_out_tag, 450*59599516SKenneth E. Jansen SerialFile->masterHeader, 451*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 452*59599516SKenneth E. Jansen 453*59599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) { 454*59599516SKenneth E. Jansen // Test endianess ... 455*59599516SKenneth E. Jansen memcpy (&magic_number, 456*59599516SKenneth E. Jansen SerialFile->masterHeader + sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 457*59599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 458*59599516SKenneth E. Jansen 459*59599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) { 460*59599516SKenneth E. Jansen printf("Endian is different!\n"); 461*59599516SKenneth E. Jansen // Will do swap later 462*59599516SKenneth E. Jansen } 463*59599516SKenneth E. Jansen 464*59599516SKenneth E. Jansen // test version, old version, default masterheader size is 4M 465*59599516SKenneth E. Jansen // newer version masterheader size is read from first line 466*59599516SKenneth E. Jansen memcpy(version, 467*59599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/2, 468*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4 - 1); //TODO: why -1? 469*59599516SKenneth E. Jansen 470*59599516SKenneth E. Jansen if( cscompare ("version",version) ) { 471*59599516SKenneth E. Jansen // if there is "version" tag in the file, then it is newer format 472*59599516SKenneth E. Jansen // read master header size from here, otherwise use default 473*59599516SKenneth E. Jansen // Note: if version is "1", we know mhsize is at 3/4 place... 474*59599516SKenneth E. Jansen 475*59599516SKenneth E. Jansen token = strtok(version, ":"); 476*59599516SKenneth E. Jansen token = strtok(NULL, " ,;<>" ); 477*59599516SKenneth E. Jansen int iversion = atoi(token); 478*59599516SKenneth E. Jansen 479*59599516SKenneth E. Jansen if( iversion == 1) { 480*59599516SKenneth E. Jansen memcpy( &mhsize, 481*59599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/4*3 + sizeof("mhsize : ")-1, 482*59599516SKenneth E. Jansen sizeof(int)); 483*59599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 484*59599516SKenneth E. Jansen SwapArrayByteOrder(&mhsize, sizeof(int), 1); 485*59599516SKenneth E. Jansen 486*59599516SKenneth E. Jansen if( mhsize > DefaultMHSize ) { 487*59599516SKenneth E. Jansen //if actual headersize is larger than default, let's re-read 488*59599516SKenneth E. Jansen free(SerialFile->masterHeader); 489*59599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc(mhsize); 490*59599516SKenneth E. Jansen fseek(fileHandle, 0, SEEK_SET); // reset the file stream position 491*59599516SKenneth E. Jansen fread(SerialFile->masterHeader,1,mhsize,fileHandle); 492*59599516SKenneth E. Jansen } 493*59599516SKenneth E. Jansen } 494*59599516SKenneth E. Jansen //TODO: check if this is a valid int?? 495*59599516SKenneth E. Jansen MasterHeaderSize = mhsize; 496*59599516SKenneth E. Jansen } 497*59599516SKenneth E. Jansen else { // else it's version 0's format w/o version tag, implicating MHSize=4M 498*59599516SKenneth E. Jansen MasterHeaderSize = DefaultMHSize; 499*59599516SKenneth E. Jansen } 500*59599516SKenneth E. Jansen 501*59599516SKenneth E. Jansen memcpy( read_out_tag, 502*59599516SKenneth E. Jansen SerialFile->masterHeader+MAX_FIELDS_NAME_LENGTH+1, 503*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); //TODO: why +1 504*59599516SKenneth E. Jansen 505*59599516SKenneth E. Jansen // Read in # fields ... 506*59599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 507*59599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 508*59599516SKenneth E. Jansen *nfields = atoi( token ); 509*59599516SKenneth E. Jansen if ( *nfields > MAX_FIELDS_NUMBER) { 510*59599516SKenneth E. Jansen printf("Error queryphmpiio: nfields is larger than MAX_FIELDS_NUMBER!\n"); 511*59599516SKenneth E. Jansen } 512*59599516SKenneth E. Jansen SerialFile->nfields=*nfields; //TODO: sanity check of this int? 513*59599516SKenneth E. Jansen 514*59599516SKenneth E. Jansen memcpy( read_out_tag, 515*59599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH * 2 516*59599516SKenneth E. Jansen + *nfields * MAX_FIELDS_NAME_LENGTH, 517*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 518*59599516SKenneth E. Jansen 519*59599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 520*59599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 521*59599516SKenneth E. Jansen *nppf = atoi( token ); 522*59599516SKenneth E. Jansen SerialFile->nppf=*nppf; //TODO: sanity check of int 523*59599516SKenneth E. Jansen } // end of if("MPI_IO_TAG") 524*59599516SKenneth E. Jansen else { 525*59599516SKenneth E. Jansen printf("Error queryphmpiio: The file you opened is not of syncIO new format, please check! read_out_tag = %s\n",read_out_tag); 526*59599516SKenneth E. Jansen exit(1); 527*59599516SKenneth E. Jansen } 528*59599516SKenneth E. Jansen fclose(fileHandle); 529*59599516SKenneth E. Jansen free(SerialFile->masterHeader); 530*59599516SKenneth E. Jansen free(SerialFile); 531*59599516SKenneth E. Jansen } //end of else 532*59599516SKenneth E. Jansen free(fname); 533*59599516SKenneth E. Jansen } 534*59599516SKenneth E. Jansen 535*59599516SKenneth E. Jansen // Bcast value to every one 536*59599516SKenneth E. Jansen MPI_Bcast( nfields, 1, MPI_INT, 0, MPI_COMM_WORLD ); 537*59599516SKenneth E. Jansen MPI_Bcast( nppf, 1, MPI_INT, 0, MPI_COMM_WORLD ); 538*59599516SKenneth E. Jansen MPI_Bcast( &MasterHeaderSize, 1, MPI_INT, 0, MPI_COMM_WORLD ); 539*59599516SKenneth E. Jansen phprintf("Info queryphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 540*59599516SKenneth E. Jansen } 541*59599516SKenneth E. Jansen 542*59599516SKenneth E. Jansen /** 543*59599516SKenneth E. Jansen * This function computes the right master header size (round to size of 2^n). 544*59599516SKenneth E. Jansen * This is only needed for file format version 1 in "write" mode. 545*59599516SKenneth E. Jansen */ 546*59599516SKenneth E. Jansen int computeMHSize(int nfields, int nppf, int version) { 547*59599516SKenneth E. Jansen int mhsize; 548*59599516SKenneth E. Jansen if(version == 1) { 549*59599516SKenneth E. Jansen //int meta_info_size = (2+nfields+1) * MAX_FIELDS_NAME_LENGTH; // 2 is MPI_IO_TAG and nFields, the others 1 is nppf 550*59599516SKenneth E. Jansen int meta_info_size = VERSION_INFO_HEADER_SIZE; 551*59599516SKenneth E. Jansen int actual_size = nfields * nppf * sizeof(long long) + meta_info_size; 552*59599516SKenneth E. Jansen //printf("actual_size = %d, offset table size = %d\n", actual_size, nfields * nppf * sizeof(long long)); 553*59599516SKenneth E. Jansen if (actual_size > DefaultMHSize) { 554*59599516SKenneth E. Jansen mhsize = (int) ceil( (double) actual_size/DefaultMHSize); // it's rounded to ceiling of this value 555*59599516SKenneth E. Jansen mhsize *= DefaultMHSize; 556*59599516SKenneth E. Jansen } 557*59599516SKenneth E. Jansen else { 558*59599516SKenneth E. Jansen mhsize = DefaultMHSize; 559*59599516SKenneth E. Jansen } 560*59599516SKenneth E. Jansen } 561*59599516SKenneth E. Jansen return mhsize; 562*59599516SKenneth E. Jansen } 563*59599516SKenneth E. Jansen 564*59599516SKenneth E. Jansen /** 565*59599516SKenneth E. Jansen * Computes correct color of a rank according to number of files. 566*59599516SKenneth E. Jansen */ 567*59599516SKenneth E. Jansen extern "C" int computeColor( int myrank, int numprocs, int nfiles) { 568*59599516SKenneth E. Jansen int color = 569*59599516SKenneth E. Jansen (int)(myrank / (numprocs / nfiles)); 570*59599516SKenneth E. Jansen return color; 571*59599516SKenneth E. Jansen } 572*59599516SKenneth E. Jansen 573*59599516SKenneth E. Jansen 574*59599516SKenneth E. Jansen /** 575*59599516SKenneth E. Jansen * Check the file descriptor. 576*59599516SKenneth E. Jansen */ 577*59599516SKenneth E. Jansen void checkFileDescriptor(const char fctname[], 578*59599516SKenneth E. Jansen int* fileDescriptor ) { 579*59599516SKenneth E. Jansen if ( *fileDescriptor < 0 ) { 580*59599516SKenneth E. Jansen printf("Error: File descriptor = %d in %s\n",*fileDescriptor,fctname); 581*59599516SKenneth E. Jansen exit(1); 582*59599516SKenneth E. Jansen } 583*59599516SKenneth E. Jansen } 584*59599516SKenneth E. Jansen 585*59599516SKenneth E. Jansen /** 586*59599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct 587*59599516SKenneth E. Jansen * buffers. 588*59599516SKenneth E. Jansen * 589*59599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 590*59599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 591*59599516SKenneth E. Jansen */ 592*59599516SKenneth E. Jansen int initphmpiio( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[]) 593*59599516SKenneth E. Jansen { 594*59599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 595*59599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 596*59599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 597*59599516SKenneth E. Jansen 598*59599516SKenneth E. Jansen phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 599*59599516SKenneth E. Jansen 600*59599516SKenneth E. Jansen double timer_start, timer_end; 601*59599516SKenneth E. Jansen startTimer(&timer_start); 602*59599516SKenneth E. Jansen 603*59599516SKenneth E. Jansen char* imode = StringStripper( mode ); 604*59599516SKenneth E. Jansen 605*59599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 606*59599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 607*59599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 608*59599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 609*59599516SKenneth E. Jansen // do nothing 610*59599516SKenneth E. Jansen } 611*59599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 612*59599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 613*59599516SKenneth E. Jansen } 614*59599516SKenneth E. Jansen else { 615*59599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 616*59599516SKenneth E. Jansen exit(1); 617*59599516SKenneth E. Jansen } 618*59599516SKenneth E. Jansen free ( imode ); 619*59599516SKenneth E. Jansen 620*59599516SKenneth E. Jansen phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 621*59599516SKenneth E. Jansen 622*59599516SKenneth E. Jansen int i, j; 623*59599516SKenneth E. Jansen 624*59599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 625*59599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 626*59599516SKenneth E. Jansen endTimer(&timer_end); 627*59599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 628*59599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 629*59599516SKenneth E. Jansen } 630*59599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 631*59599516SKenneth E. Jansen // { 632*59599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 633*59599516SKenneth E. Jansen // { 634*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 635*59599516SKenneth E. Jansen // } 636*59599516SKenneth E. Jansen // } 637*59599516SKenneth E. Jansen 638*59599516SKenneth E. Jansen 639*59599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 640*59599516SKenneth E. Jansen //PhastaIOActiveFiles[PhastaIONextActiveIndex] = ( phastaio_file_t *)calloc( 1 + 1, sizeof( phastaio_file_t ) ); 641*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[PhastaIONextActiveIndex]; 642*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 643*59599516SKenneth E. Jansen // PhastaIOActiveFiles[PhastaIONextActiveIndex] += pool_align - (mem_address & (pool_align -1)); 644*59599516SKenneth E. Jansen 645*59599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 646*59599516SKenneth E. Jansen PhastaIONextActiveIndex++; 647*59599516SKenneth E. Jansen 648*59599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 649*59599516SKenneth E. Jansen 650*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 651*59599516SKenneth E. Jansen 652*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 653*59599516SKenneth E. Jansen 654*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 655*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 656*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 657*59599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->myrank)); 658*59599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->numprocs)); 659*59599516SKenneth E. Jansen 660*59599516SKenneth E. Jansen 661*59599516SKenneth E. Jansen if( *nfiles > 1 ) { // split the ranks according to each mpiio file 662*59599516SKenneth E. Jansen 663*59599516SKenneth E. Jansen if ( s_assign_local_comm == 0) { // call mpi_comm_split for the first (and only) time 664*59599516SKenneth E. Jansen 665*59599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Building subcommunicator\n"); 666*59599516SKenneth E. Jansen 667*59599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 668*59599516SKenneth E. Jansen MPI_Comm_split(MPI_COMM_WORLD, 669*59599516SKenneth E. Jansen color, 670*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 671*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 672*59599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 673*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 674*59599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 675*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 676*59599516SKenneth E. Jansen 677*59599516SKenneth E. Jansen // back up now these variables so that we do not need to call comm_split again 678*59599516SKenneth E. Jansen s_local_comm = PhastaIOActiveFiles[i]->local_comm; 679*59599516SKenneth E. Jansen s_local_size = PhastaIOActiveFiles[i]->local_numprocs; 680*59599516SKenneth E. Jansen s_local_rank = PhastaIOActiveFiles[i]->local_myrank; 681*59599516SKenneth E. Jansen s_assign_local_comm = 1; 682*59599516SKenneth E. Jansen } 683*59599516SKenneth E. Jansen else { // recycle the subcommunicator 684*59599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Recycling subcommunicator\n"); 685*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = s_local_comm; 686*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = s_local_size; 687*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = s_local_rank; 688*59599516SKenneth E. Jansen } 689*59599516SKenneth E. Jansen } 690*59599516SKenneth E. Jansen else { // *nfiles == 1 here - no need to call mpi_comm_split here 691*59599516SKenneth E. Jansen 692*59599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Bypassing subcommunicator\n"); 693*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = MPI_COMM_WORLD; 694*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = PhastaIOActiveFiles[i]->numprocs; 695*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = PhastaIOActiveFiles[i]->myrank; 696*59599516SKenneth E. Jansen 697*59599516SKenneth E. Jansen } 698*59599516SKenneth E. Jansen 699*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 700*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 701*59599516SKenneth E. Jansen 702*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 703*59599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 704*59599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 705*59599516SKenneth E. Jansen 706*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 707*59599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 708*59599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof(unsigned long long *) ); 709*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table; 710*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 711*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table += pool_align - (mem_address & (pool_align -1)); 712*59599516SKenneth E. Jansen 713*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 714*59599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 715*59599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof( unsigned long long *) ); 716*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table; 717*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 718*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table += pool_align - (mem_address & (pool_align -1)); 719*59599516SKenneth E. Jansen 720*59599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 721*59599516SKenneth E. Jansen { 722*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 723*59599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 724*59599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp + pool_align, sizeof( unsigned long long) ); 725*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table[j]; 726*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 727*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table[j] += pool_align - (mem_address & (pool_align -1)); 728*59599516SKenneth E. Jansen 729*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 730*59599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 731*59599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) + pool_align ); 732*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table[j]; 733*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 734*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table[j] += pool_align - (mem_address & (pool_align -1)); 735*59599516SKenneth E. Jansen } 736*59599516SKenneth E. Jansen *filehandle = i; 737*59599516SKenneth E. Jansen 738*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 739*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 740*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 741*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 742*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 743*59599516SKenneth E. Jansen 744*59599516SKenneth E. Jansen /* 745*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = 746*59599516SKenneth E. Jansen ( char * ) calloc( MasterHeaderSize + pool_align, sizeof( char ) ); 747*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->master_header; 748*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 749*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header += pool_align - (mem_address & (pool_align -1)); 750*59599516SKenneth E. Jansen 751*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = 752*59599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 753*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk; 754*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 755*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1)); 756*59599516SKenneth E. Jansen 757*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = 758*59599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 759*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk; 760*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 761*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & (pool_align -1)); 762*59599516SKenneth E. Jansen 763*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = 764*59599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 765*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_double_chunk; 766*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 767*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk += pool_align - (mem_address & (pool_align -1)); 768*59599516SKenneth E. Jansen 769*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = 770*59599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 771*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_int_chunk; 772*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 773*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk += pool_align - (mem_address & (pool_align -1)); 774*59599516SKenneth E. Jansen */ 775*59599516SKenneth E. Jansen 776*59599516SKenneth E. Jansen // Time monitoring 777*59599516SKenneth E. Jansen endTimer(&timer_end); 778*59599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 779*59599516SKenneth E. Jansen 780*59599516SKenneth E. Jansen phprintf_0("Info initphmpiio: quiting function"); 781*59599516SKenneth E. Jansen 782*59599516SKenneth E. Jansen return i; 783*59599516SKenneth E. Jansen } 784*59599516SKenneth E. Jansen 785*59599516SKenneth E. Jansen /** 786*59599516SKenneth E. Jansen * Destruct the file struct and free buffers allocated in init function. 787*59599516SKenneth E. Jansen */ 788*59599516SKenneth E. Jansen void finalizephmpiio( int *fileDescriptor ) 789*59599516SKenneth E. Jansen { 790*59599516SKenneth E. Jansen double timer_start, timer_end; 791*59599516SKenneth E. Jansen startTimer(&timer_start); 792*59599516SKenneth E. Jansen 793*59599516SKenneth E. Jansen int i, j; 794*59599516SKenneth E. Jansen i = *fileDescriptor; 795*59599516SKenneth E. Jansen //PhastaIONextActiveIndex--; 796*59599516SKenneth E. Jansen 797*59599516SKenneth E. Jansen /* //free the offset table for this phasta file */ 798*59599516SKenneth E. Jansen //for(j=0; j<MAX_FIELDS_NUMBER; j++) //Danger: undefined behavior for my_*_table.[j] not allocated or not initialized to NULL 799*59599516SKenneth E. Jansen for(j=0; j<PhastaIOActiveFiles[i]->nFields; j++) 800*59599516SKenneth E. Jansen { 801*59599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_offset_table[j]); 802*59599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_read_table[j]); 803*59599516SKenneth E. Jansen } 804*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_offset_table ); 805*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_read_table ); 806*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->master_header ); 807*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 808*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 809*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_double_chunk ); 810*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_int_chunk ); 811*59599516SKenneth E. Jansen 812*59599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]); 813*59599516SKenneth E. Jansen 814*59599516SKenneth E. Jansen endTimer(&timer_end); 815*59599516SKenneth E. Jansen printPerf("finalizempiio", timer_start, timer_end, 0, 0, ""); 816*59599516SKenneth E. Jansen 817*59599516SKenneth E. Jansen PhastaIONextActiveIndex--; 818*59599516SKenneth E. Jansen } 819*59599516SKenneth E. Jansen 820*59599516SKenneth E. Jansen 821*59599516SKenneth E. Jansen /** 822*59599516SKenneth E. Jansen * Special init for M2N in order to create a subcommunicator for the reduced solution (requires PRINT_PERF to be false for now) 823*59599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct buffers. 824*59599516SKenneth E. Jansen * 825*59599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 826*59599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 827*59599516SKenneth E. Jansen */ 828*59599516SKenneth E. Jansen int initphmpiiosub( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[],MPI_Comm my_local_comm) 829*59599516SKenneth E. Jansen { 830*59599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 831*59599516SKenneth E. Jansen 832*59599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &irank); 833*59599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &mysize); 834*59599516SKenneth E. Jansen 835*59599516SKenneth E. Jansen phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 836*59599516SKenneth E. Jansen 837*59599516SKenneth E. Jansen double timer_start, timer_end; 838*59599516SKenneth E. Jansen startTimer(&timer_start); 839*59599516SKenneth E. Jansen 840*59599516SKenneth E. Jansen char* imode = StringStripper( mode ); 841*59599516SKenneth E. Jansen 842*59599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 843*59599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 844*59599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 845*59599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 846*59599516SKenneth E. Jansen // do nothing 847*59599516SKenneth E. Jansen } 848*59599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 849*59599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 850*59599516SKenneth E. Jansen } 851*59599516SKenneth E. Jansen else { 852*59599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 853*59599516SKenneth E. Jansen exit(1); 854*59599516SKenneth E. Jansen } 855*59599516SKenneth E. Jansen free ( imode ); 856*59599516SKenneth E. Jansen 857*59599516SKenneth E. Jansen phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 858*59599516SKenneth E. Jansen 859*59599516SKenneth E. Jansen int i, j; 860*59599516SKenneth E. Jansen 861*59599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 862*59599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 863*59599516SKenneth E. Jansen endTimer(&timer_end); 864*59599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 865*59599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 866*59599516SKenneth E. Jansen } 867*59599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 868*59599516SKenneth E. Jansen // { 869*59599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 870*59599516SKenneth E. Jansen // { 871*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 872*59599516SKenneth E. Jansen // } 873*59599516SKenneth E. Jansen // } 874*59599516SKenneth E. Jansen 875*59599516SKenneth E. Jansen 876*59599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 877*59599516SKenneth E. Jansen //PhastaIOActiveFiles[PhastaIONextActiveIndex] = ( phastaio_file_t *)calloc( 1 + 1, sizeof( phastaio_file_t ) ); 878*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[PhastaIONextActiveIndex]; 879*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 880*59599516SKenneth E. Jansen // PhastaIOActiveFiles[PhastaIONextActiveIndex] += pool_align - (mem_address & (pool_align -1)); 881*59599516SKenneth E. Jansen 882*59599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 883*59599516SKenneth E. Jansen PhastaIONextActiveIndex++; 884*59599516SKenneth E. Jansen 885*59599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 886*59599516SKenneth E. Jansen 887*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 888*59599516SKenneth E. Jansen 889*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 890*59599516SKenneth E. Jansen 891*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 892*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 893*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 894*59599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &(PhastaIOActiveFiles[i]->myrank)); 895*59599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &(PhastaIOActiveFiles[i]->numprocs)); 896*59599516SKenneth E. Jansen 897*59599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 898*59599516SKenneth E. Jansen MPI_Comm_split(my_local_comm, 899*59599516SKenneth E. Jansen color, 900*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 901*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 902*59599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 903*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 904*59599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 905*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 906*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 907*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 908*59599516SKenneth E. Jansen 909*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 910*59599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 911*59599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 912*59599516SKenneth E. Jansen 913*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 914*59599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 915*59599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof(unsigned long long *) ); 916*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table; 917*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 918*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table += pool_align - (mem_address & (pool_align -1)); 919*59599516SKenneth E. Jansen 920*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 921*59599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 922*59599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof( unsigned long long *) ); 923*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table; 924*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 925*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table += pool_align - (mem_address & (pool_align -1)); 926*59599516SKenneth E. Jansen 927*59599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 928*59599516SKenneth E. Jansen { 929*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 930*59599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 931*59599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp + pool_align, sizeof( unsigned long long) ); 932*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table[j]; 933*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 934*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table[j] += pool_align - (mem_address & (pool_align -1)); 935*59599516SKenneth E. Jansen 936*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 937*59599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 938*59599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) + pool_align ); 939*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table[j]; 940*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 941*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table[j] += pool_align - (mem_address & (pool_align -1)); 942*59599516SKenneth E. Jansen } 943*59599516SKenneth E. Jansen *filehandle = i; 944*59599516SKenneth E. Jansen 945*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 946*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 947*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 948*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 949*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 950*59599516SKenneth E. Jansen 951*59599516SKenneth E. Jansen /* 952*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = 953*59599516SKenneth E. Jansen ( char * ) calloc( MasterHeaderSize + pool_align, sizeof( char ) ); 954*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->master_header; 955*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 956*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header += pool_align - (mem_address & (pool_align -1)); 957*59599516SKenneth E. Jansen 958*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = 959*59599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 960*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk; 961*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 962*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1)); 963*59599516SKenneth E. Jansen 964*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = 965*59599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 966*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk; 967*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 968*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & (pool_align -1)); 969*59599516SKenneth E. Jansen 970*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = 971*59599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 972*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_double_chunk; 973*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 974*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk += pool_align - (mem_address & (pool_align -1)); 975*59599516SKenneth E. Jansen 976*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = 977*59599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 978*59599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_int_chunk; 979*59599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 980*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk += pool_align - (mem_address & (pool_align -1)); 981*59599516SKenneth E. Jansen */ 982*59599516SKenneth E. Jansen 983*59599516SKenneth E. Jansen // Time monitoring 984*59599516SKenneth E. Jansen endTimer(&timer_end); 985*59599516SKenneth E. Jansen printPerf("initphmpiiosub", timer_start, timer_end, 0, 0, ""); 986*59599516SKenneth E. Jansen 987*59599516SKenneth E. Jansen phprintf_0("Info initphmpiiosub: quiting function"); 988*59599516SKenneth E. Jansen 989*59599516SKenneth E. Jansen return i; 990*59599516SKenneth E. Jansen } 991*59599516SKenneth E. Jansen 992*59599516SKenneth E. Jansen 993*59599516SKenneth E. Jansen 994*59599516SKenneth E. Jansen /** open file for both POSIX and MPI-IO syncIO format. 995*59599516SKenneth E. Jansen * 996*59599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fopen(). 997*59599516SKenneth E. Jansen * 998*59599516SKenneth E. Jansen * If it's MPI-IO foramt: 999*59599516SKenneth E. Jansen * in "read" mode, it builds the header table that points to the offset of 1000*59599516SKenneth E. Jansen * fields for parts; 1001*59599516SKenneth E. Jansen * in "write" mode, it opens the file with MPI-IO open routine. 1002*59599516SKenneth E. Jansen */ 1003*59599516SKenneth E. Jansen void openfile(const char filename[], 1004*59599516SKenneth E. Jansen const char mode[], 1005*59599516SKenneth E. Jansen int* fileDescriptor ) 1006*59599516SKenneth E. Jansen { 1007*59599516SKenneth E. Jansen phprintf_0("Info: entering openfile"); 1008*59599516SKenneth E. Jansen 1009*59599516SKenneth E. Jansen double timer_start, timer_end; 1010*59599516SKenneth E. Jansen startTimer(&timer_start); 1011*59599516SKenneth E. Jansen 1012*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) 1013*59599516SKenneth E. Jansen { 1014*59599516SKenneth E. Jansen FILE* file=NULL ; 1015*59599516SKenneth E. Jansen *fileDescriptor = 0; 1016*59599516SKenneth E. Jansen char* fname = StringStripper( filename ); 1017*59599516SKenneth E. Jansen char* imode = StringStripper( mode ); 1018*59599516SKenneth E. Jansen 1019*59599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) file = fopen(fname, "rb" ); 1020*59599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) file = fopen(fname, "wb" ); 1021*59599516SKenneth E. Jansen else if( cscompare( "append", imode ) ) file = fopen(fname, "ab" ); 1022*59599516SKenneth E. Jansen 1023*59599516SKenneth E. Jansen if ( !file ){ 1024*59599516SKenneth E. Jansen fprintf(stderr,"Error openfile: unable to open file %s",fname ) ; 1025*59599516SKenneth E. Jansen } else { 1026*59599516SKenneth E. Jansen fileArray.push_back( file ); 1027*59599516SKenneth E. Jansen byte_order.push_back( false ); 1028*59599516SKenneth E. Jansen header_type.push_back( sizeof(int) ); 1029*59599516SKenneth E. Jansen *fileDescriptor = fileArray.size(); 1030*59599516SKenneth E. Jansen } 1031*59599516SKenneth E. Jansen free (fname); 1032*59599516SKenneth E. Jansen free (imode); 1033*59599516SKenneth E. Jansen } 1034*59599516SKenneth E. Jansen else // else it would be parallel I/O, opposed to posix io 1035*59599516SKenneth E. Jansen { 1036*59599516SKenneth E. Jansen char* fname = StringStripper( filename ); 1037*59599516SKenneth E. Jansen char* imode = StringStripper( mode ); 1038*59599516SKenneth E. Jansen int rc; 1039*59599516SKenneth E. Jansen int i = *fileDescriptor; 1040*59599516SKenneth E. Jansen checkFileDescriptor("openfile",&i); 1041*59599516SKenneth E. Jansen char* token; 1042*59599516SKenneth E. Jansen 1043*59599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) 1044*59599516SKenneth E. Jansen { 1045*59599516SKenneth E. Jansen // if (PhastaIOActiveFiles[i]->myrank == 0) 1046*59599516SKenneth E. Jansen // printf("\n **********\nRead open ... ... regular version\n"); 1047*59599516SKenneth E. Jansen 1048*59599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 1049*59599516SKenneth E. Jansen fname, 1050*59599516SKenneth E. Jansen MPI_MODE_RDONLY, 1051*59599516SKenneth E. Jansen MPI_INFO_NULL, 1052*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 1053*59599516SKenneth E. Jansen 1054*59599516SKenneth E. Jansen if(rc) 1055*59599516SKenneth E. Jansen { 1056*59599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 1057*59599516SKenneth E. Jansen printf("Error openfile: Unable to open file %s! File descriptor = %d\n",fname,*fileDescriptor); 1058*59599516SKenneth E. Jansen endTimer(&timer_end); 1059*59599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 1060*59599516SKenneth E. Jansen return; 1061*59599516SKenneth E. Jansen } 1062*59599516SKenneth E. Jansen 1063*59599516SKenneth E. Jansen MPI_Status read_tag_status; 1064*59599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 1065*59599516SKenneth E. Jansen int j; 1066*59599516SKenneth E. Jansen int magic_number; 1067*59599516SKenneth E. Jansen 1068*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 1069*59599516SKenneth E. Jansen MPI_File_read_at( PhastaIOActiveFiles[i]->file_handle, 1070*59599516SKenneth E. Jansen 0, 1071*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 1072*59599516SKenneth E. Jansen MasterHeaderSize, 1073*59599516SKenneth E. Jansen MPI_CHAR, 1074*59599516SKenneth E. Jansen &read_tag_status ); 1075*59599516SKenneth E. Jansen } 1076*59599516SKenneth E. Jansen 1077*59599516SKenneth E. Jansen MPI_Bcast( PhastaIOActiveFiles[i]->master_header, 1078*59599516SKenneth E. Jansen MasterHeaderSize, 1079*59599516SKenneth E. Jansen MPI_CHAR, 1080*59599516SKenneth E. Jansen 0, 1081*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 1082*59599516SKenneth E. Jansen 1083*59599516SKenneth E. Jansen memcpy( read_out_tag, 1084*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 1085*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 1086*59599516SKenneth E. Jansen 1087*59599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) 1088*59599516SKenneth E. Jansen { 1089*59599516SKenneth E. Jansen // Test endianess ... 1090*59599516SKenneth E. Jansen memcpy ( &magic_number, 1091*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 1092*59599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 1093*59599516SKenneth E. Jansen 1094*59599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 1095*59599516SKenneth E. Jansen { 1096*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = true; 1097*59599516SKenneth E. Jansen } 1098*59599516SKenneth E. Jansen 1099*59599516SKenneth E. Jansen memcpy( read_out_tag, 1100*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH+1, // TODO: WHY +1??? 1101*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); 1102*59599516SKenneth E. Jansen 1103*59599516SKenneth E. Jansen // Read in # fields ... 1104*59599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 1105*59599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 1106*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = atoi( token ); 1107*59599516SKenneth E. Jansen 1108*59599516SKenneth E. Jansen unsigned long long **header_table; 1109*59599516SKenneth E. Jansen header_table = ( unsigned long long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long long *)); 1110*59599516SKenneth E. Jansen //header_table = ( unsigned long long ** ) calloc( PhastaIOActiveFiles[i]->nFields + pool_align, sizeof(unsigned long long *)); 1111*59599516SKenneth E. Jansen //mem_address = (long long )header_table; 1112*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1113*59599516SKenneth E. Jansen // header_table += pool_align - (mem_address & (pool_align -1)); 1114*59599516SKenneth E. Jansen 1115*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 1116*59599516SKenneth E. Jansen { 1117*59599516SKenneth E. Jansen header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long long)); 1118*59599516SKenneth E. Jansen //header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF + pool_align, sizeof(unsigned long long *)); 1119*59599516SKenneth E. Jansen //mem_address = (long long )header_table[j]; 1120*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1121*59599516SKenneth E. Jansen // header_table[j] += pool_align - (mem_address & (pool_align -1)); 1122*59599516SKenneth E. Jansen } 1123*59599516SKenneth E. Jansen 1124*59599516SKenneth E. Jansen // Read in the offset table ... 1125*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 1126*59599516SKenneth E. Jansen { 1127*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 1128*59599516SKenneth E. Jansen memcpy( header_table[j], 1129*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + 1130*59599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 1131*59599516SKenneth E. Jansen j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long), 1132*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long) ); 1133*59599516SKenneth E. Jansen } 1134*59599516SKenneth E. Jansen 1135*59599516SKenneth E. Jansen MPI_Scatter( header_table[j], 1136*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 1137*59599516SKenneth E. Jansen MPI_LONG_LONG_INT, 1138*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j], 1139*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 1140*59599516SKenneth E. Jansen MPI_LONG_LONG_INT, 1141*59599516SKenneth E. Jansen 0, 1142*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 1143*59599516SKenneth E. Jansen 1144*59599516SKenneth E. Jansen // Swap byte order if endianess is different ... 1145*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) { 1146*59599516SKenneth E. Jansen SwapArrayByteOrder( PhastaIOActiveFiles[i]->my_read_table[j], 1147*59599516SKenneth E. Jansen sizeof(long long int), 1148*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ); 1149*59599516SKenneth E. Jansen } 1150*59599516SKenneth E. Jansen } 1151*59599516SKenneth E. Jansen 1152*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 1153*59599516SKenneth E. Jansen free ( header_table[j] ); 1154*59599516SKenneth E. Jansen } 1155*59599516SKenneth E. Jansen free (header_table); 1156*59599516SKenneth E. Jansen 1157*59599516SKenneth E. Jansen } // end of if MPI_IO_TAG 1158*59599516SKenneth E. Jansen else //else not valid MPI file 1159*59599516SKenneth E. Jansen { 1160*59599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 1161*59599516SKenneth E. Jansen printf("Error openfile: The file %s you opened is not in syncIO new format, please check again! File descriptor = %d, MasterHeaderSize = %d, read_out_tag = %s\n",fname,*fileDescriptor,MasterHeaderSize,read_out_tag); 1162*59599516SKenneth E. Jansen //Printing MasterHeaderSize is useful to test a compiler bug on Intrepid BGP 1163*59599516SKenneth E. Jansen endTimer(&timer_end); 1164*59599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 1165*59599516SKenneth E. Jansen return; 1166*59599516SKenneth E. Jansen } 1167*59599516SKenneth E. Jansen } // end of if "read" 1168*59599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) 1169*59599516SKenneth E. Jansen { 1170*59599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 1171*59599516SKenneth E. Jansen fname, 1172*59599516SKenneth E. Jansen MPI_MODE_WRONLY | MPI_MODE_CREATE, 1173*59599516SKenneth E. Jansen MPI_INFO_NULL, 1174*59599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 1175*59599516SKenneth E. Jansen if(rc) 1176*59599516SKenneth E. Jansen { 1177*59599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 1178*59599516SKenneth E. Jansen return; 1179*59599516SKenneth E. Jansen } 1180*59599516SKenneth E. Jansen } // end of if "write" 1181*59599516SKenneth E. Jansen free (fname); 1182*59599516SKenneth E. Jansen free (imode); 1183*59599516SKenneth E. Jansen } // end of if FileIndex != 0 1184*59599516SKenneth E. Jansen 1185*59599516SKenneth E. Jansen endTimer(&timer_end); 1186*59599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 1187*59599516SKenneth E. Jansen } 1188*59599516SKenneth E. Jansen 1189*59599516SKenneth E. Jansen /** close file for both POSIX and MPI-IO syncIO format. 1190*59599516SKenneth E. Jansen * 1191*59599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fclose(). 1192*59599516SKenneth E. Jansen * 1193*59599516SKenneth E. Jansen * If it's MPI-IO foramt: 1194*59599516SKenneth E. Jansen * in "read" mode, it simply close file with MPI-IO close routine. 1195*59599516SKenneth E. Jansen * in "write" mode, rank 0 in each group will re-assemble the master header and 1196*59599516SKenneth E. Jansen * offset table and write to the beginning of file, then close the file. 1197*59599516SKenneth E. Jansen */ 1198*59599516SKenneth E. Jansen void closefile( int* fileDescriptor, 1199*59599516SKenneth E. Jansen const char mode[] ) 1200*59599516SKenneth E. Jansen { 1201*59599516SKenneth E. Jansen double timer_start, timer_end; 1202*59599516SKenneth E. Jansen startTimer(&timer_start); 1203*59599516SKenneth E. Jansen 1204*59599516SKenneth E. Jansen int i = *fileDescriptor; 1205*59599516SKenneth E. Jansen checkFileDescriptor("closefile",&i); 1206*59599516SKenneth E. Jansen 1207*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 1208*59599516SKenneth E. Jansen char* imode = StringStripper( mode ); 1209*59599516SKenneth E. Jansen 1210*59599516SKenneth E. Jansen if( cscompare( "write", imode ) 1211*59599516SKenneth E. Jansen || cscompare( "append", imode ) ) { 1212*59599516SKenneth E. Jansen fflush( fileArray[ *fileDescriptor - 1 ] ); 1213*59599516SKenneth E. Jansen } 1214*59599516SKenneth E. Jansen 1215*59599516SKenneth E. Jansen fclose( fileArray[ *fileDescriptor - 1 ] ); 1216*59599516SKenneth E. Jansen free (imode); 1217*59599516SKenneth E. Jansen } 1218*59599516SKenneth E. Jansen else { 1219*59599516SKenneth E. Jansen char* imode = StringStripper( mode ); 1220*59599516SKenneth E. Jansen 1221*59599516SKenneth E. Jansen //write master header here: 1222*59599516SKenneth E. Jansen if ( cscompare( "write", imode ) ) { 1223*59599516SKenneth E. Jansen // if ( PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields < 2*ONE_MEGABYTE/8 ) //SHOULD BE CHECKED 1224*59599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE; 1225*59599516SKenneth E. Jansen // else 1226*59599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE + PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields * 8 - 2*ONE_MEGABYTE; 1227*59599516SKenneth E. Jansen 1228*59599516SKenneth E. Jansen MasterHeaderSize = computeMHSize( PhastaIOActiveFiles[i]->nFields, PhastaIOActiveFiles[i]->nPPF, LATEST_WRITE_VERSION); 1229*59599516SKenneth E. Jansen phprintf_0("Info closefile: myrank = %d, MasterHeaderSize = %d\n", PhastaIOActiveFiles[i]->myrank, MasterHeaderSize); 1230*59599516SKenneth E. Jansen 1231*59599516SKenneth E. Jansen MPI_Status write_header_status; 1232*59599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 1233*59599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 1234*59599516SKenneth E. Jansen char mhsize[MAX_FIELDS_NAME_LENGTH/4]; 1235*59599516SKenneth E. Jansen int magic_number = ENDIAN_TEST_NUMBER; 1236*59599516SKenneth E. Jansen 1237*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) 1238*59599516SKenneth E. Jansen { 1239*59599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 1240*59599516SKenneth E. Jansen sprintf(mpi_tag, "MPI_IO_Tag : "); 1241*59599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header, 1242*59599516SKenneth E. Jansen mpi_tag, 1243*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 1244*59599516SKenneth E. Jansen 1245*59599516SKenneth E. Jansen bzero((void*)version,MAX_FIELDS_NAME_LENGTH/4); 1246*59599516SKenneth E. Jansen // this version is "1", print version in ASCII 1247*59599516SKenneth E. Jansen sprintf(version, "version : %d",1); 1248*59599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/2, 1249*59599516SKenneth E. Jansen version, 1250*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 1251*59599516SKenneth E. Jansen 1252*59599516SKenneth E. Jansen // master header size is computed using the formula above 1253*59599516SKenneth E. Jansen bzero((void*)mhsize,MAX_FIELDS_NAME_LENGTH/4); 1254*59599516SKenneth E. Jansen sprintf(mhsize, "mhsize : "); 1255*59599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/4*3, 1256*59599516SKenneth E. Jansen mhsize, 1257*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 1258*59599516SKenneth E. Jansen 1259*59599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 1260*59599516SKenneth E. Jansen sprintf(mpi_tag, 1261*59599516SKenneth E. Jansen "\nnFields : %d\n", 1262*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields); 1263*59599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH, 1264*59599516SKenneth E. Jansen mpi_tag, 1265*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 1266*59599516SKenneth E. Jansen 1267*59599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 1268*59599516SKenneth E. Jansen sprintf(mpi_tag, "\nnPPF : %d\n", PhastaIOActiveFiles[i]->nPPF); 1269*59599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+ 1270*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields * 1271*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 1272*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 1273*59599516SKenneth E. Jansen mpi_tag, 1274*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 1275*59599516SKenneth E. Jansen 1276*59599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 1277*59599516SKenneth E. Jansen &magic_number, 1278*59599516SKenneth E. Jansen sizeof(int)); 1279*59599516SKenneth E. Jansen 1280*59599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("mhsize : ") -1 + MAX_FIELDS_NAME_LENGTH/4*3, 1281*59599516SKenneth E. Jansen &MasterHeaderSize, 1282*59599516SKenneth E. Jansen sizeof(int)); 1283*59599516SKenneth E. Jansen } 1284*59599516SKenneth E. Jansen 1285*59599516SKenneth E. Jansen int j = 0; 1286*59599516SKenneth E. Jansen unsigned long long **header_table; 1287*59599516SKenneth E. Jansen header_table = ( unsigned long long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long long *)); 1288*59599516SKenneth E. Jansen //header_table = ( unsigned long long ** ) calloc( PhastaIOActiveFiles[i]->nFields + pool_align, sizeof(unsigned long long *)); 1289*59599516SKenneth E. Jansen //mem_address = (long long )header_table; 1290*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1291*59599516SKenneth E. Jansen // header_table += pool_align - (mem_address & (pool_align -1)); 1292*59599516SKenneth E. Jansen 1293*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 1294*59599516SKenneth E. Jansen header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long long)); 1295*59599516SKenneth E. Jansen //header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF + pool_align, sizeof (unsigned long long *)); 1296*59599516SKenneth E. Jansen //mem_address = (long long )header_table[j]; 1297*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1298*59599516SKenneth E. Jansen // header_table[j] += pool_align - (mem_address & (pool_align - 1)); 1299*59599516SKenneth E. Jansen } 1300*59599516SKenneth E. Jansen 1301*59599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna mpi_gather, myrank = %d\n", irank); 1302*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 1303*59599516SKenneth E. Jansen MPI_Gather( PhastaIOActiveFiles[i]->my_offset_table[j], 1304*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 1305*59599516SKenneth E. Jansen MPI_LONG_LONG_INT, 1306*59599516SKenneth E. Jansen header_table[j], 1307*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 1308*59599516SKenneth E. Jansen MPI_LONG_LONG_INT, 1309*59599516SKenneth E. Jansen 0, 1310*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 1311*59599516SKenneth E. Jansen } 1312*59599516SKenneth E. Jansen 1313*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 1314*59599516SKenneth E. Jansen 1315*59599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna memcpy for every procs, myrank = %d\n", irank); 1316*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 1317*59599516SKenneth E. Jansen memcpy ( PhastaIOActiveFiles[i]->master_header + 1318*59599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 1319*59599516SKenneth E. Jansen j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long), 1320*59599516SKenneth E. Jansen header_table[j], 1321*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long) ); 1322*59599516SKenneth E. Jansen } 1323*59599516SKenneth E. Jansen 1324*59599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_write_at(), myrank = %d\n", irank); 1325*59599516SKenneth E. Jansen MPI_File_write_at( PhastaIOActiveFiles[i]->file_handle, 1326*59599516SKenneth E. Jansen 0, 1327*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 1328*59599516SKenneth E. Jansen MasterHeaderSize, 1329*59599516SKenneth E. Jansen MPI_CHAR, 1330*59599516SKenneth E. Jansen &write_header_status ); 1331*59599516SKenneth E. Jansen } 1332*59599516SKenneth E. Jansen 1333*59599516SKenneth E. Jansen ////free(PhastaIOActiveFiles[i]->master_header); 1334*59599516SKenneth E. Jansen 1335*59599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 1336*59599516SKenneth E. Jansen free ( header_table[j] ); 1337*59599516SKenneth E. Jansen } 1338*59599516SKenneth E. Jansen free (header_table); 1339*59599516SKenneth E. Jansen } 1340*59599516SKenneth E. Jansen 1341*59599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_close(), myrank = %d\n", irank); 1342*59599516SKenneth E. Jansen MPI_File_close( &( PhastaIOActiveFiles[i]->file_handle ) ); 1343*59599516SKenneth E. Jansen free ( imode ); 1344*59599516SKenneth E. Jansen } 1345*59599516SKenneth E. Jansen 1346*59599516SKenneth E. Jansen endTimer(&timer_end); 1347*59599516SKenneth E. Jansen printPerf("closefile_", timer_start, timer_end, 0, 0, ""); 1348*59599516SKenneth E. Jansen } 1349*59599516SKenneth E. Jansen 1350*59599516SKenneth E. Jansen void readheader( int* fileDescriptor, 1351*59599516SKenneth E. Jansen const char keyphrase[], 1352*59599516SKenneth E. Jansen void* valueArray, 1353*59599516SKenneth E. Jansen int* nItems, 1354*59599516SKenneth E. Jansen const char datatype[], 1355*59599516SKenneth E. Jansen const char iotype[] ) 1356*59599516SKenneth E. Jansen { 1357*59599516SKenneth E. Jansen double timer_start, timer_end; 1358*59599516SKenneth E. Jansen //MPI_Comm_rank(MPI_COMM_WORLD, &irank); //This should not be required if irank is indeed a global variable. irank should be initialized by either query and/or init 1359*59599516SKenneth E. Jansen //if(irank == 0) printf("entering readheader() - %s\n", keyphrase); 1360*59599516SKenneth E. Jansen startTimer(&timer_start); 1361*59599516SKenneth E. Jansen 1362*59599516SKenneth E. Jansen int i = *fileDescriptor; 1363*59599516SKenneth E. Jansen checkFileDescriptor("readheader",&i); 1364*59599516SKenneth E. Jansen 1365*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 1366*59599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 1367*59599516SKenneth E. Jansen FILE* fileObject; 1368*59599516SKenneth E. Jansen int* valueListInt; 1369*59599516SKenneth E. Jansen 1370*59599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 1371*59599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 1372*59599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 1373*59599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 1374*59599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 1375*59599516SKenneth E. Jansen endTimer(&timer_end); 1376*59599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 1377*59599516SKenneth E. Jansen return; 1378*59599516SKenneth E. Jansen } 1379*59599516SKenneth E. Jansen 1380*59599516SKenneth E. Jansen LastHeaderKey[ filePtr ] = const_cast< char* >( keyphrase ); 1381*59599516SKenneth E. Jansen LastHeaderNotFound = false; 1382*59599516SKenneth E. Jansen 1383*59599516SKenneth E. Jansen fileObject = fileArray[ filePtr ] ; 1384*59599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 1385*59599516SKenneth E. Jansen 1386*59599516SKenneth E. Jansen isBinary( iotype ); 1387*59599516SKenneth E. Jansen typeSize( datatype ); //redundant call, just avoid a compiler warning. 1388*59599516SKenneth E. Jansen 1389*59599516SKenneth E. Jansen // right now we are making the assumption that we will only write integers 1390*59599516SKenneth E. Jansen // on the header line. 1391*59599516SKenneth E. Jansen 1392*59599516SKenneth E. Jansen valueListInt = static_cast< int* >( valueArray ); 1393*59599516SKenneth E. Jansen int ierr = readHeader( fileObject , 1394*59599516SKenneth E. Jansen keyphrase, 1395*59599516SKenneth E. Jansen valueListInt, 1396*59599516SKenneth E. Jansen *nItems ) ; 1397*59599516SKenneth E. Jansen 1398*59599516SKenneth E. Jansen byte_order[ filePtr ] = Wrong_Endian ; 1399*59599516SKenneth E. Jansen 1400*59599516SKenneth E. Jansen if ( ierr ) LastHeaderNotFound = true; 1401*59599516SKenneth E. Jansen 1402*59599516SKenneth E. Jansen //return ; // don't return, go to the end to print perf 1403*59599516SKenneth E. Jansen } 1404*59599516SKenneth E. Jansen else { 1405*59599516SKenneth E. Jansen unsigned int skip_size; 1406*59599516SKenneth E. Jansen int* valueListInt; 1407*59599516SKenneth E. Jansen valueListInt = static_cast <int*>(valueArray); 1408*59599516SKenneth E. Jansen char* token; 1409*59599516SKenneth E. Jansen bool FOUND = false ; 1410*59599516SKenneth E. Jansen isBinary( iotype ); 1411*59599516SKenneth E. Jansen 1412*59599516SKenneth E. Jansen MPI_Status read_offset_status; 1413*59599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 1414*59599516SKenneth E. Jansen char readouttag[MAX_FIELDS_NUMBER][MAX_FIELDS_NAME_LENGTH]; 1415*59599516SKenneth E. Jansen int j; 1416*59599516SKenneth E. Jansen 1417*59599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 1418*59599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 1419*59599516SKenneth E. Jansen //char* buffer = ( char * ) malloc( string_length + 1 + pool_align ); 1420*59599516SKenneth E. Jansen //mem_address = (long long )buffer; 1421*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1422*59599516SKenneth E. Jansen // buffer += pool_align - (mem_address & (pool_align -1)); 1423*59599516SKenneth E. Jansen 1424*59599516SKenneth E. Jansen strcpy ( buffer, keyphrase ); 1425*59599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 1426*59599516SKenneth E. Jansen 1427*59599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 1428*59599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 1429*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 1430*59599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 1431*59599516SKenneth E. Jansen *p = '\0'; 1432*59599516SKenneth E. Jansen 1433*59599516SKenneth E. Jansen // Check if the user has input the right GPid 1434*59599516SKenneth E. Jansen if ( ( PhastaIOActiveFiles[i]->GPid <= 1435*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * 1436*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp )|| 1437*59599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->GPid > 1438*59599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->myrank + 1 ) * 1439*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ) ) 1440*59599516SKenneth E. Jansen { 1441*59599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 1442*59599516SKenneth E. Jansen printf("Error readheader: The file is not in syncIO new format, please check! myrank = %d, GPid = %d, nppp = %d, keyphrase = %s\n", PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->GPid, PhastaIOActiveFiles[i]->nppp, keyphrase); 1443*59599516SKenneth E. Jansen // It is possible atoi could not generate a clear integer from st2 because of additional garbage character in keyphrase 1444*59599516SKenneth E. Jansen endTimer(&timer_end); 1445*59599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 1446*59599516SKenneth E. Jansen return; 1447*59599516SKenneth E. Jansen } 1448*59599516SKenneth E. Jansen 1449*59599516SKenneth E. Jansen // Find the field we want ... 1450*59599516SKenneth E. Jansen //for ( j = 0; j<MAX_FIELDS_NUMBER; j++ ) 1451*59599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 1452*59599516SKenneth E. Jansen { 1453*59599516SKenneth E. Jansen memcpy( readouttag[j], 1454*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + j*MAX_FIELDS_NAME_LENGTH+MAX_FIELDS_NAME_LENGTH*2+1, 1455*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 1456*59599516SKenneth E. Jansen } 1457*59599516SKenneth E. Jansen 1458*59599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 1459*59599516SKenneth E. Jansen { 1460*59599516SKenneth E. Jansen token = strtok ( readouttag[j], ":" ); 1461*59599516SKenneth E. Jansen 1462*59599516SKenneth E. Jansen //if ( cscompare( buffer, token ) ) 1463*59599516SKenneth E. Jansen if ( cscompare( token , buffer ) && cscompare( buffer, token ) ) 1464*59599516SKenneth E. Jansen // This double comparison is required for the field "number of nodes" and all the other fields that start with "number of nodes" (i.g. number of nodes in the mesh"). 1465*59599516SKenneth E. Jansen // Would be safer to rename "number of nodes" by "number of nodes in the part" so that the name are completely unique. But much more work to do that (Nspre, phParAdapt, etc). 1466*59599516SKenneth E. Jansen // Since the field name are unique in SyncIO (as it includes part ID), this should be safe and there should be no issue with the "?" trailing character. 1467*59599516SKenneth E. Jansen { 1468*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_field_count = j; 1469*59599516SKenneth E. Jansen FOUND = true; 1470*59599516SKenneth E. Jansen //printf("buffer: %s | token: %s | j: %d\n",buffer,token,j); 1471*59599516SKenneth E. Jansen break; 1472*59599516SKenneth E. Jansen } 1473*59599516SKenneth E. Jansen } 1474*59599516SKenneth E. Jansen free(buffer); 1475*59599516SKenneth E. Jansen 1476*59599516SKenneth E. Jansen if (!FOUND) 1477*59599516SKenneth E. Jansen { 1478*59599516SKenneth E. Jansen //if(irank==0) printf("Warning readheader: Not found %s \n",keyphrase); //PhastaIOActiveFiles[i]->myrank is certainly initialized here. 1479*59599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) printf("WARNING readheader: Not found %s\n",keyphrase); 1480*59599516SKenneth E. Jansen endTimer(&timer_end); 1481*59599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 1482*59599516SKenneth E. Jansen return; 1483*59599516SKenneth E. Jansen } 1484*59599516SKenneth E. Jansen 1485*59599516SKenneth E. Jansen // Find the part we want ... 1486*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_part_count = PhastaIOActiveFiles[i]->GPid - 1487*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * PhastaIOActiveFiles[i]->nppp - 1; 1488*59599516SKenneth E. Jansen 1489*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = 1490*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[PhastaIOActiveFiles[i]->read_field_count][PhastaIOActiveFiles[i]->read_part_count]; 1491*59599516SKenneth E. Jansen 1492*59599516SKenneth E. Jansen // printf("****Rank %d offset is %d\n",PhastaIOActiveFiles[i]->myrank,PhastaIOActiveFiles[i]->my_offset); 1493*59599516SKenneth E. Jansen 1494*59599516SKenneth E. Jansen // Read each datablock header here ... 1495*59599516SKenneth E. Jansen 1496*59599516SKenneth E. Jansen MPI_File_read_at_all( PhastaIOActiveFiles[i]->file_handle, 1497*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset+1, 1498*59599516SKenneth E. Jansen read_out_tag, 1499*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1, 1500*59599516SKenneth E. Jansen MPI_CHAR, 1501*59599516SKenneth E. Jansen &read_offset_status ); 1502*59599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 1503*59599516SKenneth E. Jansen 1504*59599516SKenneth E. Jansen // printf("&&&&Rank %d read_out_tag is %s\n",PhastaIOActiveFiles[i]->myrank,read_out_tag); 1505*59599516SKenneth E. Jansen 1506*59599516SKenneth E. Jansen if( cscompare( keyphrase , token ) ) //No need to compare also token with keyphrase like above. We should already have the right one. Otherwise there is a problem. 1507*59599516SKenneth E. Jansen { 1508*59599516SKenneth E. Jansen FOUND = true ; 1509*59599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 1510*59599516SKenneth E. Jansen skip_size = atoi( token ); 1511*59599516SKenneth E. Jansen for( j=0; j < *nItems && ( token = strtok( NULL," ,;<>") ); j++ ) 1512*59599516SKenneth E. Jansen valueListInt[j] = atoi( token ); 1513*59599516SKenneth E. Jansen 1514*59599516SKenneth E. Jansen if ( j < *nItems ) 1515*59599516SKenneth E. Jansen { 1516*59599516SKenneth E. Jansen fprintf( stderr, "Expected # of ints not found for: %s\n", keyphrase ); 1517*59599516SKenneth E. Jansen } 1518*59599516SKenneth E. Jansen } 1519*59599516SKenneth E. Jansen else { 1520*59599516SKenneth E. Jansen //if(irank==0) 1521*59599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) 1522*59599516SKenneth E. Jansen // If we enter this if, there is a problem with the name of some fields 1523*59599516SKenneth E. Jansen { 1524*59599516SKenneth E. Jansen printf("Error readheader: Unexpected mismatch between keyphrase = %s and token = %s\n",keyphrase,token); 1525*59599516SKenneth E. Jansen } 1526*59599516SKenneth E. Jansen } 1527*59599516SKenneth E. Jansen } 1528*59599516SKenneth E. Jansen 1529*59599516SKenneth E. Jansen endTimer(&timer_end); 1530*59599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 1531*59599516SKenneth E. Jansen 1532*59599516SKenneth E. Jansen } 1533*59599516SKenneth E. Jansen 1534*59599516SKenneth E. Jansen void readdatablock( int* fileDescriptor, 1535*59599516SKenneth E. Jansen const char keyphrase[], 1536*59599516SKenneth E. Jansen void* valueArray, 1537*59599516SKenneth E. Jansen int* nItems, 1538*59599516SKenneth E. Jansen const char datatype[], 1539*59599516SKenneth E. Jansen const char iotype[] ) 1540*59599516SKenneth E. Jansen { 1541*59599516SKenneth E. Jansen 1542*59599516SKenneth E. Jansen //if(irank == 0) printf("entering readdatablock()\n"); 1543*59599516SKenneth E. Jansen unsigned long long data_size = 0; 1544*59599516SKenneth E. Jansen double timer_start, timer_end; 1545*59599516SKenneth E. Jansen startTimer(&timer_start); 1546*59599516SKenneth E. Jansen 1547*59599516SKenneth E. Jansen int i = *fileDescriptor; 1548*59599516SKenneth E. Jansen checkFileDescriptor("readdatablock",&i); 1549*59599516SKenneth E. Jansen 1550*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 1551*59599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 1552*59599516SKenneth E. Jansen FILE* fileObject; 1553*59599516SKenneth E. Jansen char junk; 1554*59599516SKenneth E. Jansen 1555*59599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 1556*59599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 1557*59599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before\n") ; 1558*59599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 1559*59599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 1560*59599516SKenneth E. Jansen endTimer(&timer_end); 1561*59599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 1562*59599516SKenneth E. Jansen return; 1563*59599516SKenneth E. Jansen } 1564*59599516SKenneth E. Jansen 1565*59599516SKenneth E. Jansen // error check.. 1566*59599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 1567*59599516SKenneth E. Jansen // let us check to see that it is actually the case. 1568*59599516SKenneth E. Jansen 1569*59599516SKenneth E. Jansen if ( ! cscompare( LastHeaderKey[ filePtr ], keyphrase ) ) { 1570*59599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 1571*59599516SKenneth E. Jansen fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ] ); 1572*59599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 1573*59599516SKenneth E. Jansen fprintf(stderr, "Please recheck read sequence \n"); 1574*59599516SKenneth E. Jansen if( Strict_Error ) { 1575*59599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 1576*59599516SKenneth E. Jansen endTimer(&timer_end); 1577*59599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 1578*59599516SKenneth E. Jansen return; 1579*59599516SKenneth E. Jansen } 1580*59599516SKenneth E. Jansen } 1581*59599516SKenneth E. Jansen 1582*59599516SKenneth E. Jansen if ( LastHeaderNotFound ) { 1583*59599516SKenneth E. Jansen endTimer(&timer_end); 1584*59599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 1585*59599516SKenneth E. Jansen return; 1586*59599516SKenneth E. Jansen } 1587*59599516SKenneth E. Jansen fileObject = fileArray[ filePtr ]; 1588*59599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 1589*59599516SKenneth E. Jansen 1590*59599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 1591*59599516SKenneth E. Jansen int nUnits = *nItems; 1592*59599516SKenneth E. Jansen isBinary( iotype ); 1593*59599516SKenneth E. Jansen 1594*59599516SKenneth E. Jansen if ( binary_format ) { 1595*59599516SKenneth E. Jansen fread( valueArray, type_size, nUnits, fileObject ); 1596*59599516SKenneth E. Jansen fread( &junk, sizeof(char), 1 , fileObject ); 1597*59599516SKenneth E. Jansen if ( Wrong_Endian ) SwapArrayByteOrder( valueArray, type_size, nUnits ); 1598*59599516SKenneth E. Jansen } else { 1599*59599516SKenneth E. Jansen 1600*59599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 1601*59599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 1602*59599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 1603*59599516SKenneth E. Jansen fscanf(fileObject, "%d\n",(int*)((int*)valueArray+n) ); 1604*59599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 1605*59599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 1606*59599516SKenneth E. Jansen fscanf(fileObject, "%lf\n",(double*)((double*)valueArray+n) ); 1607*59599516SKenneth E. Jansen } 1608*59599516SKenneth E. Jansen free (ts1); 1609*59599516SKenneth E. Jansen } 1610*59599516SKenneth E. Jansen 1611*59599516SKenneth E. Jansen //return; 1612*59599516SKenneth E. Jansen } 1613*59599516SKenneth E. Jansen else { 1614*59599516SKenneth E. Jansen // printf("read data block\n"); 1615*59599516SKenneth E. Jansen MPI_Status read_data_status; 1616*59599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 1617*59599516SKenneth E. Jansen int nUnits = *nItems; 1618*59599516SKenneth E. Jansen isBinary( iotype ); 1619*59599516SKenneth E. Jansen 1620*59599516SKenneth E. Jansen // read datablock then 1621*59599516SKenneth E. Jansen //MR CHANGE 1622*59599516SKenneth E. Jansen // if ( cscompare ( datatype, "double")) 1623*59599516SKenneth E. Jansen char* ts2 = StringStripper( datatype ); 1624*59599516SKenneth E. Jansen if ( cscompare ( "double" , ts2)) 1625*59599516SKenneth E. Jansen //MR CHANGE END 1626*59599516SKenneth E. Jansen { 1627*59599516SKenneth E. Jansen 1628*59599516SKenneth E. Jansen MPI_File_read_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 1629*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 1630*59599516SKenneth E. Jansen valueArray, 1631*59599516SKenneth E. Jansen nUnits, 1632*59599516SKenneth E. Jansen MPI_DOUBLE ); 1633*59599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 1634*59599516SKenneth E. Jansen valueArray, 1635*59599516SKenneth E. Jansen &read_data_status ); 1636*59599516SKenneth E. Jansen data_size=8*nUnits; 1637*59599516SKenneth E. Jansen 1638*59599516SKenneth E. Jansen } 1639*59599516SKenneth E. Jansen //MR CHANGE 1640*59599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 1641*59599516SKenneth E. Jansen else if ( cscompare ( "integer" , ts2)) 1642*59599516SKenneth E. Jansen //MR CHANGE END 1643*59599516SKenneth E. Jansen { 1644*59599516SKenneth E. Jansen MPI_File_read_at_all_begin(PhastaIOActiveFiles[i]->file_handle, 1645*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 1646*59599516SKenneth E. Jansen valueArray, 1647*59599516SKenneth E. Jansen nUnits, 1648*59599516SKenneth E. Jansen MPI_INT ); 1649*59599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 1650*59599516SKenneth E. Jansen valueArray, 1651*59599516SKenneth E. Jansen &read_data_status ); 1652*59599516SKenneth E. Jansen data_size=4*nUnits; 1653*59599516SKenneth E. Jansen } 1654*59599516SKenneth E. Jansen else 1655*59599516SKenneth E. Jansen { 1656*59599516SKenneth E. Jansen *fileDescriptor = DATA_TYPE_ILLEGAL; 1657*59599516SKenneth E. Jansen printf("readdatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 1658*59599516SKenneth E. Jansen endTimer(&timer_end); 1659*59599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 1660*59599516SKenneth E. Jansen return; 1661*59599516SKenneth E. Jansen } 1662*59599516SKenneth E. Jansen free(ts2); 1663*59599516SKenneth E. Jansen 1664*59599516SKenneth E. Jansen 1665*59599516SKenneth E. Jansen // printf("%d Read finishe\n",PhastaIOActiveFiles[i]->myrank); 1666*59599516SKenneth E. Jansen 1667*59599516SKenneth E. Jansen // Swap data byte order if endianess is different ... 1668*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) 1669*59599516SKenneth E. Jansen { 1670*59599516SKenneth E. Jansen SwapArrayByteOrder( valueArray, type_size, nUnits ); 1671*59599516SKenneth E. Jansen } 1672*59599516SKenneth E. Jansen } 1673*59599516SKenneth E. Jansen 1674*59599516SKenneth E. Jansen endTimer(&timer_end); 1675*59599516SKenneth E. Jansen char extra_msg[1024]; 1676*59599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 1677*59599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 1678*59599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 1679*59599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, data_size, 1, extra_msg); 1680*59599516SKenneth E. Jansen free(key); 1681*59599516SKenneth E. Jansen 1682*59599516SKenneth E. Jansen } 1683*59599516SKenneth E. Jansen 1684*59599516SKenneth E. Jansen void writeheader( const int* fileDescriptor, 1685*59599516SKenneth E. Jansen const char keyphrase[], 1686*59599516SKenneth E. Jansen const void* valueArray, 1687*59599516SKenneth E. Jansen const int* nItems, 1688*59599516SKenneth E. Jansen const int* ndataItems, 1689*59599516SKenneth E. Jansen const char datatype[], 1690*59599516SKenneth E. Jansen const char iotype[]) 1691*59599516SKenneth E. Jansen { 1692*59599516SKenneth E. Jansen 1693*59599516SKenneth E. Jansen //if(irank == 0) printf("entering writeheader()\n"); 1694*59599516SKenneth E. Jansen 1695*59599516SKenneth E. Jansen double timer_start, timer_end; 1696*59599516SKenneth E. Jansen startTimer(&timer_start); 1697*59599516SKenneth E. Jansen 1698*59599516SKenneth E. Jansen int i = *fileDescriptor; 1699*59599516SKenneth E. Jansen checkFileDescriptor("writeheader",&i); 1700*59599516SKenneth E. Jansen 1701*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 1702*59599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 1703*59599516SKenneth E. Jansen FILE* fileObject; 1704*59599516SKenneth E. Jansen 1705*59599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 1706*59599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 1707*59599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 1708*59599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 1709*59599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 1710*59599516SKenneth E. Jansen endTimer(&timer_end); 1711*59599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 1712*59599516SKenneth E. Jansen return; 1713*59599516SKenneth E. Jansen } 1714*59599516SKenneth E. Jansen 1715*59599516SKenneth E. Jansen LastHeaderKey[ filePtr ] = const_cast< char* >( keyphrase ); 1716*59599516SKenneth E. Jansen DataSize = *ndataItems; 1717*59599516SKenneth E. Jansen fileObject = fileArray[ filePtr ] ; 1718*59599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 1719*59599516SKenneth E. Jansen isBinary( iotype ); 1720*59599516SKenneth E. Jansen header_type[ filePtr ] = type_size; 1721*59599516SKenneth E. Jansen 1722*59599516SKenneth E. Jansen int _newline = ( *ndataItems > 0 ) ? sizeof( char ) : 0; 1723*59599516SKenneth E. Jansen int size_of_nextblock = 1724*59599516SKenneth E. Jansen ( binary_format ) ? type_size*( *ndataItems )+ _newline : *ndataItems ; 1725*59599516SKenneth E. Jansen 1726*59599516SKenneth E. Jansen fprintf( fileObject, "%s : < %d > ", keyphrase, size_of_nextblock ); 1727*59599516SKenneth E. Jansen for( int i = 0; i < *nItems; i++ ) 1728*59599516SKenneth E. Jansen fprintf(fileObject, "%d ", *((int*)((int*)valueArray+i))); 1729*59599516SKenneth E. Jansen fprintf(fileObject, "\n"); 1730*59599516SKenneth E. Jansen 1731*59599516SKenneth E. Jansen //return ; 1732*59599516SKenneth E. Jansen } 1733*59599516SKenneth E. Jansen else { // else it's parallel I/O 1734*59599516SKenneth E. Jansen DataSize = *ndataItems; 1735*59599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 1736*59599516SKenneth E. Jansen isBinary( iotype ); 1737*59599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 1738*59599516SKenneth E. Jansen 1739*59599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 1740*59599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 1741*59599516SKenneth E. Jansen //char* buffer = ( char * ) malloc( string_length + 1 + pool_align ); 1742*59599516SKenneth E. Jansen //mem_address = (long long )buffer; 1743*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1744*59599516SKenneth E. Jansen // buffer += pool_align - (mem_address & (pool_align -1)); 1745*59599516SKenneth E. Jansen 1746*59599516SKenneth E. Jansen strcpy ( buffer, keyphrase); 1747*59599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 1748*59599516SKenneth E. Jansen 1749*59599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 1750*59599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 1751*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 1752*59599516SKenneth E. Jansen 1753*59599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 1754*59599516SKenneth E. Jansen *p = '\0'; 1755*59599516SKenneth E. Jansen 1756*59599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 1757*59599516SKenneth E. Jansen sprintf(mpi_tag, "\n%s : %d\n", buffer, PhastaIOActiveFiles[i]->field_count); 1758*59599516SKenneth E. Jansen unsigned long long offset_value; 1759*59599516SKenneth E. Jansen 1760*59599516SKenneth E. Jansen int temp = *ndataItems; 1761*59599516SKenneth E. Jansen unsigned long long number_of_items = (unsigned long long)temp; 1762*59599516SKenneth E. Jansen MPI_Barrier(PhastaIOActiveFiles[i]->local_comm); 1763*59599516SKenneth E. Jansen 1764*59599516SKenneth E. Jansen MPI_Scan( &number_of_items, 1765*59599516SKenneth E. Jansen &offset_value, 1766*59599516SKenneth E. Jansen 1, 1767*59599516SKenneth E. Jansen MPI_LONG_LONG_INT, 1768*59599516SKenneth E. Jansen MPI_SUM, 1769*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 1770*59599516SKenneth E. Jansen 1771*59599516SKenneth E. Jansen offset_value = (offset_value - number_of_items) * type_size; 1772*59599516SKenneth E. Jansen 1773*59599516SKenneth E. Jansen offset_value += PhastaIOActiveFiles[i]->local_myrank * 1774*59599516SKenneth E. Jansen DB_HEADER_SIZE + 1775*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address; 1776*59599516SKenneth E. Jansen // This offset is the starting address of each datablock header... 1777*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = offset_value; 1778*59599516SKenneth E. Jansen 1779*59599516SKenneth E. Jansen // Write in my offset table ... 1780*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[PhastaIOActiveFiles[i]->field_count][PhastaIOActiveFiles[i]->part_count] = 1781*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset; 1782*59599516SKenneth E. Jansen 1783*59599516SKenneth E. Jansen // Update the next-start-address ... 1784*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = offset_value + 1785*59599516SKenneth E. Jansen number_of_items * type_size + 1786*59599516SKenneth E. Jansen DB_HEADER_SIZE; 1787*59599516SKenneth E. Jansen MPI_Bcast( &(PhastaIOActiveFiles[i]->next_start_address), 1788*59599516SKenneth E. Jansen 1, 1789*59599516SKenneth E. Jansen MPI_LONG_LONG_INT, 1790*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs-1, 1791*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 1792*59599516SKenneth E. Jansen 1793*59599516SKenneth E. Jansen // Prepare datablock header ... 1794*59599516SKenneth E. Jansen int _newline = (*ndataItems>0)?sizeof(char):0; 1795*59599516SKenneth E. Jansen unsigned int size_of_nextblock = type_size * (*ndataItems) + _newline; 1796*59599516SKenneth E. Jansen 1797*59599516SKenneth E. Jansen //char datablock_header[255]; 1798*59599516SKenneth E. Jansen //bzero((void*)datablock_header,255); 1799*59599516SKenneth E. Jansen char datablock_header[DB_HEADER_SIZE]; 1800*59599516SKenneth E. Jansen bzero((void*)datablock_header,DB_HEADER_SIZE); 1801*59599516SKenneth E. Jansen 1802*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = PhastaIOActiveFiles[i]->nppp*PhastaIOActiveFiles[i]->myrank+PhastaIOActiveFiles[i]->part_count; 1803*59599516SKenneth E. Jansen sprintf( datablock_header, 1804*59599516SKenneth E. Jansen "\n%s : < %u >", 1805*59599516SKenneth E. Jansen keyphrase, 1806*59599516SKenneth E. Jansen size_of_nextblock ); 1807*59599516SKenneth E. Jansen 1808*59599516SKenneth E. Jansen for ( int j = 0; j < *nItems; j++ ) 1809*59599516SKenneth E. Jansen { 1810*59599516SKenneth E. Jansen sprintf( datablock_header, 1811*59599516SKenneth E. Jansen "%s %d ", 1812*59599516SKenneth E. Jansen datablock_header, 1813*59599516SKenneth E. Jansen *((int*)((int*)valueArray+j))); 1814*59599516SKenneth E. Jansen } 1815*59599516SKenneth E. Jansen sprintf( datablock_header, 1816*59599516SKenneth E. Jansen "%s\n ", 1817*59599516SKenneth E. Jansen datablock_header ); 1818*59599516SKenneth E. Jansen 1819*59599516SKenneth E. Jansen // Write datablock header ... 1820*59599516SKenneth E. Jansen //MR CHANGE 1821*59599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 1822*59599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 1823*59599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 1824*59599516SKenneth E. Jansen //MR CHANGE END 1825*59599516SKenneth E. Jansen { 1826*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 1827*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = ( double * )malloc( (sizeof( double )*number_of_items+ DB_HEADER_SIZE)); 1828*59599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->double_chunk = ( double * ) malloc( sizeof( double )*number_of_items+ DB_HEADER_SIZE + pool_align ); 1829*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk; 1830*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1831*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1)); 1832*59599516SKenneth E. Jansen 1833*59599516SKenneth E. Jansen double * aa = ( double * )datablock_header; 1834*59599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->double_chunk, aa, DB_HEADER_SIZE); 1835*59599516SKenneth E. Jansen } 1836*59599516SKenneth E. Jansen //MR CHANGE 1837*59599516SKenneth E. Jansen // if ( cscompare(datatype,"integer") ) 1838*59599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 1839*59599516SKenneth E. Jansen //MR CHANGE END 1840*59599516SKenneth E. Jansen { 1841*59599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 1842*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = ( int * )malloc( (sizeof( int )*number_of_items+ DB_HEADER_SIZE)); 1843*59599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->int_chunk = ( int * ) malloc( sizeof( int )*number_of_items+ DB_HEADER_SIZE + pool_align ); 1844*59599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk; 1845*59599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 1846*59599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & ( pool_align -1)); 1847*59599516SKenneth E. Jansen 1848*59599516SKenneth E. Jansen int * aa = ( int * )datablock_header; 1849*59599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->int_chunk, aa, DB_HEADER_SIZE); 1850*59599516SKenneth E. Jansen } 1851*59599516SKenneth E. Jansen else { 1852*59599516SKenneth E. Jansen // *fileDescriptor = DATA_TYPE_ILLEGAL; 1853*59599516SKenneth E. Jansen printf("writeheader - DATA_TYPE_ILLEGAL - %s\n",datatype); 1854*59599516SKenneth E. Jansen endTimer(&timer_end); 1855*59599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 1856*59599516SKenneth E. Jansen return; 1857*59599516SKenneth E. Jansen } 1858*59599516SKenneth E. Jansen free(ts1); 1859*59599516SKenneth E. Jansen 1860*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count++; 1861*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->part_count == PhastaIOActiveFiles[i]->nppp ) { 1862*59599516SKenneth E. Jansen //A new field will be written 1863*59599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 1864*59599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header + 1865*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count * 1866*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 1867*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 1868*59599516SKenneth E. Jansen mpi_tag, 1869*59599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1); 1870*59599516SKenneth E. Jansen } 1871*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count++; 1872*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count=0; 1873*59599516SKenneth E. Jansen } 1874*59599516SKenneth E. Jansen free(buffer); 1875*59599516SKenneth E. Jansen } 1876*59599516SKenneth E. Jansen 1877*59599516SKenneth E. Jansen endTimer(&timer_end); 1878*59599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 1879*59599516SKenneth E. Jansen } 1880*59599516SKenneth E. Jansen 1881*59599516SKenneth E. Jansen void writedatablock( const int* fileDescriptor, 1882*59599516SKenneth E. Jansen const char keyphrase[], 1883*59599516SKenneth E. Jansen const void* valueArray, 1884*59599516SKenneth E. Jansen const int* nItems, 1885*59599516SKenneth E. Jansen const char datatype[], 1886*59599516SKenneth E. Jansen const char iotype[] ) 1887*59599516SKenneth E. Jansen { 1888*59599516SKenneth E. Jansen //if(irank == 0) printf("entering writedatablock()\n"); 1889*59599516SKenneth E. Jansen 1890*59599516SKenneth E. Jansen unsigned long long data_size = 0; 1891*59599516SKenneth E. Jansen double timer_start, timer_end; 1892*59599516SKenneth E. Jansen startTimer(&timer_start); 1893*59599516SKenneth E. Jansen 1894*59599516SKenneth E. Jansen int i = *fileDescriptor; 1895*59599516SKenneth E. Jansen checkFileDescriptor("writedatablock",&i); 1896*59599516SKenneth E. Jansen 1897*59599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 1898*59599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 1899*59599516SKenneth E. Jansen 1900*59599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 1901*59599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 1902*59599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 1903*59599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 1904*59599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 1905*59599516SKenneth E. Jansen endTimer(&timer_end); 1906*59599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 1907*59599516SKenneth E. Jansen return; 1908*59599516SKenneth E. Jansen } 1909*59599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 1910*59599516SKenneth E. Jansen // let us check to see that it is actually the case. 1911*59599516SKenneth E. Jansen 1912*59599516SKenneth E. Jansen if ( ! cscompare( LastHeaderKey[ filePtr ], keyphrase ) ) { 1913*59599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 1914*59599516SKenneth E. Jansen fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ] ); 1915*59599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 1916*59599516SKenneth E. Jansen fprintf(stderr, "Please recheck write sequence \n"); 1917*59599516SKenneth E. Jansen if( Strict_Error ) { 1918*59599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 1919*59599516SKenneth E. Jansen endTimer(&timer_end); 1920*59599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 1921*59599516SKenneth E. Jansen return; 1922*59599516SKenneth E. Jansen } 1923*59599516SKenneth E. Jansen } 1924*59599516SKenneth E. Jansen 1925*59599516SKenneth E. Jansen FILE* fileObject = fileArray[ filePtr ] ; 1926*59599516SKenneth E. Jansen size_t type_size=typeSize( datatype ); 1927*59599516SKenneth E. Jansen isBinary( iotype ); 1928*59599516SKenneth E. Jansen 1929*59599516SKenneth E. Jansen if ( header_type[filePtr] != (int)type_size ) { 1930*59599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on typeof data in the block for\n"); 1931*59599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 1932*59599516SKenneth E. Jansen if( Strict_Error ) { 1933*59599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 1934*59599516SKenneth E. Jansen endTimer(&timer_end); 1935*59599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 1936*59599516SKenneth E. Jansen return; 1937*59599516SKenneth E. Jansen } 1938*59599516SKenneth E. Jansen } 1939*59599516SKenneth E. Jansen 1940*59599516SKenneth E. Jansen int nUnits = *nItems; 1941*59599516SKenneth E. Jansen 1942*59599516SKenneth E. Jansen if ( nUnits != DataSize ) { 1943*59599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on number of data items for\n"); 1944*59599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 1945*59599516SKenneth E. Jansen if( Strict_Error ) { 1946*59599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 1947*59599516SKenneth E. Jansen endTimer(&timer_end); 1948*59599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 1949*59599516SKenneth E. Jansen return; 1950*59599516SKenneth E. Jansen } 1951*59599516SKenneth E. Jansen } 1952*59599516SKenneth E. Jansen 1953*59599516SKenneth E. Jansen if ( binary_format ) { 1954*59599516SKenneth E. Jansen 1955*59599516SKenneth E. Jansen fwrite( valueArray, type_size, nUnits, fileObject ); 1956*59599516SKenneth E. Jansen fprintf( fileObject,"\n"); 1957*59599516SKenneth E. Jansen 1958*59599516SKenneth E. Jansen } else { 1959*59599516SKenneth E. Jansen 1960*59599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 1961*59599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 1962*59599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 1963*59599516SKenneth E. Jansen fprintf(fileObject,"%d\n",*((int*)((int*)valueArray+n))); 1964*59599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 1965*59599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 1966*59599516SKenneth E. Jansen fprintf(fileObject,"%lf\n",*((double*)((double*)valueArray+n))); 1967*59599516SKenneth E. Jansen } 1968*59599516SKenneth E. Jansen free (ts1); 1969*59599516SKenneth E. Jansen } 1970*59599516SKenneth E. Jansen //return ; 1971*59599516SKenneth E. Jansen } 1972*59599516SKenneth E. Jansen else { // syncIO case 1973*59599516SKenneth E. Jansen MPI_Status write_data_status; 1974*59599516SKenneth E. Jansen isBinary( iotype ); 1975*59599516SKenneth E. Jansen int nUnits = *nItems; 1976*59599516SKenneth E. Jansen 1977*59599516SKenneth E. Jansen //MR CHANGE 1978*59599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 1979*59599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 1980*59599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 1981*59599516SKenneth E. Jansen //MR CHANGE END 1982*59599516SKenneth E. Jansen { 1983*59599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->double_chunk+DB_HEADER_SIZE/sizeof(double)), valueArray, nUnits*sizeof(double)); 1984*59599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 1985*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 1986*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 1987*59599516SKenneth E. Jansen //BLOCK_SIZE/sizeof(double), 1988*59599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(double), 1989*59599516SKenneth E. Jansen MPI_DOUBLE ); 1990*59599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 1991*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 1992*59599516SKenneth E. Jansen &write_data_status ); 1993*59599516SKenneth E. Jansen data_size=8*nUnits; 1994*59599516SKenneth E. Jansen } 1995*59599516SKenneth E. Jansen //MR CHANGE 1996*59599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 1997*59599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 1998*59599516SKenneth E. Jansen //MR CHANGE END 1999*59599516SKenneth E. Jansen { 2000*59599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->int_chunk+DB_HEADER_SIZE/sizeof(int)), valueArray, nUnits*sizeof(int)); 2001*59599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 2002*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 2003*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 2004*59599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(int), 2005*59599516SKenneth E. Jansen MPI_INT ); 2006*59599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 2007*59599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 2008*59599516SKenneth E. Jansen &write_data_status ); 2009*59599516SKenneth E. Jansen data_size=4*nUnits; 2010*59599516SKenneth E. Jansen } 2011*59599516SKenneth E. Jansen else { 2012*59599516SKenneth E. Jansen printf("Error: writedatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 2013*59599516SKenneth E. Jansen endTimer(&timer_end); 2014*59599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 2015*59599516SKenneth E. Jansen return; 2016*59599516SKenneth E. Jansen } 2017*59599516SKenneth E. Jansen free(ts1); 2018*59599516SKenneth E. Jansen } 2019*59599516SKenneth E. Jansen 2020*59599516SKenneth E. Jansen endTimer(&timer_end); 2021*59599516SKenneth E. Jansen char extra_msg[1024]; 2022*59599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 2023*59599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 2024*59599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 2025*59599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, data_size, 1, extra_msg); 2026*59599516SKenneth E. Jansen free(key); 2027*59599516SKenneth E. Jansen 2028*59599516SKenneth E. Jansen } 2029*59599516SKenneth E. Jansen 2030*59599516SKenneth E. Jansen void 2031*59599516SKenneth E. Jansen SwapArrayByteOrder( void* array, 2032*59599516SKenneth E. Jansen int nbytes, 2033*59599516SKenneth E. Jansen int nItems ) 2034*59599516SKenneth E. Jansen { 2035*59599516SKenneth E. Jansen /* This swaps the byte order for the array of nItems each 2036*59599516SKenneth E. Jansen of size nbytes , This will be called only locally */ 2037*59599516SKenneth E. Jansen int i,j; 2038*59599516SKenneth E. Jansen unsigned char* ucDst = (unsigned char*)array; 2039*59599516SKenneth E. Jansen 2040*59599516SKenneth E. Jansen for(i=0; i < nItems; i++) { 2041*59599516SKenneth E. Jansen for(j=0; j < (nbytes/2); j++) 2042*59599516SKenneth E. Jansen std::swap( ucDst[j] , ucDst[(nbytes - 1) - j] ); 2043*59599516SKenneth E. Jansen ucDst += nbytes; 2044*59599516SKenneth E. Jansen } 2045*59599516SKenneth E. Jansen } 2046*59599516SKenneth E. Jansen 2047*59599516SKenneth E. Jansen void 2048*59599516SKenneth E. Jansen writestring( int* fileDescriptor, 2049*59599516SKenneth E. Jansen const char inString[] ) 2050*59599516SKenneth E. Jansen { 2051*59599516SKenneth E. Jansen 2052*59599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 2053*59599516SKenneth E. Jansen FILE* fileObject = fileArray[filePtr] ; 2054*59599516SKenneth E. Jansen fprintf(fileObject,"%s",inString ); 2055*59599516SKenneth E. Jansen return; 2056*59599516SKenneth E. Jansen } 2057*59599516SKenneth E. Jansen 2058*59599516SKenneth E. Jansen void 2059*59599516SKenneth E. Jansen Gather_Headers( int* fileDescriptor, 2060*59599516SKenneth E. Jansen vector< string >& headers ) 2061*59599516SKenneth E. Jansen { 2062*59599516SKenneth E. Jansen 2063*59599516SKenneth E. Jansen FILE* fileObject; 2064*59599516SKenneth E. Jansen char Line[1024]; 2065*59599516SKenneth E. Jansen 2066*59599516SKenneth E. Jansen fileObject = fileArray[ (*fileDescriptor)-1 ]; 2067*59599516SKenneth E. Jansen 2068*59599516SKenneth E. Jansen while( !feof(fileObject) ) { 2069*59599516SKenneth E. Jansen fgets( Line, 1024, fileObject); 2070*59599516SKenneth E. Jansen if ( Line[0] == '#' ) { 2071*59599516SKenneth E. Jansen headers.push_back( Line ); 2072*59599516SKenneth E. Jansen } else { 2073*59599516SKenneth E. Jansen break; 2074*59599516SKenneth E. Jansen } 2075*59599516SKenneth E. Jansen } 2076*59599516SKenneth E. Jansen rewind( fileObject ); 2077*59599516SKenneth E. Jansen clearerr( fileObject ); 2078*59599516SKenneth E. Jansen } 2079*59599516SKenneth E. Jansen void 2080*59599516SKenneth E. Jansen isWrong( void ) { (Wrong_Endian) ? fprintf(stdout,"YES\n"): fprintf(stdout,"NO\n") ; } 2081*59599516SKenneth E. Jansen 2082*59599516SKenneth E. Jansen void 2083*59599516SKenneth E. Jansen togglestrictmode( void ) { Strict_Error = !Strict_Error; } 2084*59599516SKenneth E. Jansen 2085*59599516SKenneth E. Jansen int 2086*59599516SKenneth E. Jansen isLittleEndian( void ) 2087*59599516SKenneth E. Jansen { 2088*59599516SKenneth E. Jansen // this function returns a 1 if the current running architecture is 2089*59599516SKenneth E. Jansen // LittleEndian Byte Ordered, else it returns a zero 2090*59599516SKenneth E. Jansen 2091*59599516SKenneth E. Jansen union { 2092*59599516SKenneth E. Jansen long a; 2093*59599516SKenneth E. Jansen char c[sizeof( long )]; 2094*59599516SKenneth E. Jansen } endianUnion; 2095*59599516SKenneth E. Jansen 2096*59599516SKenneth E. Jansen endianUnion.a = 1 ; 2097*59599516SKenneth E. Jansen 2098*59599516SKenneth E. Jansen if ( endianUnion.c[sizeof(long)-1] != 1 ) return 1 ; 2099*59599516SKenneth E. Jansen else return 0; 2100*59599516SKenneth E. Jansen } 2101*59599516SKenneth E. Jansen 2102*59599516SKenneth E. Jansen namespace PHASTA { 2103*59599516SKenneth E. Jansen const char* const PhastaIO_traits<int>::type_string = "integer"; 2104*59599516SKenneth E. Jansen const char* const PhastaIO_traits<double>::type_string = "double"; 2105*59599516SKenneth E. Jansen } 2106