159599516SKenneth E. Jansen /* 259599516SKenneth E. Jansen * 359599516SKenneth E. Jansen * This is the SyncIO library that uses MPI-IO collective functions to 459599516SKenneth E. Jansen * implement a flexible I/O checkpoint solution for a large number of 559599516SKenneth E. Jansen * processors. 659599516SKenneth E. Jansen * 759599516SKenneth E. Jansen * Previous developer: Ning Liu (liun2@cs.rpi.edu) 859599516SKenneth E. Jansen * Jing Fu (fuj@cs.rpi.edu) 959599516SKenneth E. Jansen * Current developers: Michel Rasquin (Michel.Rasquin@colorado.edu), 1059599516SKenneth E. Jansen * Ben Matthews (benjamin.a.matthews@colorado.edu) 1159599516SKenneth E. Jansen * 1259599516SKenneth E. Jansen */ 1359599516SKenneth E. Jansen 1459599516SKenneth E. Jansen #include <map> 1559599516SKenneth E. Jansen #include <vector> 1659599516SKenneth E. Jansen #include <string> 1759599516SKenneth E. Jansen #include <string.h> 1859599516SKenneth E. Jansen #include <ctype.h> 1959599516SKenneth E. Jansen #include <stdlib.h> 2059599516SKenneth E. Jansen #include <stdio.h> 2159599516SKenneth E. Jansen #include <math.h> 22d3337298SCameron Smith #include <sstream> 2359599516SKenneth E. Jansen #include "phastaIO.h" 2459599516SKenneth E. Jansen #include "mpi.h" 2559599516SKenneth E. Jansen #include "phiotmrc.h" 2659599516SKenneth E. Jansen 2759599516SKenneth E. Jansen #define VERSION_INFO_HEADER_SIZE 8192 2859599516SKenneth E. Jansen #define DB_HEADER_SIZE 1024 2959599516SKenneth E. Jansen #define ONE_MEGABYTE 1048576 3059599516SKenneth E. Jansen #define TWO_MEGABYTE 2097152 3159599516SKenneth E. Jansen #define ENDIAN_TEST_NUMBER 12180 // Troy's Zip Code!! 3259599516SKenneth E. Jansen #define MAX_PHASTA_FILES 64 3359599516SKenneth E. Jansen #define MAX_PHASTA_FILE_NAME_LENGTH 1024 3459599516SKenneth 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 3559599516SKenneth E. Jansen // -3 for MPI_IO_Tag, nFields and nppf, -4 for extra security (former nFiles) 3659599516SKenneth E. Jansen #define MAX_FIELDS_NAME_LENGTH 128 3759599516SKenneth E. Jansen #define DefaultMHSize (4*ONE_MEGABYTE) 3859599516SKenneth E. Jansen //#define DefaultMHSize (8350) //For test 3959599516SKenneth E. Jansen #define LATEST_WRITE_VERSION 1 4059599516SKenneth E. Jansen #define inv1024sq 953.674316406e-9 // = 1/1024/1024 4159599516SKenneth E. Jansen int MasterHeaderSize = -1; 4259599516SKenneth E. Jansen 4359599516SKenneth E. Jansen bool PRINT_PERF = false; // default print no perf results 4459599516SKenneth E. Jansen int irank = -1; // global rank, should never be manually manipulated 4559599516SKenneth E. Jansen int mysize = -1; 4659599516SKenneth E. Jansen 4759599516SKenneth E. Jansen // Static variables are bad but used here to store the subcommunicator and associated variables 4859599516SKenneth 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) 4959599516SKenneth E. Jansen static int s_assign_local_comm = 0; 5059599516SKenneth E. Jansen static MPI_Comm s_local_comm; 5159599516SKenneth E. Jansen static int s_local_size = -1; 5259599516SKenneth E. Jansen static int s_local_rank = -1; 5359599516SKenneth E. Jansen 5459599516SKenneth E. Jansen //unsigned long long pool_align = 8; 5559599516SKenneth E. Jansen //unsigned long long mem_address; 5659599516SKenneth E. Jansen 5759599516SKenneth E. Jansen // the following defines are for debug printf 5859599516SKenneth E. Jansen #define PHASTAIO_PREFIX "phastaIO debug: " 5959599516SKenneth E. Jansen #define PHASTAIO_DEBUG 0 //default to not print any debugging info 6059599516SKenneth E. Jansen 6159599516SKenneth E. Jansen #if PHASTAIO_DEBUG 6259599516SKenneth E. Jansen #define phprintf( s, arg...) printf(PHASTAIO_PREFIX s "\n", ##arg) 6359599516SKenneth E. Jansen #define phprintf_0( s, arg...) do{ \ 6459599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); \ 6559599516SKenneth E. Jansen if(irank == 0){ \ 6659599516SKenneth E. Jansen printf(PHASTAIO_PREFIX "irank=0: " s "\n", ##arg); \ 6759599516SKenneth E. Jansen } \ 6859599516SKenneth E. Jansen } while(0) 6959599516SKenneth E. Jansen #else 7059599516SKenneth E. Jansen #define phprintf( s, arg...) 7159599516SKenneth E. Jansen #define phprintf_0( s, arg...) 7259599516SKenneth E. Jansen #endif 7359599516SKenneth E. Jansen 7459599516SKenneth E. Jansen enum PhastaIO_Errors 7559599516SKenneth E. Jansen { 7659599516SKenneth E. Jansen MAX_PHASTA_FILES_EXCEEDED = -1, 7759599516SKenneth E. Jansen UNABLE_TO_OPEN_FILE = -2, 7859599516SKenneth E. Jansen NOT_A_MPI_FILE = -3, 7959599516SKenneth E. Jansen GPID_EXCEEDED = -4, 8059599516SKenneth E. Jansen DATA_TYPE_ILLEGAL = -5, 8159599516SKenneth E. Jansen }; 8259599516SKenneth E. Jansen 8359599516SKenneth E. Jansen using namespace std; 8459599516SKenneth E. Jansen 8559599516SKenneth E. Jansen namespace{ 8659599516SKenneth E. Jansen 87ceb6e96dSCameron Smith typedef map<int, char*> mic; 88ceb6e96dSCameron Smith mic LastHeaderKey; 8959599516SKenneth E. Jansen vector< FILE* > fileArray; 9059599516SKenneth E. Jansen vector< bool > byte_order; 9159599516SKenneth E. Jansen vector< int > header_type; 9259599516SKenneth E. Jansen int DataSize=0; 9359599516SKenneth E. Jansen bool LastHeaderNotFound = false; 9459599516SKenneth E. Jansen bool Wrong_Endian = false ; 9559599516SKenneth E. Jansen bool Strict_Error = false ; 9659599516SKenneth E. Jansen bool binary_format = true; 9759599516SKenneth E. Jansen 9859599516SKenneth E. Jansen /***********************************************************************/ 9959599516SKenneth E. Jansen /***************** NEW PHASTA IO CODE STARTS HERE **********************/ 10059599516SKenneth E. Jansen /***********************************************************************/ 10159599516SKenneth E. Jansen 10259599516SKenneth E. Jansen typedef struct 10359599516SKenneth E. Jansen { 10459599516SKenneth E. Jansen char filename[MAX_PHASTA_FILE_NAME_LENGTH]; /* defafults to 1024 */ 10559599516SKenneth E. Jansen unsigned long long my_offset; 10659599516SKenneth E. Jansen unsigned long long next_start_address; 10759599516SKenneth E. Jansen unsigned long long **my_offset_table; 10859599516SKenneth E. Jansen unsigned long long **my_read_table; 10959599516SKenneth E. Jansen 11059599516SKenneth E. Jansen double * double_chunk; 11159599516SKenneth E. Jansen double * read_double_chunk; 11259599516SKenneth E. Jansen 11359599516SKenneth E. Jansen int field_count; 11459599516SKenneth E. Jansen int part_count; 11559599516SKenneth E. Jansen int read_field_count; 11659599516SKenneth E. Jansen int read_part_count; 11759599516SKenneth E. Jansen int GPid; 11859599516SKenneth E. Jansen int start_id; 11959599516SKenneth E. Jansen 12059599516SKenneth E. Jansen int mhsize; 12159599516SKenneth E. Jansen 12259599516SKenneth E. Jansen int myrank; 12359599516SKenneth E. Jansen int numprocs; 12459599516SKenneth E. Jansen int local_myrank; 12559599516SKenneth E. Jansen int local_numprocs; 12659599516SKenneth E. Jansen 12759599516SKenneth E. Jansen int nppp; 12859599516SKenneth E. Jansen int nPPF; 12959599516SKenneth E. Jansen int nFiles; 13059599516SKenneth E. Jansen int nFields; 13159599516SKenneth E. Jansen 13259599516SKenneth E. Jansen int * int_chunk; 13359599516SKenneth E. Jansen int * read_int_chunk; 13459599516SKenneth E. Jansen 13559599516SKenneth E. Jansen int Wrong_Endian; /* default to false */ 13659599516SKenneth E. Jansen char * master_header; 13759599516SKenneth E. Jansen MPI_File file_handle; 13859599516SKenneth E. Jansen MPI_Comm local_comm; 13959599516SKenneth E. Jansen } phastaio_file_t; 14059599516SKenneth E. Jansen 14159599516SKenneth E. Jansen typedef struct 14259599516SKenneth E. Jansen { 14359599516SKenneth E. Jansen //unsigned long long my_offset; 14459599516SKenneth E. Jansen //unsigned long long **offset_table; 14559599516SKenneth E. Jansen //int fileID; 14659599516SKenneth E. Jansen int nppf, nfields; 14759599516SKenneth E. Jansen //int GPid; 14859599516SKenneth E. Jansen //int read_field_count; 14959599516SKenneth E. Jansen char * masterHeader; 15059599516SKenneth E. Jansen }serial_file; 15159599516SKenneth E. Jansen 15259599516SKenneth E. Jansen serial_file *SerialFile; 15359599516SKenneth E. Jansen phastaio_file_t *PhastaIOActiveFiles[MAX_PHASTA_FILES]; 15459599516SKenneth E. Jansen int PhastaIONextActiveIndex = 0; /* indicates next index to allocate */ 15559599516SKenneth E. Jansen 15659599516SKenneth E. Jansen // the caller has the responsibility to delete the returned string 15759599516SKenneth E. Jansen // TODO: StringStipper("nbc value? ") returns NULL? 15859599516SKenneth E. Jansen char* 15959599516SKenneth E. Jansen StringStripper( const char istring[] ) { 16059599516SKenneth E. Jansen 16159599516SKenneth E. Jansen int length = strlen( istring ); 16259599516SKenneth E. Jansen 16359599516SKenneth E. Jansen //char* dest = new char [ length + 1 ]; 16459599516SKenneth E. Jansen char* dest = (char *)malloc( length + 1 ); 16559599516SKenneth E. Jansen 16659599516SKenneth E. Jansen //char * dest; 16759599516SKenneth E. Jansen //dest = (char *)malloc( length + 1 + pool_align ); 16859599516SKenneth E. Jansen //if (dest & 0x0F != 0) printf("not aligned!!!!\n"); 16959599516SKenneth E. Jansen //mem_address = (long long )dest; 17059599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 17159599516SKenneth E. Jansen // dest += pool_align - (mem_address & (pool_align -1)); 17259599516SKenneth E. Jansen 17359599516SKenneth E. Jansen strcpy( dest, istring ); 17459599516SKenneth E. Jansen dest[ length ] = '\0'; 17559599516SKenneth E. Jansen 17659599516SKenneth E. Jansen if ( char* p = strpbrk( dest, " ") ) 17759599516SKenneth E. Jansen *p = '\0'; 17859599516SKenneth E. Jansen 17959599516SKenneth E. Jansen return dest; 18059599516SKenneth E. Jansen } 18159599516SKenneth E. Jansen 18259599516SKenneth E. Jansen inline int 18359599516SKenneth E. Jansen cscompare( const char teststring[], 18459599516SKenneth E. Jansen const char targetstring[] ) { 18559599516SKenneth E. Jansen 18659599516SKenneth E. Jansen char* s1 = const_cast<char*>(teststring); 18759599516SKenneth E. Jansen char* s2 = const_cast<char*>(targetstring); 18859599516SKenneth E. Jansen 18959599516SKenneth E. Jansen while( *s1 == ' ') s1++; 19059599516SKenneth E. Jansen while( *s2 == ' ') s2++; 19159599516SKenneth E. Jansen while( ( *s1 ) 19259599516SKenneth E. Jansen && ( *s2 ) 19359599516SKenneth E. Jansen && ( *s2 != '?') 19459599516SKenneth E. Jansen && ( tolower( *s1 )==tolower( *s2 ) ) ) { 19559599516SKenneth E. Jansen s1++; 19659599516SKenneth E. Jansen s2++; 19759599516SKenneth E. Jansen while( *s1 == ' ') s1++; 19859599516SKenneth E. Jansen while( *s2 == ' ') s2++; 19959599516SKenneth E. Jansen } 20059599516SKenneth E. Jansen if ( !( *s1 ) || ( *s1 == '?') ) return 1; 20159599516SKenneth E. Jansen else return 0; 20259599516SKenneth E. Jansen } 20359599516SKenneth E. Jansen 20459599516SKenneth E. Jansen inline void 20559599516SKenneth E. Jansen isBinary( const char iotype[] ) { 20659599516SKenneth E. Jansen 20759599516SKenneth E. Jansen char* fname = StringStripper( iotype ); 20859599516SKenneth E. Jansen if ( cscompare( fname, "binary" ) ) binary_format = true; 20959599516SKenneth E. Jansen else binary_format = false; 21059599516SKenneth E. Jansen free (fname); 21159599516SKenneth E. Jansen 21259599516SKenneth E. Jansen } 21359599516SKenneth E. Jansen 21459599516SKenneth E. Jansen inline size_t 21559599516SKenneth E. Jansen typeSize( const char typestring[] ) { 21659599516SKenneth E. Jansen 21759599516SKenneth E. Jansen char* ts1 = StringStripper( typestring ); 21859599516SKenneth E. Jansen 21959599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 22059599516SKenneth E. Jansen free (ts1); 22159599516SKenneth E. Jansen return sizeof(int); 22259599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 22359599516SKenneth E. Jansen free (ts1); 22459599516SKenneth E. Jansen return sizeof( double ); 22559599516SKenneth E. Jansen } else { 22659599516SKenneth E. Jansen free (ts1); 22759599516SKenneth E. Jansen fprintf(stderr,"unknown type : %s\n",ts1); 22859599516SKenneth E. Jansen return 0; 22959599516SKenneth E. Jansen } 23059599516SKenneth E. Jansen } 23159599516SKenneth E. Jansen 23259599516SKenneth E. Jansen int 23359599516SKenneth E. Jansen readHeader( FILE* fileObject, 23459599516SKenneth E. Jansen const char phrase[], 23559599516SKenneth E. Jansen int* params, 23659599516SKenneth E. Jansen int expect ) { 23759599516SKenneth E. Jansen 23859599516SKenneth E. Jansen char* text_header; 23959599516SKenneth E. Jansen char* token; 24059599516SKenneth E. Jansen char Line[1024]; 24159599516SKenneth E. Jansen char junk; 24259599516SKenneth E. Jansen bool FOUND = false ; 24359599516SKenneth E. Jansen int real_length; 24459599516SKenneth E. Jansen int skip_size, integer_value; 24559599516SKenneth E. Jansen int rewind_count=0; 24659599516SKenneth E. Jansen 24759599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 24859599516SKenneth E. Jansen rewind( fileObject ); 24959599516SKenneth E. Jansen clearerr( fileObject ); 25059599516SKenneth E. Jansen rewind_count++; 25159599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 25259599516SKenneth E. Jansen } 25359599516SKenneth E. Jansen 25459599516SKenneth E. Jansen while( !FOUND && ( rewind_count < 2 ) ) { 25559599516SKenneth E. Jansen if ( ( Line[0] != '\n' ) && ( real_length = strcspn( Line, "#" )) ){ 25659599516SKenneth E. Jansen //text_header = new char [ real_length + 1 ]; 25759599516SKenneth E. Jansen text_header = (char *)malloc( real_length + 1 ); 25859599516SKenneth E. Jansen //text_header = (char *)malloc( real_length + 1 + pool_align ); 25959599516SKenneth E. Jansen //mem_address = (long long )text_header; 26059599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 26159599516SKenneth E. Jansen // text_header += pool_align - (mem_address & (pool_align -1)); 26259599516SKenneth E. Jansen 26359599516SKenneth E. Jansen strncpy( text_header, Line, real_length ); 26459599516SKenneth E. Jansen text_header[ real_length ] =static_cast<char>(NULL); 26559599516SKenneth E. Jansen token = strtok ( text_header, ":" ); 26659599516SKenneth E. Jansen //if( cscompare( phrase , token ) ) { 26759599516SKenneth E. Jansen // Double comparison required because different fields can still start 26859599516SKenneth E. Jansen // with the same name for mixed meshes (nbc code, nbc values, etc). 26959599516SKenneth E. Jansen // Would be easy to fix cscompare instead but would it break sth else? 27059599516SKenneth E. Jansen if( cscompare( phrase , token ) && cscompare( token , phrase ) ) { 27159599516SKenneth E. Jansen FOUND = true ; 27259599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 27359599516SKenneth E. Jansen skip_size = atoi( token ); 27459599516SKenneth E. Jansen int i; 27559599516SKenneth E. Jansen for( i=0; i < expect && ( token = strtok( NULL," ,;<>") ); i++) { 27659599516SKenneth E. Jansen params[i] = atoi( token ); 27759599516SKenneth E. Jansen } 27859599516SKenneth E. Jansen if ( i < expect ) { 27959599516SKenneth E. Jansen fprintf(stderr,"Aloha Expected # of ints not found for: %s\n",phrase ); 28059599516SKenneth E. Jansen } 28159599516SKenneth E. Jansen } else if ( cscompare(token,"byteorder magic number") ) { 28259599516SKenneth E. Jansen if ( binary_format ) { 28359599516SKenneth E. Jansen fread((void*)&integer_value,sizeof(int),1,fileObject); 28459599516SKenneth E. Jansen fread( &junk, sizeof(char), 1 , fileObject ); 28559599516SKenneth E. Jansen if ( 362436 != integer_value ) Wrong_Endian = true; 28659599516SKenneth E. Jansen } else{ 28759599516SKenneth E. Jansen fscanf(fileObject, "%d\n", &integer_value ); 28859599516SKenneth E. Jansen } 28959599516SKenneth E. Jansen } else { 29059599516SKenneth E. Jansen /* some other header, so just skip over */ 29159599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 29259599516SKenneth E. Jansen skip_size = atoi( token ); 29359599516SKenneth E. Jansen if ( binary_format) 29459599516SKenneth E. Jansen fseek( fileObject, skip_size, SEEK_CUR ); 29559599516SKenneth E. Jansen else 29659599516SKenneth E. Jansen for( int gama=0; gama < skip_size; gama++ ) 29759599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 29859599516SKenneth E. Jansen } 29959599516SKenneth E. Jansen free (text_header); 30059599516SKenneth E. Jansen } // end of if before while loop 30159599516SKenneth E. Jansen 30259599516SKenneth E. Jansen if ( !FOUND ) 30359599516SKenneth E. Jansen if( !fgets( Line, 1024, fileObject ) && feof( fileObject ) ) { 30459599516SKenneth E. Jansen rewind( fileObject ); 30559599516SKenneth E. Jansen clearerr( fileObject ); 30659599516SKenneth E. Jansen rewind_count++; 30759599516SKenneth E. Jansen fgets( Line, 1024, fileObject ); 30859599516SKenneth E. Jansen } 30959599516SKenneth E. Jansen } 31059599516SKenneth E. Jansen 31159599516SKenneth E. Jansen if ( !FOUND ) { 31259599516SKenneth E. Jansen //fprintf(stderr, "Error: Could not find: %s\n", phrase); 31359599516SKenneth E. Jansen if(irank == 0) printf("WARNING: Could not find: %s\n", phrase); 31459599516SKenneth E. Jansen return 1; 31559599516SKenneth E. Jansen } 31659599516SKenneth E. Jansen return 0; 31759599516SKenneth E. Jansen } 31859599516SKenneth E. Jansen 31959599516SKenneth E. Jansen } // end unnamed namespace 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansen 32259599516SKenneth E. Jansen // begin of publicly visible functions 32359599516SKenneth E. Jansen 32459599516SKenneth E. Jansen /** 32559599516SKenneth E. Jansen * This function takes a long long pointer and assign (start) phiotmrc value to it 32659599516SKenneth E. Jansen */ 32759599516SKenneth E. Jansen //void startTimer(unsigned long long* start) { 32859599516SKenneth E. Jansen void startTimer(double* start) { 32959599516SKenneth E. Jansen 33059599516SKenneth E. Jansen if( !PRINT_PERF ) return; 33159599516SKenneth E. Jansen 33259599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 33359599516SKenneth E. Jansen *start = phiotmrc(); 33459599516SKenneth E. Jansen } 33559599516SKenneth E. Jansen 33659599516SKenneth E. Jansen /** 33759599516SKenneth E. Jansen * This function takes a long long pointer and assign (end) phiotmrc value to it 33859599516SKenneth E. Jansen */ 33959599516SKenneth E. Jansen void endTimer(double* end) { 34059599516SKenneth E. Jansen 34159599516SKenneth E. Jansen if( !PRINT_PERF ) return; 34259599516SKenneth E. Jansen 34359599516SKenneth E. Jansen *end = phiotmrc(); 34459599516SKenneth E. Jansen MPI_Barrier(MPI_COMM_WORLD); 34559599516SKenneth E. Jansen } 34659599516SKenneth E. Jansen 34759599516SKenneth E. Jansen /** 34859599516SKenneth E. Jansen * choose to print some performance results (or not) according to 34959599516SKenneth E. Jansen * the PRINT_PERF macro 35059599516SKenneth E. Jansen */ 35159599516SKenneth E. Jansen void printPerf( 35259599516SKenneth E. Jansen const char* func_name, 35359599516SKenneth E. Jansen double start, 35459599516SKenneth E. Jansen double end, 35559599516SKenneth E. Jansen unsigned long long datasize, 35659599516SKenneth E. Jansen int printdatainfo, 35759599516SKenneth E. Jansen const char* extra_msg) { 35859599516SKenneth E. Jansen 35959599516SKenneth E. Jansen if( !PRINT_PERF ) return; 36059599516SKenneth E. Jansen 36159599516SKenneth E. Jansen unsigned long long data_size = datasize; 36259599516SKenneth E. Jansen 36359599516SKenneth E. Jansen double time = end - start; 36459599516SKenneth E. Jansen 36559599516SKenneth E. Jansen unsigned long long isizemin,isizemax,isizetot; 36659599516SKenneth E. Jansen double sizemin,sizemax,sizeavg,sizetot,rate; 36759599516SKenneth E. Jansen double tmin, tmax, tavg, ttot; 36859599516SKenneth E. Jansen 36959599516SKenneth E. Jansen MPI_Allreduce(&time, &tmin,1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD); 37059599516SKenneth E. Jansen MPI_Allreduce(&time, &tmax,1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD); 37159599516SKenneth E. Jansen MPI_Allreduce(&time, &ttot,1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); 37259599516SKenneth E. Jansen tavg = ttot/mysize; 37359599516SKenneth E. Jansen 37459599516SKenneth E. Jansen if(irank == 0) { 37559599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) printf("** 1PFPP "); 37659599516SKenneth E. Jansen else printf("** syncIO "); 37759599516SKenneth E. Jansen printf("%s(): Tmax = %f sec, Tmin = %f sec, Tavg = %f sec", func_name, tmax, tmin, tavg); 37859599516SKenneth E. Jansen } 37959599516SKenneth E. Jansen 38059599516SKenneth E. Jansen if(printdatainfo == 1) { // if printdatainfo ==1, compute I/O rate and block size 38159599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemin,1,MPI_LONG_LONG_INT,MPI_MIN,MPI_COMM_WORLD); 38259599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizemax,1,MPI_LONG_LONG_INT,MPI_MAX,MPI_COMM_WORLD); 38359599516SKenneth E. Jansen MPI_Allreduce(&data_size,&isizetot,1,MPI_LONG_LONG_INT,MPI_SUM,MPI_COMM_WORLD); 38459599516SKenneth E. Jansen 38559599516SKenneth E. Jansen sizemin=(double)(isizemin*inv1024sq); 38659599516SKenneth E. Jansen sizemax=(double)(isizemax*inv1024sq); 38759599516SKenneth E. Jansen sizetot=(double)(isizetot*inv1024sq); 38859599516SKenneth E. Jansen sizeavg=(double)(1.0*sizetot/mysize); 38959599516SKenneth E. Jansen rate=(double)(1.0*sizetot/tmax); 39059599516SKenneth E. Jansen 39159599516SKenneth E. Jansen if( irank == 0) { 39259599516SKenneth 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); 39359599516SKenneth E. Jansen } 39459599516SKenneth E. Jansen } 39559599516SKenneth E. Jansen else { 39659599516SKenneth E. Jansen if(irank == 0) { 39759599516SKenneth E. Jansen printf(" \n"); 39859599516SKenneth E. Jansen //printf(" (%s) \n", extra_msg); 39959599516SKenneth E. Jansen } 40059599516SKenneth E. Jansen } 40159599516SKenneth E. Jansen } 40259599516SKenneth E. Jansen 40359599516SKenneth E. Jansen /** 40459599516SKenneth E. Jansen * This function is normally called at the beginning of a read operation, before 40559599516SKenneth E. Jansen * init function. 40659599516SKenneth E. Jansen * This function (uses rank 0) reads out nfields, nppf, master header size, 40759599516SKenneth E. Jansen * endianess and allocates for masterHeader string. 40859599516SKenneth E. Jansen * These values are essential for following read operations. Rank 0 will bcast 40959599516SKenneth E. Jansen * these values to other ranks in the commm world 41059599516SKenneth E. Jansen * 41159599516SKenneth E. Jansen * If the file set is of old POSIX format, it would throw error and exit 41259599516SKenneth E. Jansen */ 41359599516SKenneth E. Jansen void queryphmpiio(const char filename[],int *nfields, int *nppf) 41459599516SKenneth E. Jansen { 41559599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 41659599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 41759599516SKenneth E. Jansen 41859599516SKenneth E. Jansen if(irank == 0) { 41959599516SKenneth E. Jansen FILE * fileHandle; 42059599516SKenneth E. Jansen char* fname = StringStripper( filename ); 42159599516SKenneth E. Jansen 42259599516SKenneth E. Jansen fileHandle = fopen (fname,"rb"); 42359599516SKenneth E. Jansen if (fileHandle == NULL ) { 42459599516SKenneth E. Jansen printf("\nError: File %s doesn't exist! Please check!\n",fname); 42559599516SKenneth E. Jansen } 42659599516SKenneth E. Jansen else { 42759599516SKenneth E. Jansen SerialFile =(serial_file *)calloc( 1, sizeof( serial_file) ); 42859599516SKenneth E. Jansen //SerialFile = (serial_file *)malloc( sizeof( serial_file ) + pool_align ); 42959599516SKenneth E. Jansen //mem_address = (long long )SerialFile; 43059599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 43159599516SKenneth E. Jansen // SerialFile += pool_align - (mem_address & (pool_align -1)); 43259599516SKenneth E. Jansen 43359599516SKenneth E. Jansen //SerialFile->masterHeader = (char *)malloc(MasterHeaderSize); 43459599516SKenneth E. Jansen //int meta_size_limit = 4*ONE_MEGABYTE; 43559599516SKenneth E. Jansen //int meta_size_limit = (4+ MAX_FIELDS_NUMBER ) * MAX_FIELDS_NAME_LENGTH; 43659599516SKenneth E. Jansen int meta_size_limit = VERSION_INFO_HEADER_SIZE; 43759599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc( meta_size_limit ); 43859599516SKenneth E. Jansen //SerialFile->masterHeader = (char *)malloc( meta_size_limit + pool_align ); 43959599516SKenneth E. Jansen //mem_address = (long long )SerialFile; 44059599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 44159599516SKenneth E. Jansen // SerialFile->masterHeader += pool_align - (mem_address & (pool_align -1)); 44259599516SKenneth E. Jansen 44359599516SKenneth E. Jansen fread(SerialFile->masterHeader, 1, meta_size_limit, fileHandle); 44459599516SKenneth E. Jansen 44559599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 44659599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 44759599516SKenneth E. Jansen int mhsize; 44859599516SKenneth E. Jansen char * token; 44959599516SKenneth E. Jansen int magic_number; 45059599516SKenneth E. Jansen 45159599516SKenneth E. Jansen memcpy( read_out_tag, 45259599516SKenneth E. Jansen SerialFile->masterHeader, 45359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 45459599516SKenneth E. Jansen 45559599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) { 45659599516SKenneth E. Jansen // Test endianess ... 45759599516SKenneth E. Jansen memcpy (&magic_number, 45859599516SKenneth E. Jansen SerialFile->masterHeader + sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 45959599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 46059599516SKenneth E. Jansen 46159599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) { 46259599516SKenneth E. Jansen printf("Endian is different!\n"); 46359599516SKenneth E. Jansen // Will do swap later 46459599516SKenneth E. Jansen } 46559599516SKenneth E. Jansen 46659599516SKenneth E. Jansen // test version, old version, default masterheader size is 4M 46759599516SKenneth E. Jansen // newer version masterheader size is read from first line 46859599516SKenneth E. Jansen memcpy(version, 46959599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/2, 47059599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4 - 1); //TODO: why -1? 47159599516SKenneth E. Jansen 47259599516SKenneth E. Jansen if( cscompare ("version",version) ) { 47359599516SKenneth E. Jansen // if there is "version" tag in the file, then it is newer format 47459599516SKenneth E. Jansen // read master header size from here, otherwise use default 47559599516SKenneth E. Jansen // Note: if version is "1", we know mhsize is at 3/4 place... 47659599516SKenneth E. Jansen 47759599516SKenneth E. Jansen token = strtok(version, ":"); 47859599516SKenneth E. Jansen token = strtok(NULL, " ,;<>" ); 47959599516SKenneth E. Jansen int iversion = atoi(token); 48059599516SKenneth E. Jansen 48159599516SKenneth E. Jansen if( iversion == 1) { 48259599516SKenneth E. Jansen memcpy( &mhsize, 48359599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH/4*3 + sizeof("mhsize : ")-1, 48459599516SKenneth E. Jansen sizeof(int)); 48559599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 48659599516SKenneth E. Jansen SwapArrayByteOrder(&mhsize, sizeof(int), 1); 48759599516SKenneth E. Jansen 48859599516SKenneth E. Jansen if( mhsize > DefaultMHSize ) { 48959599516SKenneth E. Jansen //if actual headersize is larger than default, let's re-read 49059599516SKenneth E. Jansen free(SerialFile->masterHeader); 49159599516SKenneth E. Jansen SerialFile->masterHeader = (char *)malloc(mhsize); 49259599516SKenneth E. Jansen fseek(fileHandle, 0, SEEK_SET); // reset the file stream position 49359599516SKenneth E. Jansen fread(SerialFile->masterHeader,1,mhsize,fileHandle); 49459599516SKenneth E. Jansen } 49559599516SKenneth E. Jansen } 49659599516SKenneth E. Jansen //TODO: check if this is a valid int?? 49759599516SKenneth E. Jansen MasterHeaderSize = mhsize; 49859599516SKenneth E. Jansen } 49959599516SKenneth E. Jansen else { // else it's version 0's format w/o version tag, implicating MHSize=4M 50059599516SKenneth E. Jansen MasterHeaderSize = DefaultMHSize; 50159599516SKenneth E. Jansen } 50259599516SKenneth E. Jansen 50359599516SKenneth E. Jansen memcpy( read_out_tag, 50459599516SKenneth E. Jansen SerialFile->masterHeader+MAX_FIELDS_NAME_LENGTH+1, 50559599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); //TODO: why +1 50659599516SKenneth E. Jansen 50759599516SKenneth E. Jansen // Read in # fields ... 50859599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 50959599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 51059599516SKenneth E. Jansen *nfields = atoi( token ); 51159599516SKenneth E. Jansen if ( *nfields > MAX_FIELDS_NUMBER) { 51259599516SKenneth E. Jansen printf("Error queryphmpiio: nfields is larger than MAX_FIELDS_NUMBER!\n"); 51359599516SKenneth E. Jansen } 51459599516SKenneth E. Jansen SerialFile->nfields=*nfields; //TODO: sanity check of this int? 51559599516SKenneth E. Jansen 51659599516SKenneth E. Jansen memcpy( read_out_tag, 51759599516SKenneth E. Jansen SerialFile->masterHeader + MAX_FIELDS_NAME_LENGTH * 2 51859599516SKenneth E. Jansen + *nfields * MAX_FIELDS_NAME_LENGTH, 51959599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 52059599516SKenneth E. Jansen 52159599516SKenneth E. Jansen token = strtok( read_out_tag, ":" ); 52259599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 52359599516SKenneth E. Jansen *nppf = atoi( token ); 52459599516SKenneth E. Jansen SerialFile->nppf=*nppf; //TODO: sanity check of int 52559599516SKenneth E. Jansen } // end of if("MPI_IO_TAG") 52659599516SKenneth E. Jansen else { 52759599516SKenneth 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); 52859599516SKenneth E. Jansen exit(1); 52959599516SKenneth E. Jansen } 53059599516SKenneth E. Jansen fclose(fileHandle); 53159599516SKenneth E. Jansen free(SerialFile->masterHeader); 53259599516SKenneth E. Jansen free(SerialFile); 53359599516SKenneth E. Jansen } //end of else 53459599516SKenneth E. Jansen free(fname); 53559599516SKenneth E. Jansen } 53659599516SKenneth E. Jansen 53759599516SKenneth E. Jansen // Bcast value to every one 53859599516SKenneth E. Jansen MPI_Bcast( nfields, 1, MPI_INT, 0, MPI_COMM_WORLD ); 53959599516SKenneth E. Jansen MPI_Bcast( nppf, 1, MPI_INT, 0, MPI_COMM_WORLD ); 54059599516SKenneth E. Jansen MPI_Bcast( &MasterHeaderSize, 1, MPI_INT, 0, MPI_COMM_WORLD ); 54159599516SKenneth E. Jansen phprintf("Info queryphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 54259599516SKenneth E. Jansen } 54359599516SKenneth E. Jansen 54459599516SKenneth E. Jansen /** 54559599516SKenneth E. Jansen * This function computes the right master header size (round to size of 2^n). 54659599516SKenneth E. Jansen * This is only needed for file format version 1 in "write" mode. 54759599516SKenneth E. Jansen */ 54859599516SKenneth E. Jansen int computeMHSize(int nfields, int nppf, int version) { 54959599516SKenneth E. Jansen int mhsize; 55059599516SKenneth E. Jansen if(version == 1) { 55159599516SKenneth 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 55259599516SKenneth E. Jansen int meta_info_size = VERSION_INFO_HEADER_SIZE; 55359599516SKenneth E. Jansen int actual_size = nfields * nppf * sizeof(long long) + meta_info_size; 55459599516SKenneth E. Jansen //printf("actual_size = %d, offset table size = %d\n", actual_size, nfields * nppf * sizeof(long long)); 55559599516SKenneth E. Jansen if (actual_size > DefaultMHSize) { 55659599516SKenneth E. Jansen mhsize = (int) ceil( (double) actual_size/DefaultMHSize); // it's rounded to ceiling of this value 55759599516SKenneth E. Jansen mhsize *= DefaultMHSize; 55859599516SKenneth E. Jansen } 55959599516SKenneth E. Jansen else { 56059599516SKenneth E. Jansen mhsize = DefaultMHSize; 56159599516SKenneth E. Jansen } 56259599516SKenneth E. Jansen } 56359599516SKenneth E. Jansen return mhsize; 56459599516SKenneth E. Jansen } 56559599516SKenneth E. Jansen 56659599516SKenneth E. Jansen /** 56759599516SKenneth E. Jansen * Computes correct color of a rank according to number of files. 56859599516SKenneth E. Jansen */ 56959599516SKenneth E. Jansen extern "C" int computeColor( int myrank, int numprocs, int nfiles) { 57059599516SKenneth E. Jansen int color = 57159599516SKenneth E. Jansen (int)(myrank / (numprocs / nfiles)); 57259599516SKenneth E. Jansen return color; 57359599516SKenneth E. Jansen } 57459599516SKenneth E. Jansen 57559599516SKenneth E. Jansen 57659599516SKenneth E. Jansen /** 57759599516SKenneth E. Jansen * Check the file descriptor. 57859599516SKenneth E. Jansen */ 57959599516SKenneth E. Jansen void checkFileDescriptor(const char fctname[], 58059599516SKenneth E. Jansen int* fileDescriptor ) { 58159599516SKenneth E. Jansen if ( *fileDescriptor < 0 ) { 58259599516SKenneth E. Jansen printf("Error: File descriptor = %d in %s\n",*fileDescriptor,fctname); 58359599516SKenneth E. Jansen exit(1); 58459599516SKenneth E. Jansen } 58559599516SKenneth E. Jansen } 58659599516SKenneth E. Jansen 58759599516SKenneth E. Jansen /** 58859599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct 58959599516SKenneth E. Jansen * buffers. 59059599516SKenneth E. Jansen * 59159599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 59259599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 59359599516SKenneth E. Jansen */ 59459599516SKenneth E. Jansen int initphmpiio( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[]) 59559599516SKenneth E. Jansen { 59659599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 59759599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &irank); 59859599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &mysize); 59959599516SKenneth E. Jansen 60059599516SKenneth E. Jansen phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 60159599516SKenneth E. Jansen 60259599516SKenneth E. Jansen double timer_start, timer_end; 60359599516SKenneth E. Jansen startTimer(&timer_start); 60459599516SKenneth E. Jansen 60559599516SKenneth E. Jansen char* imode = StringStripper( mode ); 60659599516SKenneth E. Jansen 60759599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 60859599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 60959599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 61059599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 61159599516SKenneth E. Jansen // do nothing 61259599516SKenneth E. Jansen } 61359599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 61459599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 61559599516SKenneth E. Jansen } 61659599516SKenneth E. Jansen else { 61759599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 61859599516SKenneth E. Jansen exit(1); 61959599516SKenneth E. Jansen } 62059599516SKenneth E. Jansen free ( imode ); 62159599516SKenneth E. Jansen 62259599516SKenneth E. Jansen phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 62359599516SKenneth E. Jansen 62459599516SKenneth E. Jansen int i, j; 62559599516SKenneth E. Jansen 62659599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 62759599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 62859599516SKenneth E. Jansen endTimer(&timer_end); 62959599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 63059599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 63159599516SKenneth E. Jansen } 63259599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 63359599516SKenneth E. Jansen // { 63459599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 63559599516SKenneth E. Jansen // { 63659599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 63759599516SKenneth E. Jansen // } 63859599516SKenneth E. Jansen // } 63959599516SKenneth E. Jansen 64059599516SKenneth E. Jansen 64159599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 64259599516SKenneth E. Jansen //PhastaIOActiveFiles[PhastaIONextActiveIndex] = ( phastaio_file_t *)calloc( 1 + 1, sizeof( phastaio_file_t ) ); 64359599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[PhastaIONextActiveIndex]; 64459599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 64559599516SKenneth E. Jansen // PhastaIOActiveFiles[PhastaIONextActiveIndex] += pool_align - (mem_address & (pool_align -1)); 64659599516SKenneth E. Jansen 64759599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 64859599516SKenneth E. Jansen PhastaIONextActiveIndex++; 64959599516SKenneth E. Jansen 65059599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 65159599516SKenneth E. Jansen 65259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 65359599516SKenneth E. Jansen 65459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 65559599516SKenneth E. Jansen 65659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 65759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 65859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 65959599516SKenneth E. Jansen MPI_Comm_rank(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->myrank)); 66059599516SKenneth E. Jansen MPI_Comm_size(MPI_COMM_WORLD, &(PhastaIOActiveFiles[i]->numprocs)); 66159599516SKenneth E. Jansen 66259599516SKenneth E. Jansen 66359599516SKenneth E. Jansen if( *nfiles > 1 ) { // split the ranks according to each mpiio file 66459599516SKenneth E. Jansen 66559599516SKenneth E. Jansen if ( s_assign_local_comm == 0) { // call mpi_comm_split for the first (and only) time 66659599516SKenneth E. Jansen 66759599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Building subcommunicator\n"); 66859599516SKenneth E. Jansen 66959599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 67059599516SKenneth E. Jansen MPI_Comm_split(MPI_COMM_WORLD, 67159599516SKenneth E. Jansen color, 67259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 67359599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 67459599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 67559599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 67659599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 67759599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 67859599516SKenneth E. Jansen 67959599516SKenneth E. Jansen // back up now these variables so that we do not need to call comm_split again 68059599516SKenneth E. Jansen s_local_comm = PhastaIOActiveFiles[i]->local_comm; 68159599516SKenneth E. Jansen s_local_size = PhastaIOActiveFiles[i]->local_numprocs; 68259599516SKenneth E. Jansen s_local_rank = PhastaIOActiveFiles[i]->local_myrank; 68359599516SKenneth E. Jansen s_assign_local_comm = 1; 68459599516SKenneth E. Jansen } 68559599516SKenneth E. Jansen else { // recycle the subcommunicator 68659599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Recycling subcommunicator\n"); 68759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = s_local_comm; 68859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = s_local_size; 68959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = s_local_rank; 69059599516SKenneth E. Jansen } 69159599516SKenneth E. Jansen } 69259599516SKenneth E. Jansen else { // *nfiles == 1 here - no need to call mpi_comm_split here 69359599516SKenneth E. Jansen 69459599516SKenneth E. Jansen if (PhastaIOActiveFiles[i]->myrank == 0) printf("Bypassing subcommunicator\n"); 69559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm = MPI_COMM_WORLD; 69659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs = PhastaIOActiveFiles[i]->numprocs; 69759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_myrank = PhastaIOActiveFiles[i]->myrank; 69859599516SKenneth E. Jansen 69959599516SKenneth E. Jansen } 70059599516SKenneth E. Jansen 70159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 70259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 70359599516SKenneth E. Jansen 70459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 70559599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 70659599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 70759599516SKenneth E. Jansen 70859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 70959599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 71059599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof(unsigned long long *) ); 71159599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table; 71259599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 71359599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table += pool_align - (mem_address & (pool_align -1)); 71459599516SKenneth E. Jansen 71559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 71659599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 71759599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof( unsigned long long *) ); 71859599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table; 71959599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 72059599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table += pool_align - (mem_address & (pool_align -1)); 72159599516SKenneth E. Jansen 72259599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 72359599516SKenneth E. Jansen { 72459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 72559599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 72659599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp + pool_align, sizeof( unsigned long long) ); 72759599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table[j]; 72859599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 72959599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table[j] += pool_align - (mem_address & (pool_align -1)); 73059599516SKenneth E. Jansen 73159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 73259599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 73359599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) + pool_align ); 73459599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table[j]; 73559599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 73659599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table[j] += pool_align - (mem_address & (pool_align -1)); 73759599516SKenneth E. Jansen } 73859599516SKenneth E. Jansen *filehandle = i; 73959599516SKenneth E. Jansen 74059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 74159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 74259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 74359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 74459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 74559599516SKenneth E. Jansen 74659599516SKenneth E. Jansen /* 74759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = 74859599516SKenneth E. Jansen ( char * ) calloc( MasterHeaderSize + pool_align, sizeof( char ) ); 74959599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->master_header; 75059599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 75159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header += pool_align - (mem_address & (pool_align -1)); 75259599516SKenneth E. Jansen 75359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = 75459599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 75559599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk; 75659599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 75759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1)); 75859599516SKenneth E. Jansen 75959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = 76059599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 76159599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk; 76259599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 76359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & (pool_align -1)); 76459599516SKenneth E. Jansen 76559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = 76659599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 76759599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_double_chunk; 76859599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 76959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk += pool_align - (mem_address & (pool_align -1)); 77059599516SKenneth E. Jansen 77159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = 77259599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 77359599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_int_chunk; 77459599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 77559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk += pool_align - (mem_address & (pool_align -1)); 77659599516SKenneth E. Jansen */ 77759599516SKenneth E. Jansen 77859599516SKenneth E. Jansen // Time monitoring 77959599516SKenneth E. Jansen endTimer(&timer_end); 78059599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 78159599516SKenneth E. Jansen 78259599516SKenneth E. Jansen phprintf_0("Info initphmpiio: quiting function"); 78359599516SKenneth E. Jansen 78459599516SKenneth E. Jansen return i; 78559599516SKenneth E. Jansen } 78659599516SKenneth E. Jansen 78759599516SKenneth E. Jansen /** 78859599516SKenneth E. Jansen * Destruct the file struct and free buffers allocated in init function. 78959599516SKenneth E. Jansen */ 79059599516SKenneth E. Jansen void finalizephmpiio( int *fileDescriptor ) 79159599516SKenneth E. Jansen { 79259599516SKenneth E. Jansen double timer_start, timer_end; 79359599516SKenneth E. Jansen startTimer(&timer_start); 79459599516SKenneth E. Jansen 79559599516SKenneth E. Jansen int i, j; 79659599516SKenneth E. Jansen i = *fileDescriptor; 79759599516SKenneth E. Jansen //PhastaIONextActiveIndex--; 79859599516SKenneth E. Jansen 79959599516SKenneth E. Jansen /* //free the offset table for this phasta file */ 80059599516SKenneth E. Jansen //for(j=0; j<MAX_FIELDS_NUMBER; j++) //Danger: undefined behavior for my_*_table.[j] not allocated or not initialized to NULL 80159599516SKenneth E. Jansen for(j=0; j<PhastaIOActiveFiles[i]->nFields; j++) 80259599516SKenneth E. Jansen { 80359599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_offset_table[j]); 80459599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]->my_read_table[j]); 80559599516SKenneth E. Jansen } 80659599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_offset_table ); 80759599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->my_read_table ); 80859599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->master_header ); 80959599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 81059599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 81159599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_double_chunk ); 81259599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->read_int_chunk ); 81359599516SKenneth E. Jansen 81459599516SKenneth E. Jansen free( PhastaIOActiveFiles[i]); 81559599516SKenneth E. Jansen 81659599516SKenneth E. Jansen endTimer(&timer_end); 81759599516SKenneth E. Jansen printPerf("finalizempiio", timer_start, timer_end, 0, 0, ""); 81859599516SKenneth E. Jansen 81959599516SKenneth E. Jansen PhastaIONextActiveIndex--; 82059599516SKenneth E. Jansen } 82159599516SKenneth E. Jansen 82259599516SKenneth E. Jansen 82359599516SKenneth E. Jansen /** 82459599516SKenneth E. Jansen * Special init for M2N in order to create a subcommunicator for the reduced solution (requires PRINT_PERF to be false for now) 82559599516SKenneth E. Jansen * Initialize the file struct members and allocate space for file struct buffers. 82659599516SKenneth E. Jansen * 82759599516SKenneth E. Jansen * Note: this function is only called when we are using new format. Old POSIX 82859599516SKenneth E. Jansen * format should skip this routine and call openfile() directly instead. 82959599516SKenneth E. Jansen */ 83059599516SKenneth E. Jansen int initphmpiiosub( int *nfields, int *nppf, int *nfiles, int *filehandle, const char mode[],MPI_Comm my_local_comm) 83159599516SKenneth E. Jansen { 83259599516SKenneth E. Jansen // we init irank again in case query not called (e.g. syncIO write case) 83359599516SKenneth E. Jansen 83459599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &irank); 83559599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &mysize); 83659599516SKenneth E. Jansen 83759599516SKenneth E. Jansen phprintf("Info initphmpiio: entering function, myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 83859599516SKenneth E. Jansen 83959599516SKenneth E. Jansen double timer_start, timer_end; 84059599516SKenneth E. Jansen startTimer(&timer_start); 84159599516SKenneth E. Jansen 84259599516SKenneth E. Jansen char* imode = StringStripper( mode ); 84359599516SKenneth E. Jansen 84459599516SKenneth E. Jansen // Note: if it's read, we presume query was called prior to init and 84559599516SKenneth E. Jansen // MasterHeaderSize is already set to correct value from parsing header 84659599516SKenneth E. Jansen // otherwise it's write then it needs some computation to be set 84759599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) { 84859599516SKenneth E. Jansen // do nothing 84959599516SKenneth E. Jansen } 85059599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) { 85159599516SKenneth E. Jansen MasterHeaderSize = computeMHSize(*nfields, *nppf, LATEST_WRITE_VERSION); 85259599516SKenneth E. Jansen } 85359599516SKenneth E. Jansen else { 85459599516SKenneth E. Jansen printf("Error initphmpiio: can't recognize the mode %s", imode); 85559599516SKenneth E. Jansen exit(1); 85659599516SKenneth E. Jansen } 85759599516SKenneth E. Jansen free ( imode ); 85859599516SKenneth E. Jansen 85959599516SKenneth E. Jansen phprintf("Info initphmpiio: myrank = %d, MasterHeaderSize = %d", irank, MasterHeaderSize); 86059599516SKenneth E. Jansen 86159599516SKenneth E. Jansen int i, j; 86259599516SKenneth E. Jansen 86359599516SKenneth E. Jansen if( PhastaIONextActiveIndex == MAX_PHASTA_FILES ) { 86459599516SKenneth E. Jansen printf("Error initphmpiio: PhastaIONextActiveIndex = MAX_PHASTA_FILES"); 86559599516SKenneth E. Jansen endTimer(&timer_end); 86659599516SKenneth E. Jansen printPerf("initphmpiio", timer_start, timer_end, 0, 0, ""); 86759599516SKenneth E. Jansen return MAX_PHASTA_FILES_EXCEEDED; 86859599516SKenneth E. Jansen } 86959599516SKenneth E. Jansen // else if( PhastaIONextActiveIndex == 0 ) //Hang in debug mode on Intrepid 87059599516SKenneth E. Jansen // { 87159599516SKenneth E. Jansen // for( i = 0; i < MAX_PHASTA_FILES; i++ ); 87259599516SKenneth E. Jansen // { 87359599516SKenneth E. Jansen // PhastaIOActiveFiles[i] = NULL; 87459599516SKenneth E. Jansen // } 87559599516SKenneth E. Jansen // } 87659599516SKenneth E. Jansen 87759599516SKenneth E. Jansen 87859599516SKenneth E. Jansen PhastaIOActiveFiles[PhastaIONextActiveIndex] = (phastaio_file_t *)calloc( 1, sizeof( phastaio_file_t) ); 87959599516SKenneth E. Jansen //PhastaIOActiveFiles[PhastaIONextActiveIndex] = ( phastaio_file_t *)calloc( 1 + 1, sizeof( phastaio_file_t ) ); 88059599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[PhastaIONextActiveIndex]; 88159599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 88259599516SKenneth E. Jansen // PhastaIOActiveFiles[PhastaIONextActiveIndex] += pool_align - (mem_address & (pool_align -1)); 88359599516SKenneth E. Jansen 88459599516SKenneth E. Jansen i = PhastaIONextActiveIndex; 88559599516SKenneth E. Jansen PhastaIONextActiveIndex++; 88659599516SKenneth E. Jansen 88759599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->next_start_address = 2*TWO_MEGABYTE; 88859599516SKenneth E. Jansen 88959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = MasterHeaderSize; // what does this mean??? TODO 89059599516SKenneth E. Jansen 89159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = false; 89259599516SKenneth E. Jansen 89359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = *nfields; 89459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF = *nppf; 89559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFiles = *nfiles; 89659599516SKenneth E. Jansen MPI_Comm_rank(my_local_comm, &(PhastaIOActiveFiles[i]->myrank)); 89759599516SKenneth E. Jansen MPI_Comm_size(my_local_comm, &(PhastaIOActiveFiles[i]->numprocs)); 89859599516SKenneth E. Jansen 89959599516SKenneth E. Jansen int color = computeColor(PhastaIOActiveFiles[i]->myrank, PhastaIOActiveFiles[i]->numprocs, PhastaIOActiveFiles[i]->nFiles); 90059599516SKenneth E. Jansen MPI_Comm_split(my_local_comm, 90159599516SKenneth E. Jansen color, 90259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank, 90359599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_comm)); 90459599516SKenneth E. Jansen MPI_Comm_size(PhastaIOActiveFiles[i]->local_comm, 90559599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_numprocs)); 90659599516SKenneth E. Jansen MPI_Comm_rank(PhastaIOActiveFiles[i]->local_comm, 90759599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->local_myrank)); 90859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp = 90959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF/PhastaIOActiveFiles[i]->local_numprocs; 91059599516SKenneth E. Jansen 91159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->start_id = PhastaIOActiveFiles[i]->nPPF * 91259599516SKenneth E. Jansen (int)(PhastaIOActiveFiles[i]->myrank/PhastaIOActiveFiles[i]->local_numprocs) + 91359599516SKenneth E. Jansen (PhastaIOActiveFiles[i]->local_myrank * PhastaIOActiveFiles[i]->nppp); 91459599516SKenneth E. Jansen 91559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table = 91659599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 91759599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof(unsigned long long *) ); 91859599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table; 91959599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 92059599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table += pool_align - (mem_address & (pool_align -1)); 92159599516SKenneth E. Jansen 92259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table = 92359599516SKenneth E. Jansen ( unsigned long long ** ) calloc( MAX_FIELDS_NUMBER , sizeof( unsigned long long *) ); 92459599516SKenneth E. Jansen //( unsigned long long **)calloc( MAX_FIELDS_NUMBER + pool_align, sizeof( unsigned long long *) ); 92559599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table; 92659599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 92759599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table += pool_align - (mem_address & (pool_align -1)); 92859599516SKenneth E. Jansen 92959599516SKenneth E. Jansen for (j=0; j<*nfields; j++) 93059599516SKenneth E. Jansen { 93159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[j] = 93259599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 93359599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp + pool_align, sizeof( unsigned long long) ); 93459599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_offset_table[j]; 93559599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 93659599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_offset_table[j] += pool_align - (mem_address & (pool_align -1)); 93759599516SKenneth E. Jansen 93859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j] = 93959599516SKenneth E. Jansen ( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) ); 94059599516SKenneth E. Jansen //( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nppp , sizeof( unsigned long long) + pool_align ); 94159599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->my_read_table[j]; 94259599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 94359599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->my_read_table[j] += pool_align - (mem_address & (pool_align -1)); 94459599516SKenneth E. Jansen } 94559599516SKenneth E. Jansen *filehandle = i; 94659599516SKenneth E. Jansen 94759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = (char *)calloc(MasterHeaderSize,sizeof( char )); 94859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = (double *)calloc(1,sizeof( double )); 94959599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = (int *)calloc(1,sizeof( int )); 95059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = (double *)calloc(1,sizeof( double )); 95159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = (int *)calloc(1,sizeof( int )); 95259599516SKenneth E. Jansen 95359599516SKenneth E. Jansen /* 95459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header = 95559599516SKenneth E. Jansen ( char * ) calloc( MasterHeaderSize + pool_align, sizeof( char ) ); 95659599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->master_header; 95759599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 95859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header += pool_align - (mem_address & (pool_align -1)); 95959599516SKenneth E. Jansen 96059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = 96159599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 96259599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk; 96359599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 96459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1)); 96559599516SKenneth E. Jansen 96659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = 96759599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 96859599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk; 96959599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 97059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & (pool_align -1)); 97159599516SKenneth E. Jansen 97259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk = 97359599516SKenneth E. Jansen ( double * ) calloc( 1 + pool_align , sizeof( double ) ); 97459599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_double_chunk; 97559599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 97659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_double_chunk += pool_align - (mem_address & (pool_align -1)); 97759599516SKenneth E. Jansen 97859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk = 97959599516SKenneth E. Jansen ( int * ) calloc( 1 + pool_align , sizeof( int ) ); 98059599516SKenneth E. Jansen mem_address = (long long )PhastaIOActiveFiles[i]->read_int_chunk; 98159599516SKenneth E. Jansen if( mem_address & (pool_align -1) ) 98259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_int_chunk += pool_align - (mem_address & (pool_align -1)); 98359599516SKenneth E. Jansen */ 98459599516SKenneth E. Jansen 98559599516SKenneth E. Jansen // Time monitoring 98659599516SKenneth E. Jansen endTimer(&timer_end); 98759599516SKenneth E. Jansen printPerf("initphmpiiosub", timer_start, timer_end, 0, 0, ""); 98859599516SKenneth E. Jansen 98959599516SKenneth E. Jansen phprintf_0("Info initphmpiiosub: quiting function"); 99059599516SKenneth E. Jansen 99159599516SKenneth E. Jansen return i; 99259599516SKenneth E. Jansen } 99359599516SKenneth E. Jansen 99459599516SKenneth E. Jansen 99559599516SKenneth E. Jansen 99659599516SKenneth E. Jansen /** open file for both POSIX and MPI-IO syncIO format. 99759599516SKenneth E. Jansen * 99859599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fopen(). 99959599516SKenneth E. Jansen * 100059599516SKenneth E. Jansen * If it's MPI-IO foramt: 100159599516SKenneth E. Jansen * in "read" mode, it builds the header table that points to the offset of 100259599516SKenneth E. Jansen * fields for parts; 100359599516SKenneth E. Jansen * in "write" mode, it opens the file with MPI-IO open routine. 100459599516SKenneth E. Jansen */ 100559599516SKenneth E. Jansen void openfile(const char filename[], 100659599516SKenneth E. Jansen const char mode[], 100759599516SKenneth E. Jansen int* fileDescriptor ) 100859599516SKenneth E. Jansen { 100959599516SKenneth E. Jansen phprintf_0("Info: entering openfile"); 101059599516SKenneth E. Jansen 101159599516SKenneth E. Jansen double timer_start, timer_end; 101259599516SKenneth E. Jansen startTimer(&timer_start); 101359599516SKenneth E. Jansen 101459599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) 101559599516SKenneth E. Jansen { 101659599516SKenneth E. Jansen FILE* file=NULL ; 101759599516SKenneth E. Jansen *fileDescriptor = 0; 101859599516SKenneth E. Jansen char* fname = StringStripper( filename ); 101959599516SKenneth E. Jansen char* imode = StringStripper( mode ); 102059599516SKenneth E. Jansen 102159599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) file = fopen(fname, "rb" ); 102259599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) file = fopen(fname, "wb" ); 102359599516SKenneth E. Jansen else if( cscompare( "append", imode ) ) file = fopen(fname, "ab" ); 102459599516SKenneth E. Jansen 102559599516SKenneth E. Jansen if ( !file ){ 102659599516SKenneth E. Jansen fprintf(stderr,"Error openfile: unable to open file %s",fname ) ; 102759599516SKenneth E. Jansen } else { 102859599516SKenneth E. Jansen fileArray.push_back( file ); 102959599516SKenneth E. Jansen byte_order.push_back( false ); 103059599516SKenneth E. Jansen header_type.push_back( sizeof(int) ); 103159599516SKenneth E. Jansen *fileDescriptor = fileArray.size(); 103259599516SKenneth E. Jansen } 103359599516SKenneth E. Jansen free (fname); 103459599516SKenneth E. Jansen free (imode); 103559599516SKenneth E. Jansen } 103659599516SKenneth E. Jansen else // else it would be parallel I/O, opposed to posix io 103759599516SKenneth E. Jansen { 103859599516SKenneth E. Jansen char* fname = StringStripper( filename ); 103959599516SKenneth E. Jansen char* imode = StringStripper( mode ); 104059599516SKenneth E. Jansen int rc; 104159599516SKenneth E. Jansen int i = *fileDescriptor; 104259599516SKenneth E. Jansen checkFileDescriptor("openfile",&i); 104359599516SKenneth E. Jansen char* token; 104459599516SKenneth E. Jansen 104559599516SKenneth E. Jansen if ( cscompare( "read", imode ) ) 104659599516SKenneth E. Jansen { 104759599516SKenneth E. Jansen // if (PhastaIOActiveFiles[i]->myrank == 0) 104859599516SKenneth E. Jansen // printf("\n **********\nRead open ... ... regular version\n"); 104959599516SKenneth E. Jansen 105059599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 105159599516SKenneth E. Jansen fname, 105259599516SKenneth E. Jansen MPI_MODE_RDONLY, 105359599516SKenneth E. Jansen MPI_INFO_NULL, 105459599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 105559599516SKenneth E. Jansen 105659599516SKenneth E. Jansen if(rc) 105759599516SKenneth E. Jansen { 105859599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 105959599516SKenneth E. Jansen printf("Error openfile: Unable to open file %s! File descriptor = %d\n",fname,*fileDescriptor); 106059599516SKenneth E. Jansen endTimer(&timer_end); 106159599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 106259599516SKenneth E. Jansen return; 106359599516SKenneth E. Jansen } 106459599516SKenneth E. Jansen 106559599516SKenneth E. Jansen MPI_Status read_tag_status; 106659599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 106759599516SKenneth E. Jansen int j; 106859599516SKenneth E. Jansen int magic_number; 106959599516SKenneth E. Jansen 107059599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 107159599516SKenneth E. Jansen MPI_File_read_at( PhastaIOActiveFiles[i]->file_handle, 107259599516SKenneth E. Jansen 0, 107359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 107459599516SKenneth E. Jansen MasterHeaderSize, 107559599516SKenneth E. Jansen MPI_CHAR, 107659599516SKenneth E. Jansen &read_tag_status ); 107759599516SKenneth E. Jansen } 107859599516SKenneth E. Jansen 107959599516SKenneth E. Jansen MPI_Bcast( PhastaIOActiveFiles[i]->master_header, 108059599516SKenneth E. Jansen MasterHeaderSize, 108159599516SKenneth E. Jansen MPI_CHAR, 108259599516SKenneth E. Jansen 0, 108359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 108459599516SKenneth E. Jansen 108559599516SKenneth E. Jansen memcpy( read_out_tag, 108659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 108759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 108859599516SKenneth E. Jansen 108959599516SKenneth E. Jansen if ( cscompare ("MPI_IO_Tag",read_out_tag) ) 109059599516SKenneth E. Jansen { 109159599516SKenneth E. Jansen // Test endianess ... 109259599516SKenneth E. Jansen memcpy ( &magic_number, 109359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 109459599516SKenneth E. Jansen sizeof(int) ); // masterheader should look like "MPI_IO_Tag : 12180 " with 12180 in binary format 109559599516SKenneth E. Jansen 109659599516SKenneth E. Jansen if ( magic_number != ENDIAN_TEST_NUMBER ) 109759599516SKenneth E. Jansen { 109859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->Wrong_Endian = true; 109959599516SKenneth E. Jansen } 110059599516SKenneth E. Jansen 110159599516SKenneth E. Jansen memcpy( read_out_tag, 110259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH+1, // TODO: WHY +1??? 110359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH ); 110459599516SKenneth E. Jansen 110559599516SKenneth E. Jansen // Read in # fields ... 110659599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 110759599516SKenneth E. Jansen token = strtok( NULL," ,;<>" ); 110859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields = atoi( token ); 110959599516SKenneth E. Jansen 111059599516SKenneth E. Jansen unsigned long long **header_table; 111159599516SKenneth E. Jansen header_table = ( unsigned long long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long long *)); 111259599516SKenneth E. Jansen //header_table = ( unsigned long long ** ) calloc( PhastaIOActiveFiles[i]->nFields + pool_align, sizeof(unsigned long long *)); 111359599516SKenneth E. Jansen //mem_address = (long long )header_table; 111459599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 111559599516SKenneth E. Jansen // header_table += pool_align - (mem_address & (pool_align -1)); 111659599516SKenneth E. Jansen 111759599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 111859599516SKenneth E. Jansen { 111959599516SKenneth E. Jansen header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long long)); 112059599516SKenneth E. Jansen //header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF + pool_align, sizeof(unsigned long long *)); 112159599516SKenneth E. Jansen //mem_address = (long long )header_table[j]; 112259599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 112359599516SKenneth E. Jansen // header_table[j] += pool_align - (mem_address & (pool_align -1)); 112459599516SKenneth E. Jansen } 112559599516SKenneth E. Jansen 112659599516SKenneth E. Jansen // Read in the offset table ... 112759599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) 112859599516SKenneth E. Jansen { 112959599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 113059599516SKenneth E. Jansen memcpy( header_table[j], 113159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + 113259599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 113359599516SKenneth E. Jansen j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long), 113459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long) ); 113559599516SKenneth E. Jansen } 113659599516SKenneth E. Jansen 113759599516SKenneth E. Jansen MPI_Scatter( header_table[j], 113859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 113959599516SKenneth E. Jansen MPI_LONG_LONG_INT, 114059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[j], 114159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 114259599516SKenneth E. Jansen MPI_LONG_LONG_INT, 114359599516SKenneth E. Jansen 0, 114459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 114559599516SKenneth E. Jansen 114659599516SKenneth E. Jansen // Swap byte order if endianess is different ... 114759599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) { 114859599516SKenneth E. Jansen SwapArrayByteOrder( PhastaIOActiveFiles[i]->my_read_table[j], 114959599516SKenneth E. Jansen sizeof(long long int), 115059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ); 115159599516SKenneth E. Jansen } 115259599516SKenneth E. Jansen } 115359599516SKenneth E. Jansen 115459599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 115559599516SKenneth E. Jansen free ( header_table[j] ); 115659599516SKenneth E. Jansen } 115759599516SKenneth E. Jansen free (header_table); 115859599516SKenneth E. Jansen 115959599516SKenneth E. Jansen } // end of if MPI_IO_TAG 116059599516SKenneth E. Jansen else //else not valid MPI file 116159599516SKenneth E. Jansen { 116259599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 116359599516SKenneth 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); 116459599516SKenneth E. Jansen //Printing MasterHeaderSize is useful to test a compiler bug on Intrepid BGP 116559599516SKenneth E. Jansen endTimer(&timer_end); 116659599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 116759599516SKenneth E. Jansen return; 116859599516SKenneth E. Jansen } 116959599516SKenneth E. Jansen } // end of if "read" 117059599516SKenneth E. Jansen else if( cscompare( "write", imode ) ) 117159599516SKenneth E. Jansen { 117259599516SKenneth E. Jansen rc = MPI_File_open( PhastaIOActiveFiles[i]->local_comm, 117359599516SKenneth E. Jansen fname, 117459599516SKenneth E. Jansen MPI_MODE_WRONLY | MPI_MODE_CREATE, 117559599516SKenneth E. Jansen MPI_INFO_NULL, 117659599516SKenneth E. Jansen &(PhastaIOActiveFiles[i]->file_handle) ); 117759599516SKenneth E. Jansen if(rc) 117859599516SKenneth E. Jansen { 117959599516SKenneth E. Jansen *fileDescriptor = UNABLE_TO_OPEN_FILE; 118059599516SKenneth E. Jansen return; 118159599516SKenneth E. Jansen } 118259599516SKenneth E. Jansen } // end of if "write" 118359599516SKenneth E. Jansen free (fname); 118459599516SKenneth E. Jansen free (imode); 118559599516SKenneth E. Jansen } // end of if FileIndex != 0 118659599516SKenneth E. Jansen 118759599516SKenneth E. Jansen endTimer(&timer_end); 118859599516SKenneth E. Jansen printPerf("openfile", timer_start, timer_end, 0, 0, ""); 118959599516SKenneth E. Jansen } 119059599516SKenneth E. Jansen 119159599516SKenneth E. Jansen /** close file for both POSIX and MPI-IO syncIO format. 119259599516SKenneth E. Jansen * 119359599516SKenneth E. Jansen * If it's old POSIX format, simply call posix fclose(). 119459599516SKenneth E. Jansen * 119559599516SKenneth E. Jansen * If it's MPI-IO foramt: 119659599516SKenneth E. Jansen * in "read" mode, it simply close file with MPI-IO close routine. 119759599516SKenneth E. Jansen * in "write" mode, rank 0 in each group will re-assemble the master header and 119859599516SKenneth E. Jansen * offset table and write to the beginning of file, then close the file. 119959599516SKenneth E. Jansen */ 120059599516SKenneth E. Jansen void closefile( int* fileDescriptor, 120159599516SKenneth E. Jansen const char mode[] ) 120259599516SKenneth E. Jansen { 120359599516SKenneth E. Jansen double timer_start, timer_end; 120459599516SKenneth E. Jansen startTimer(&timer_start); 120559599516SKenneth E. Jansen 120659599516SKenneth E. Jansen int i = *fileDescriptor; 120759599516SKenneth E. Jansen checkFileDescriptor("closefile",&i); 120859599516SKenneth E. Jansen 120959599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 121059599516SKenneth E. Jansen char* imode = StringStripper( mode ); 121159599516SKenneth E. Jansen 121259599516SKenneth E. Jansen if( cscompare( "write", imode ) 121359599516SKenneth E. Jansen || cscompare( "append", imode ) ) { 121459599516SKenneth E. Jansen fflush( fileArray[ *fileDescriptor - 1 ] ); 121559599516SKenneth E. Jansen } 121659599516SKenneth E. Jansen 121759599516SKenneth E. Jansen fclose( fileArray[ *fileDescriptor - 1 ] ); 121859599516SKenneth E. Jansen free (imode); 1219ceb6e96dSCameron Smith for (mic::iterator it=LastHeaderKey.begin(); it!=LastHeaderKey.end(); ++it) 1220ceb6e96dSCameron Smith free(it->second); 122159599516SKenneth E. Jansen } 122259599516SKenneth E. Jansen else { 122359599516SKenneth E. Jansen char* imode = StringStripper( mode ); 122459599516SKenneth E. Jansen 122559599516SKenneth E. Jansen //write master header here: 122659599516SKenneth E. Jansen if ( cscompare( "write", imode ) ) { 122759599516SKenneth E. Jansen // if ( PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields < 2*ONE_MEGABYTE/8 ) //SHOULD BE CHECKED 122859599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE; 122959599516SKenneth E. Jansen // else 123059599516SKenneth E. Jansen // MasterHeaderSize = 4*ONE_MEGABYTE + PhastaIOActiveFiles[i]->nPPF * PhastaIOActiveFiles[i]->nFields * 8 - 2*ONE_MEGABYTE; 123159599516SKenneth E. Jansen 123259599516SKenneth E. Jansen MasterHeaderSize = computeMHSize( PhastaIOActiveFiles[i]->nFields, PhastaIOActiveFiles[i]->nPPF, LATEST_WRITE_VERSION); 123359599516SKenneth E. Jansen phprintf_0("Info closefile: myrank = %d, MasterHeaderSize = %d\n", PhastaIOActiveFiles[i]->myrank, MasterHeaderSize); 123459599516SKenneth E. Jansen 123559599516SKenneth E. Jansen MPI_Status write_header_status; 123659599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 123759599516SKenneth E. Jansen char version[MAX_FIELDS_NAME_LENGTH/4]; 123859599516SKenneth E. Jansen char mhsize[MAX_FIELDS_NAME_LENGTH/4]; 123959599516SKenneth E. Jansen int magic_number = ENDIAN_TEST_NUMBER; 124059599516SKenneth E. Jansen 124159599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) 124259599516SKenneth E. Jansen { 124359599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 124459599516SKenneth E. Jansen sprintf(mpi_tag, "MPI_IO_Tag : "); 124559599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header, 124659599516SKenneth E. Jansen mpi_tag, 124759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 124859599516SKenneth E. Jansen 124959599516SKenneth E. Jansen bzero((void*)version,MAX_FIELDS_NAME_LENGTH/4); 125059599516SKenneth E. Jansen // this version is "1", print version in ASCII 125159599516SKenneth E. Jansen sprintf(version, "version : %d",1); 125259599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/2, 125359599516SKenneth E. Jansen version, 125459599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 125559599516SKenneth E. Jansen 125659599516SKenneth E. Jansen // master header size is computed using the formula above 125759599516SKenneth E. Jansen bzero((void*)mhsize,MAX_FIELDS_NAME_LENGTH/4); 125859599516SKenneth E. Jansen sprintf(mhsize, "mhsize : "); 125959599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header + MAX_FIELDS_NAME_LENGTH/4*3, 126059599516SKenneth E. Jansen mhsize, 126159599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH/4); 126259599516SKenneth E. Jansen 126359599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 126459599516SKenneth E. Jansen sprintf(mpi_tag, 126559599516SKenneth E. Jansen "\nnFields : %d\n", 126659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields); 126759599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->master_header+MAX_FIELDS_NAME_LENGTH, 126859599516SKenneth E. Jansen mpi_tag, 126959599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 127059599516SKenneth E. Jansen 127159599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 127259599516SKenneth E. Jansen sprintf(mpi_tag, "\nnPPF : %d\n", PhastaIOActiveFiles[i]->nPPF); 127359599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+ 127459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nFields * 127559599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 127659599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 127759599516SKenneth E. Jansen mpi_tag, 127859599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH); 127959599516SKenneth E. Jansen 128059599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("MPI_IO_Tag : ")-1, //-1 sizeof returns the size of the string+1 for "\0" 128159599516SKenneth E. Jansen &magic_number, 128259599516SKenneth E. Jansen sizeof(int)); 128359599516SKenneth E. Jansen 128459599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header+sizeof("mhsize : ") -1 + MAX_FIELDS_NAME_LENGTH/4*3, 128559599516SKenneth E. Jansen &MasterHeaderSize, 128659599516SKenneth E. Jansen sizeof(int)); 128759599516SKenneth E. Jansen } 128859599516SKenneth E. Jansen 128959599516SKenneth E. Jansen int j = 0; 129059599516SKenneth E. Jansen unsigned long long **header_table; 129159599516SKenneth E. Jansen header_table = ( unsigned long long ** )calloc(PhastaIOActiveFiles[i]->nFields, sizeof(unsigned long long *)); 129259599516SKenneth E. Jansen //header_table = ( unsigned long long ** ) calloc( PhastaIOActiveFiles[i]->nFields + pool_align, sizeof(unsigned long long *)); 129359599516SKenneth E. Jansen //mem_address = (long long )header_table; 129459599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 129559599516SKenneth E. Jansen // header_table += pool_align - (mem_address & (pool_align -1)); 129659599516SKenneth E. Jansen 129759599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 129859599516SKenneth E. Jansen header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF , sizeof( unsigned long long)); 129959599516SKenneth E. Jansen //header_table[j]=( unsigned long long * ) calloc( PhastaIOActiveFiles[i]->nPPF + pool_align, sizeof (unsigned long long *)); 130059599516SKenneth E. Jansen //mem_address = (long long )header_table[j]; 130159599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 130259599516SKenneth E. Jansen // header_table[j] += pool_align - (mem_address & (pool_align - 1)); 130359599516SKenneth E. Jansen } 130459599516SKenneth E. Jansen 130559599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna mpi_gather, myrank = %d\n", irank); 130659599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 130759599516SKenneth E. Jansen MPI_Gather( PhastaIOActiveFiles[i]->my_offset_table[j], 130859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 130959599516SKenneth E. Jansen MPI_LONG_LONG_INT, 131059599516SKenneth E. Jansen header_table[j], 131159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp, 131259599516SKenneth E. Jansen MPI_LONG_LONG_INT, 131359599516SKenneth E. Jansen 0, 131459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 131559599516SKenneth E. Jansen } 131659599516SKenneth E. Jansen 131759599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 131859599516SKenneth E. Jansen 131959599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna memcpy for every procs, myrank = %d\n", irank); 132059599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 132159599516SKenneth E. Jansen memcpy ( PhastaIOActiveFiles[i]->master_header + 132259599516SKenneth E. Jansen VERSION_INFO_HEADER_SIZE + 132359599516SKenneth E. Jansen j * PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long), 132459599516SKenneth E. Jansen header_table[j], 132559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nPPF * sizeof(unsigned long long) ); 132659599516SKenneth E. Jansen } 132759599516SKenneth E. Jansen 132859599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_write_at(), myrank = %d\n", irank); 132959599516SKenneth E. Jansen MPI_File_write_at( PhastaIOActiveFiles[i]->file_handle, 133059599516SKenneth E. Jansen 0, 133159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header, 133259599516SKenneth E. Jansen MasterHeaderSize, 133359599516SKenneth E. Jansen MPI_CHAR, 133459599516SKenneth E. Jansen &write_header_status ); 133559599516SKenneth E. Jansen } 133659599516SKenneth E. Jansen 133759599516SKenneth E. Jansen ////free(PhastaIOActiveFiles[i]->master_header); 133859599516SKenneth E. Jansen 133959599516SKenneth E. Jansen for ( j = 0; j < PhastaIOActiveFiles[i]->nFields; j++ ) { 134059599516SKenneth E. Jansen free ( header_table[j] ); 134159599516SKenneth E. Jansen } 134259599516SKenneth E. Jansen free (header_table); 134359599516SKenneth E. Jansen } 134459599516SKenneth E. Jansen 134559599516SKenneth E. Jansen //if( irank == 0 ) printf("gonna file_close(), myrank = %d\n", irank); 134659599516SKenneth E. Jansen MPI_File_close( &( PhastaIOActiveFiles[i]->file_handle ) ); 134759599516SKenneth E. Jansen free ( imode ); 134859599516SKenneth E. Jansen } 134959599516SKenneth E. Jansen 135059599516SKenneth E. Jansen endTimer(&timer_end); 135159599516SKenneth E. Jansen printPerf("closefile_", timer_start, timer_end, 0, 0, ""); 135259599516SKenneth E. Jansen } 135359599516SKenneth E. Jansen 135459599516SKenneth E. Jansen void readheader( int* fileDescriptor, 135559599516SKenneth E. Jansen const char keyphrase[], 135659599516SKenneth E. Jansen void* valueArray, 135759599516SKenneth E. Jansen int* nItems, 135859599516SKenneth E. Jansen const char datatype[], 135959599516SKenneth E. Jansen const char iotype[] ) 136059599516SKenneth E. Jansen { 136159599516SKenneth E. Jansen double timer_start, timer_end; 1362d3337298SCameron Smith 136359599516SKenneth E. Jansen startTimer(&timer_start); 136459599516SKenneth E. Jansen 136559599516SKenneth E. Jansen int i = *fileDescriptor; 136659599516SKenneth E. Jansen checkFileDescriptor("readheader",&i); 136759599516SKenneth E. Jansen 136859599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 136959599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 137059599516SKenneth E. Jansen FILE* fileObject; 137159599516SKenneth E. Jansen int* valueListInt; 137259599516SKenneth E. Jansen 137359599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 137459599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 137559599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 137659599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 137759599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 137859599516SKenneth E. Jansen endTimer(&timer_end); 137959599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 138059599516SKenneth E. Jansen return; 138159599516SKenneth E. Jansen } 138259599516SKenneth E. Jansen 1383ceb6e96dSCameron Smith if( LastHeaderKey.count(filePtr) ) 1384ceb6e96dSCameron Smith free(LastHeaderKey[filePtr]); 1385ceb6e96dSCameron Smith const int l = strlen(keyphrase)+1; 1386ceb6e96dSCameron Smith LastHeaderKey[filePtr] = (char*) malloc(l*sizeof(char)); 1387ceb6e96dSCameron Smith strcpy(LastHeaderKey[filePtr], keyphrase); 138859599516SKenneth E. Jansen LastHeaderNotFound = false; 138959599516SKenneth E. Jansen 139059599516SKenneth E. Jansen fileObject = fileArray[ filePtr ] ; 139159599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 139259599516SKenneth E. Jansen 139359599516SKenneth E. Jansen isBinary( iotype ); 139459599516SKenneth E. Jansen typeSize( datatype ); //redundant call, just avoid a compiler warning. 139559599516SKenneth E. Jansen 139659599516SKenneth E. Jansen // right now we are making the assumption that we will only write integers 139759599516SKenneth E. Jansen // on the header line. 139859599516SKenneth E. Jansen 139959599516SKenneth E. Jansen valueListInt = static_cast< int* >( valueArray ); 140059599516SKenneth E. Jansen int ierr = readHeader( fileObject , 140159599516SKenneth E. Jansen keyphrase, 140259599516SKenneth E. Jansen valueListInt, 140359599516SKenneth E. Jansen *nItems ) ; 140459599516SKenneth E. Jansen 140559599516SKenneth E. Jansen byte_order[ filePtr ] = Wrong_Endian ; 140659599516SKenneth E. Jansen 140759599516SKenneth E. Jansen if ( ierr ) LastHeaderNotFound = true; 140859599516SKenneth E. Jansen 140959599516SKenneth E. Jansen //return ; // don't return, go to the end to print perf 141059599516SKenneth E. Jansen } 141159599516SKenneth E. Jansen else { 141259599516SKenneth E. Jansen unsigned int skip_size; 141359599516SKenneth E. Jansen int* valueListInt; 141459599516SKenneth E. Jansen valueListInt = static_cast <int*>(valueArray); 1415*400e9fc0SCameron Smith char* token = NULL; 141659599516SKenneth E. Jansen bool FOUND = false ; 141759599516SKenneth E. Jansen isBinary( iotype ); 141859599516SKenneth E. Jansen 141959599516SKenneth E. Jansen MPI_Status read_offset_status; 142059599516SKenneth E. Jansen char read_out_tag[MAX_FIELDS_NAME_LENGTH]; 1421*400e9fc0SCameron Smith memset(read_out_tag, '\0', MAX_FIELDS_NAME_LENGTH); 142259599516SKenneth E. Jansen char readouttag[MAX_FIELDS_NUMBER][MAX_FIELDS_NAME_LENGTH]; 142359599516SKenneth E. Jansen int j; 142459599516SKenneth E. Jansen 142559599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 142659599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 142759599516SKenneth E. Jansen //char* buffer = ( char * ) malloc( string_length + 1 + pool_align ); 142859599516SKenneth E. Jansen //mem_address = (long long )buffer; 142959599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 143059599516SKenneth E. Jansen // buffer += pool_align - (mem_address & (pool_align -1)); 143159599516SKenneth E. Jansen 143259599516SKenneth E. Jansen strcpy ( buffer, keyphrase ); 143359599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 143459599516SKenneth E. Jansen 143559599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 143659599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 143759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 143859599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 143959599516SKenneth E. Jansen *p = '\0'; 144059599516SKenneth E. Jansen 144159599516SKenneth E. Jansen // Check if the user has input the right GPid 144259599516SKenneth E. Jansen if ( ( PhastaIOActiveFiles[i]->GPid <= 144359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * 144459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp )|| 144559599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->GPid > 144659599516SKenneth E. Jansen ( PhastaIOActiveFiles[i]->myrank + 1 ) * 144759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->nppp ) ) 144859599516SKenneth E. Jansen { 144959599516SKenneth E. Jansen *fileDescriptor = NOT_A_MPI_FILE; 145059599516SKenneth 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); 145159599516SKenneth E. Jansen // It is possible atoi could not generate a clear integer from st2 because of additional garbage character in keyphrase 145259599516SKenneth E. Jansen endTimer(&timer_end); 145359599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 145459599516SKenneth E. Jansen return; 145559599516SKenneth E. Jansen } 145659599516SKenneth E. Jansen 145759599516SKenneth E. Jansen // Find the field we want ... 145859599516SKenneth E. Jansen //for ( j = 0; j<MAX_FIELDS_NUMBER; j++ ) 145959599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 146059599516SKenneth E. Jansen { 146159599516SKenneth E. Jansen memcpy( readouttag[j], 146259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->master_header + j*MAX_FIELDS_NAME_LENGTH+MAX_FIELDS_NAME_LENGTH*2+1, 146359599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1 ); 146459599516SKenneth E. Jansen } 146559599516SKenneth E. Jansen 146659599516SKenneth E. Jansen for ( j = 0; j<PhastaIOActiveFiles[i]->nFields; j++ ) 146759599516SKenneth E. Jansen { 146859599516SKenneth E. Jansen token = strtok ( readouttag[j], ":" ); 146959599516SKenneth E. Jansen 147059599516SKenneth E. Jansen //if ( cscompare( buffer, token ) ) 147159599516SKenneth E. Jansen if ( cscompare( token , buffer ) && cscompare( buffer, token ) ) 147259599516SKenneth 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"). 147359599516SKenneth 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). 147459599516SKenneth 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. 147559599516SKenneth E. Jansen { 147659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_field_count = j; 147759599516SKenneth E. Jansen FOUND = true; 147859599516SKenneth E. Jansen //printf("buffer: %s | token: %s | j: %d\n",buffer,token,j); 147959599516SKenneth E. Jansen break; 148059599516SKenneth E. Jansen } 148159599516SKenneth E. Jansen } 148259599516SKenneth E. Jansen free(buffer); 148359599516SKenneth E. Jansen 148459599516SKenneth E. Jansen if (!FOUND) 148559599516SKenneth E. Jansen { 148659599516SKenneth E. Jansen //if(irank==0) printf("Warning readheader: Not found %s \n",keyphrase); //PhastaIOActiveFiles[i]->myrank is certainly initialized here. 148759599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) printf("WARNING readheader: Not found %s\n",keyphrase); 148859599516SKenneth E. Jansen endTimer(&timer_end); 148959599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 149059599516SKenneth E. Jansen return; 149159599516SKenneth E. Jansen } 149259599516SKenneth E. Jansen 149359599516SKenneth E. Jansen // Find the part we want ... 149459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->read_part_count = PhastaIOActiveFiles[i]->GPid - 149559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->myrank * PhastaIOActiveFiles[i]->nppp - 1; 149659599516SKenneth E. Jansen 149759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = 149859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_read_table[PhastaIOActiveFiles[i]->read_field_count][PhastaIOActiveFiles[i]->read_part_count]; 149959599516SKenneth E. Jansen 150059599516SKenneth E. Jansen // printf("****Rank %d offset is %d\n",PhastaIOActiveFiles[i]->myrank,PhastaIOActiveFiles[i]->my_offset); 150159599516SKenneth E. Jansen 150259599516SKenneth E. Jansen // Read each datablock header here ... 150359599516SKenneth E. Jansen 150459599516SKenneth E. Jansen MPI_File_read_at_all( PhastaIOActiveFiles[i]->file_handle, 150559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset+1, 150659599516SKenneth E. Jansen read_out_tag, 150759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1, 150859599516SKenneth E. Jansen MPI_CHAR, 150959599516SKenneth E. Jansen &read_offset_status ); 151059599516SKenneth E. Jansen token = strtok ( read_out_tag, ":" ); 151159599516SKenneth E. Jansen 151259599516SKenneth E. Jansen // printf("&&&&Rank %d read_out_tag is %s\n",PhastaIOActiveFiles[i]->myrank,read_out_tag); 151359599516SKenneth E. Jansen 151459599516SKenneth 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. 151559599516SKenneth E. Jansen { 151659599516SKenneth E. Jansen FOUND = true ; 151759599516SKenneth E. Jansen token = strtok( NULL, " ,;<>" ); 151859599516SKenneth E. Jansen skip_size = atoi( token ); 151959599516SKenneth E. Jansen for( j=0; j < *nItems && ( token = strtok( NULL," ,;<>") ); j++ ) 152059599516SKenneth E. Jansen valueListInt[j] = atoi( token ); 152159599516SKenneth E. Jansen 152259599516SKenneth E. Jansen if ( j < *nItems ) 152359599516SKenneth E. Jansen { 152459599516SKenneth E. Jansen fprintf( stderr, "Expected # of ints not found for: %s\n", keyphrase ); 152559599516SKenneth E. Jansen } 152659599516SKenneth E. Jansen } 152759599516SKenneth E. Jansen else { 152859599516SKenneth E. Jansen //if(irank==0) 152959599516SKenneth E. Jansen if(PhastaIOActiveFiles[i]->myrank == 0) 153059599516SKenneth E. Jansen // If we enter this if, there is a problem with the name of some fields 153159599516SKenneth E. Jansen { 153259599516SKenneth E. Jansen printf("Error readheader: Unexpected mismatch between keyphrase = %s and token = %s\n",keyphrase,token); 153359599516SKenneth E. Jansen } 153459599516SKenneth E. Jansen } 153559599516SKenneth E. Jansen } 153659599516SKenneth E. Jansen 153759599516SKenneth E. Jansen endTimer(&timer_end); 153859599516SKenneth E. Jansen printPerf("readheader", timer_start, timer_end, 0, 0, ""); 153959599516SKenneth E. Jansen 154059599516SKenneth E. Jansen } 154159599516SKenneth E. Jansen 154259599516SKenneth E. Jansen void readdatablock( int* fileDescriptor, 154359599516SKenneth E. Jansen const char keyphrase[], 154459599516SKenneth E. Jansen void* valueArray, 154559599516SKenneth E. Jansen int* nItems, 154659599516SKenneth E. Jansen const char datatype[], 154759599516SKenneth E. Jansen const char iotype[] ) 154859599516SKenneth E. Jansen { 154959599516SKenneth E. Jansen //if(irank == 0) printf("entering readdatablock()\n"); 155059599516SKenneth E. Jansen unsigned long long data_size = 0; 155159599516SKenneth E. Jansen double timer_start, timer_end; 155259599516SKenneth E. Jansen startTimer(&timer_start); 155359599516SKenneth E. Jansen 155459599516SKenneth E. Jansen int i = *fileDescriptor; 155559599516SKenneth E. Jansen checkFileDescriptor("readdatablock",&i); 155659599516SKenneth E. Jansen 155759599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 155859599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 155959599516SKenneth E. Jansen FILE* fileObject; 156059599516SKenneth E. Jansen char junk; 156159599516SKenneth E. Jansen 156259599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 156359599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 156459599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before\n") ; 156559599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 156659599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 156759599516SKenneth E. Jansen endTimer(&timer_end); 156859599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 156959599516SKenneth E. Jansen return; 157059599516SKenneth E. Jansen } 157159599516SKenneth E. Jansen 157259599516SKenneth E. Jansen // error check.. 157359599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 157459599516SKenneth E. Jansen // let us check to see that it is actually the case. 157559599516SKenneth E. Jansen 157659599516SKenneth E. Jansen if ( ! cscompare( LastHeaderKey[ filePtr ], keyphrase ) ) { 157759599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 157859599516SKenneth E. Jansen fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ] ); 157959599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 158059599516SKenneth E. Jansen fprintf(stderr, "Please recheck read sequence \n"); 158159599516SKenneth E. Jansen if( Strict_Error ) { 158259599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 158359599516SKenneth E. Jansen endTimer(&timer_end); 158459599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 158559599516SKenneth E. Jansen return; 158659599516SKenneth E. Jansen } 158759599516SKenneth E. Jansen } 158859599516SKenneth E. Jansen 158959599516SKenneth E. Jansen if ( LastHeaderNotFound ) { 159059599516SKenneth E. Jansen endTimer(&timer_end); 159159599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 159259599516SKenneth E. Jansen return; 159359599516SKenneth E. Jansen } 159459599516SKenneth E. Jansen fileObject = fileArray[ filePtr ]; 159559599516SKenneth E. Jansen Wrong_Endian = byte_order[ filePtr ]; 159659599516SKenneth E. Jansen 159759599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 159859599516SKenneth E. Jansen int nUnits = *nItems; 159959599516SKenneth E. Jansen isBinary( iotype ); 160059599516SKenneth E. Jansen 160159599516SKenneth E. Jansen if ( binary_format ) { 160259599516SKenneth E. Jansen fread( valueArray, type_size, nUnits, fileObject ); 160359599516SKenneth E. Jansen fread( &junk, sizeof(char), 1 , fileObject ); 160459599516SKenneth E. Jansen if ( Wrong_Endian ) SwapArrayByteOrder( valueArray, type_size, nUnits ); 160559599516SKenneth E. Jansen } else { 160659599516SKenneth E. Jansen 160759599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 160859599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 160959599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 161059599516SKenneth E. Jansen fscanf(fileObject, "%d\n",(int*)((int*)valueArray+n) ); 161159599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 161259599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 161359599516SKenneth E. Jansen fscanf(fileObject, "%lf\n",(double*)((double*)valueArray+n) ); 161459599516SKenneth E. Jansen } 161559599516SKenneth E. Jansen free (ts1); 161659599516SKenneth E. Jansen } 161759599516SKenneth E. Jansen 161859599516SKenneth E. Jansen //return; 161959599516SKenneth E. Jansen } 162059599516SKenneth E. Jansen else { 162159599516SKenneth E. Jansen // printf("read data block\n"); 162259599516SKenneth E. Jansen MPI_Status read_data_status; 162359599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 162459599516SKenneth E. Jansen int nUnits = *nItems; 162559599516SKenneth E. Jansen isBinary( iotype ); 162659599516SKenneth E. Jansen 162759599516SKenneth E. Jansen // read datablock then 162859599516SKenneth E. Jansen //MR CHANGE 162959599516SKenneth E. Jansen // if ( cscompare ( datatype, "double")) 163059599516SKenneth E. Jansen char* ts2 = StringStripper( datatype ); 163159599516SKenneth E. Jansen if ( cscompare ( "double" , ts2)) 163259599516SKenneth E. Jansen //MR CHANGE END 163359599516SKenneth E. Jansen { 163459599516SKenneth E. Jansen 163559599516SKenneth E. Jansen MPI_File_read_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 163659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 163759599516SKenneth E. Jansen valueArray, 163859599516SKenneth E. Jansen nUnits, 163959599516SKenneth E. Jansen MPI_DOUBLE ); 164059599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 164159599516SKenneth E. Jansen valueArray, 164259599516SKenneth E. Jansen &read_data_status ); 164359599516SKenneth E. Jansen data_size=8*nUnits; 164459599516SKenneth E. Jansen 164559599516SKenneth E. Jansen } 164659599516SKenneth E. Jansen //MR CHANGE 164759599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 164859599516SKenneth E. Jansen else if ( cscompare ( "integer" , ts2)) 164959599516SKenneth E. Jansen //MR CHANGE END 165059599516SKenneth E. Jansen { 165159599516SKenneth E. Jansen MPI_File_read_at_all_begin(PhastaIOActiveFiles[i]->file_handle, 165259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset + DB_HEADER_SIZE, 165359599516SKenneth E. Jansen valueArray, 165459599516SKenneth E. Jansen nUnits, 165559599516SKenneth E. Jansen MPI_INT ); 165659599516SKenneth E. Jansen MPI_File_read_at_all_end( PhastaIOActiveFiles[i]->file_handle, 165759599516SKenneth E. Jansen valueArray, 165859599516SKenneth E. Jansen &read_data_status ); 165959599516SKenneth E. Jansen data_size=4*nUnits; 166059599516SKenneth E. Jansen } 166159599516SKenneth E. Jansen else 166259599516SKenneth E. Jansen { 166359599516SKenneth E. Jansen *fileDescriptor = DATA_TYPE_ILLEGAL; 166459599516SKenneth E. Jansen printf("readdatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 166559599516SKenneth E. Jansen endTimer(&timer_end); 166659599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, 0, 0, ""); 166759599516SKenneth E. Jansen return; 166859599516SKenneth E. Jansen } 166959599516SKenneth E. Jansen free(ts2); 167059599516SKenneth E. Jansen 167159599516SKenneth E. Jansen 167259599516SKenneth E. Jansen // printf("%d Read finishe\n",PhastaIOActiveFiles[i]->myrank); 167359599516SKenneth E. Jansen 167459599516SKenneth E. Jansen // Swap data byte order if endianess is different ... 167559599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->Wrong_Endian ) 167659599516SKenneth E. Jansen { 167759599516SKenneth E. Jansen SwapArrayByteOrder( valueArray, type_size, nUnits ); 167859599516SKenneth E. Jansen } 167959599516SKenneth E. Jansen } 168059599516SKenneth E. Jansen 168159599516SKenneth E. Jansen endTimer(&timer_end); 168259599516SKenneth E. Jansen char extra_msg[1024]; 168359599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 168459599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 168559599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 168659599516SKenneth E. Jansen printPerf("readdatablock", timer_start, timer_end, data_size, 1, extra_msg); 168759599516SKenneth E. Jansen free(key); 168859599516SKenneth E. Jansen 168959599516SKenneth E. Jansen } 169059599516SKenneth E. Jansen 169159599516SKenneth E. Jansen void writeheader( const int* fileDescriptor, 169259599516SKenneth E. Jansen const char keyphrase[], 169359599516SKenneth E. Jansen const void* valueArray, 169459599516SKenneth E. Jansen const int* nItems, 169559599516SKenneth E. Jansen const int* ndataItems, 169659599516SKenneth E. Jansen const char datatype[], 169759599516SKenneth E. Jansen const char iotype[]) 169859599516SKenneth E. Jansen { 169959599516SKenneth E. Jansen 170059599516SKenneth E. Jansen //if(irank == 0) printf("entering writeheader()\n"); 170159599516SKenneth E. Jansen 170259599516SKenneth E. Jansen double timer_start, timer_end; 170359599516SKenneth E. Jansen startTimer(&timer_start); 170459599516SKenneth E. Jansen 170559599516SKenneth E. Jansen int i = *fileDescriptor; 170659599516SKenneth E. Jansen checkFileDescriptor("writeheader",&i); 170759599516SKenneth E. Jansen 170859599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 170959599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 171059599516SKenneth E. Jansen FILE* fileObject; 171159599516SKenneth E. Jansen 171259599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 171359599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 171459599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 171559599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 171659599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 171759599516SKenneth E. Jansen endTimer(&timer_end); 171859599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 171959599516SKenneth E. Jansen return; 172059599516SKenneth E. Jansen } 172159599516SKenneth E. Jansen 1722408e986aSCameron Smith if( LastHeaderKey.count(filePtr) ) 1723408e986aSCameron Smith free(LastHeaderKey[filePtr]); 1724408e986aSCameron Smith const int l = strlen(keyphrase)+1; 1725408e986aSCameron Smith LastHeaderKey[filePtr] = (char*) malloc(l*sizeof(char)); 1726408e986aSCameron Smith strcpy(LastHeaderKey[filePtr], keyphrase); 172759599516SKenneth E. Jansen DataSize = *ndataItems; 172859599516SKenneth E. Jansen fileObject = fileArray[ filePtr ] ; 172959599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 173059599516SKenneth E. Jansen isBinary( iotype ); 173159599516SKenneth E. Jansen header_type[ filePtr ] = type_size; 173259599516SKenneth E. Jansen 173359599516SKenneth E. Jansen int _newline = ( *ndataItems > 0 ) ? sizeof( char ) : 0; 173459599516SKenneth E. Jansen int size_of_nextblock = 173559599516SKenneth E. Jansen ( binary_format ) ? type_size*( *ndataItems )+ _newline : *ndataItems ; 173659599516SKenneth E. Jansen 173759599516SKenneth E. Jansen fprintf( fileObject, "%s : < %d > ", keyphrase, size_of_nextblock ); 173859599516SKenneth E. Jansen for( int i = 0; i < *nItems; i++ ) 173959599516SKenneth E. Jansen fprintf(fileObject, "%d ", *((int*)((int*)valueArray+i))); 174059599516SKenneth E. Jansen fprintf(fileObject, "\n"); 174159599516SKenneth E. Jansen 174259599516SKenneth E. Jansen //return ; 174359599516SKenneth E. Jansen } 174459599516SKenneth E. Jansen else { // else it's parallel I/O 174559599516SKenneth E. Jansen DataSize = *ndataItems; 174659599516SKenneth E. Jansen size_t type_size = typeSize( datatype ); 174759599516SKenneth E. Jansen isBinary( iotype ); 174859599516SKenneth E. Jansen char mpi_tag[MAX_FIELDS_NAME_LENGTH]; 174959599516SKenneth E. Jansen 175059599516SKenneth E. Jansen int string_length = strlen( keyphrase ); 175159599516SKenneth E. Jansen char* buffer = (char*) malloc ( string_length+1 ); 175259599516SKenneth E. Jansen //char* buffer = ( char * ) malloc( string_length + 1 + pool_align ); 175359599516SKenneth E. Jansen //mem_address = (long long )buffer; 175459599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 175559599516SKenneth E. Jansen // buffer += pool_align - (mem_address & (pool_align -1)); 175659599516SKenneth E. Jansen 175759599516SKenneth E. Jansen strcpy ( buffer, keyphrase); 175859599516SKenneth E. Jansen buffer[ string_length ] = '\0'; 175959599516SKenneth E. Jansen 176059599516SKenneth E. Jansen char* st2 = strtok ( buffer, "@" ); 176159599516SKenneth E. Jansen st2 = strtok (NULL, "@"); 176259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = atoi(st2); 176359599516SKenneth E. Jansen 176459599516SKenneth E. Jansen if ( char* p = strpbrk(buffer, "@") ) 176559599516SKenneth E. Jansen *p = '\0'; 176659599516SKenneth E. Jansen 176759599516SKenneth E. Jansen bzero((void*)mpi_tag,MAX_FIELDS_NAME_LENGTH); 176859599516SKenneth E. Jansen sprintf(mpi_tag, "\n%s : %d\n", buffer, PhastaIOActiveFiles[i]->field_count); 176959599516SKenneth E. Jansen unsigned long long offset_value; 177059599516SKenneth E. Jansen 177159599516SKenneth E. Jansen int temp = *ndataItems; 177259599516SKenneth E. Jansen unsigned long long number_of_items = (unsigned long long)temp; 177359599516SKenneth E. Jansen MPI_Barrier(PhastaIOActiveFiles[i]->local_comm); 177459599516SKenneth E. Jansen 177559599516SKenneth E. Jansen MPI_Scan( &number_of_items, 177659599516SKenneth E. Jansen &offset_value, 177759599516SKenneth E. Jansen 1, 177859599516SKenneth E. Jansen MPI_LONG_LONG_INT, 177959599516SKenneth E. Jansen MPI_SUM, 178059599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 178159599516SKenneth E. Jansen 178259599516SKenneth E. Jansen offset_value = (offset_value - number_of_items) * type_size; 178359599516SKenneth E. Jansen 178459599516SKenneth E. Jansen offset_value += PhastaIOActiveFiles[i]->local_myrank * 178559599516SKenneth E. Jansen DB_HEADER_SIZE + 178659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address; 178759599516SKenneth E. Jansen // This offset is the starting address of each datablock header... 178859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset = offset_value; 178959599516SKenneth E. Jansen 179059599516SKenneth E. Jansen // Write in my offset table ... 179159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset_table[PhastaIOActiveFiles[i]->field_count][PhastaIOActiveFiles[i]->part_count] = 179259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset; 179359599516SKenneth E. Jansen 179459599516SKenneth E. Jansen // Update the next-start-address ... 179559599516SKenneth E. Jansen PhastaIOActiveFiles[i]->next_start_address = offset_value + 179659599516SKenneth E. Jansen number_of_items * type_size + 179759599516SKenneth E. Jansen DB_HEADER_SIZE; 179859599516SKenneth E. Jansen MPI_Bcast( &(PhastaIOActiveFiles[i]->next_start_address), 179959599516SKenneth E. Jansen 1, 180059599516SKenneth E. Jansen MPI_LONG_LONG_INT, 180159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_numprocs-1, 180259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->local_comm ); 180359599516SKenneth E. Jansen 180459599516SKenneth E. Jansen // Prepare datablock header ... 180559599516SKenneth E. Jansen int _newline = (*ndataItems>0)?sizeof(char):0; 180659599516SKenneth E. Jansen unsigned int size_of_nextblock = type_size * (*ndataItems) + _newline; 180759599516SKenneth E. Jansen 180859599516SKenneth E. Jansen //char datablock_header[255]; 180959599516SKenneth E. Jansen //bzero((void*)datablock_header,255); 181059599516SKenneth E. Jansen char datablock_header[DB_HEADER_SIZE]; 181159599516SKenneth E. Jansen bzero((void*)datablock_header,DB_HEADER_SIZE); 181259599516SKenneth E. Jansen 181359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->GPid = PhastaIOActiveFiles[i]->nppp*PhastaIOActiveFiles[i]->myrank+PhastaIOActiveFiles[i]->part_count; 181459599516SKenneth E. Jansen sprintf( datablock_header, 181559599516SKenneth E. Jansen "\n%s : < %u >", 181659599516SKenneth E. Jansen keyphrase, 181759599516SKenneth E. Jansen size_of_nextblock ); 181859599516SKenneth E. Jansen 181959599516SKenneth E. Jansen for ( int j = 0; j < *nItems; j++ ) 182059599516SKenneth E. Jansen { 182159599516SKenneth E. Jansen sprintf( datablock_header, 182259599516SKenneth E. Jansen "%s %d ", 182359599516SKenneth E. Jansen datablock_header, 182459599516SKenneth E. Jansen *((int*)((int*)valueArray+j))); 182559599516SKenneth E. Jansen } 182659599516SKenneth E. Jansen sprintf( datablock_header, 182759599516SKenneth E. Jansen "%s\n ", 182859599516SKenneth E. Jansen datablock_header ); 182959599516SKenneth E. Jansen 183059599516SKenneth E. Jansen // Write datablock header ... 183159599516SKenneth E. Jansen //MR CHANGE 183259599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 183359599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 183459599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 183559599516SKenneth E. Jansen //MR CHANGE END 183659599516SKenneth E. Jansen { 183759599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->double_chunk ); 183859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk = ( double * )malloc( (sizeof( double )*number_of_items+ DB_HEADER_SIZE)); 183959599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->double_chunk = ( double * ) malloc( sizeof( double )*number_of_items+ DB_HEADER_SIZE + pool_align ); 184059599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->double_chunk; 184159599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 184259599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->double_chunk += pool_align - (mem_address & (pool_align -1)); 184359599516SKenneth E. Jansen 184459599516SKenneth E. Jansen double * aa = ( double * )datablock_header; 184559599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->double_chunk, aa, DB_HEADER_SIZE); 184659599516SKenneth E. Jansen } 184759599516SKenneth E. Jansen //MR CHANGE 184859599516SKenneth E. Jansen // if ( cscompare(datatype,"integer") ) 184959599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 185059599516SKenneth E. Jansen //MR CHANGE END 185159599516SKenneth E. Jansen { 185259599516SKenneth E. Jansen free ( PhastaIOActiveFiles[i]->int_chunk ); 185359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk = ( int * )malloc( (sizeof( int )*number_of_items+ DB_HEADER_SIZE)); 185459599516SKenneth E. Jansen //PhastaIOActiveFiles[i]->int_chunk = ( int * ) malloc( sizeof( int )*number_of_items+ DB_HEADER_SIZE + pool_align ); 185559599516SKenneth E. Jansen //mem_address = (long long )PhastaIOActiveFiles[i]->int_chunk; 185659599516SKenneth E. Jansen //if( mem_address & (pool_align -1) ) 185759599516SKenneth E. Jansen // PhastaIOActiveFiles[i]->int_chunk += pool_align - (mem_address & ( pool_align -1)); 185859599516SKenneth E. Jansen 185959599516SKenneth E. Jansen int * aa = ( int * )datablock_header; 186059599516SKenneth E. Jansen memcpy(PhastaIOActiveFiles[i]->int_chunk, aa, DB_HEADER_SIZE); 186159599516SKenneth E. Jansen } 186259599516SKenneth E. Jansen else { 186359599516SKenneth E. Jansen // *fileDescriptor = DATA_TYPE_ILLEGAL; 186459599516SKenneth E. Jansen printf("writeheader - DATA_TYPE_ILLEGAL - %s\n",datatype); 186559599516SKenneth E. Jansen endTimer(&timer_end); 186659599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 186759599516SKenneth E. Jansen return; 186859599516SKenneth E. Jansen } 186959599516SKenneth E. Jansen free(ts1); 187059599516SKenneth E. Jansen 187159599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count++; 187259599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->part_count == PhastaIOActiveFiles[i]->nppp ) { 187359599516SKenneth E. Jansen //A new field will be written 187459599516SKenneth E. Jansen if ( PhastaIOActiveFiles[i]->local_myrank == 0 ) { 187559599516SKenneth E. Jansen memcpy( PhastaIOActiveFiles[i]->master_header + 187659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count * 187759599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH + 187859599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH * 2, 187959599516SKenneth E. Jansen mpi_tag, 188059599516SKenneth E. Jansen MAX_FIELDS_NAME_LENGTH-1); 188159599516SKenneth E. Jansen } 188259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->field_count++; 188359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->part_count=0; 188459599516SKenneth E. Jansen } 188559599516SKenneth E. Jansen free(buffer); 188659599516SKenneth E. Jansen } 188759599516SKenneth E. Jansen 188859599516SKenneth E. Jansen endTimer(&timer_end); 188959599516SKenneth E. Jansen printPerf("writeheader", timer_start, timer_end, 0, 0, ""); 189059599516SKenneth E. Jansen } 189159599516SKenneth E. Jansen 189259599516SKenneth E. Jansen void writedatablock( const int* fileDescriptor, 189359599516SKenneth E. Jansen const char keyphrase[], 189459599516SKenneth E. Jansen const void* valueArray, 189559599516SKenneth E. Jansen const int* nItems, 189659599516SKenneth E. Jansen const char datatype[], 189759599516SKenneth E. Jansen const char iotype[] ) 189859599516SKenneth E. Jansen { 189959599516SKenneth E. Jansen //if(irank == 0) printf("entering writedatablock()\n"); 190059599516SKenneth E. Jansen 190159599516SKenneth E. Jansen unsigned long long data_size = 0; 190259599516SKenneth E. Jansen double timer_start, timer_end; 190359599516SKenneth E. Jansen startTimer(&timer_start); 190459599516SKenneth E. Jansen 190559599516SKenneth E. Jansen int i = *fileDescriptor; 190659599516SKenneth E. Jansen checkFileDescriptor("writedatablock",&i); 190759599516SKenneth E. Jansen 190859599516SKenneth E. Jansen if ( PhastaIONextActiveIndex == 0 ) { 190959599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 191059599516SKenneth E. Jansen 191159599516SKenneth E. Jansen if ( *fileDescriptor < 1 || *fileDescriptor > (int)fileArray.size() ) { 191259599516SKenneth E. Jansen fprintf(stderr,"No file associated with Descriptor %d\n",*fileDescriptor); 191359599516SKenneth E. Jansen fprintf(stderr,"openfile_ function has to be called before \n") ; 191459599516SKenneth E. Jansen fprintf(stderr,"acessing the file\n ") ; 191559599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n"); 191659599516SKenneth E. Jansen endTimer(&timer_end); 191759599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 191859599516SKenneth E. Jansen return; 191959599516SKenneth E. Jansen } 192059599516SKenneth E. Jansen // since we require that a consistant header always preceed the data block 192159599516SKenneth E. Jansen // let us check to see that it is actually the case. 192259599516SKenneth E. Jansen 192359599516SKenneth E. Jansen if ( ! cscompare( LastHeaderKey[ filePtr ], keyphrase ) ) { 192459599516SKenneth E. Jansen fprintf(stderr, "Header not consistant with data block\n"); 192559599516SKenneth E. Jansen fprintf(stderr, "Header: %s\n", LastHeaderKey[ filePtr ] ); 192659599516SKenneth E. Jansen fprintf(stderr, "DataBlock: %s\n ", keyphrase ); 192759599516SKenneth E. Jansen fprintf(stderr, "Please recheck write sequence \n"); 192859599516SKenneth E. Jansen if( Strict_Error ) { 192959599516SKenneth E. Jansen fprintf(stderr, "fatal error: cannot continue, returning out of call\n"); 193059599516SKenneth E. Jansen endTimer(&timer_end); 193159599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 193259599516SKenneth E. Jansen return; 193359599516SKenneth E. Jansen } 193459599516SKenneth E. Jansen } 193559599516SKenneth E. Jansen 193659599516SKenneth E. Jansen FILE* fileObject = fileArray[ filePtr ] ; 193759599516SKenneth E. Jansen size_t type_size=typeSize( datatype ); 193859599516SKenneth E. Jansen isBinary( iotype ); 193959599516SKenneth E. Jansen 194059599516SKenneth E. Jansen if ( header_type[filePtr] != (int)type_size ) { 194159599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on typeof data in the block for\n"); 194259599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 194359599516SKenneth E. Jansen if( Strict_Error ) { 194459599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 194559599516SKenneth E. Jansen endTimer(&timer_end); 194659599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 194759599516SKenneth E. Jansen return; 194859599516SKenneth E. Jansen } 194959599516SKenneth E. Jansen } 195059599516SKenneth E. Jansen 195159599516SKenneth E. Jansen int nUnits = *nItems; 195259599516SKenneth E. Jansen 195359599516SKenneth E. Jansen if ( nUnits != DataSize ) { 195459599516SKenneth E. Jansen fprintf(stderr,"header and datablock differ on number of data items for\n"); 195559599516SKenneth E. Jansen fprintf(stderr,"keyphrase : %s\n", keyphrase); 195659599516SKenneth E. Jansen if( Strict_Error ) { 195759599516SKenneth E. Jansen fprintf(stderr,"fatal error: cannot continue, returning out of call\n" ); 195859599516SKenneth E. Jansen endTimer(&timer_end); 195959599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 196059599516SKenneth E. Jansen return; 196159599516SKenneth E. Jansen } 196259599516SKenneth E. Jansen } 196359599516SKenneth E. Jansen 196459599516SKenneth E. Jansen if ( binary_format ) { 196559599516SKenneth E. Jansen 196659599516SKenneth E. Jansen fwrite( valueArray, type_size, nUnits, fileObject ); 196759599516SKenneth E. Jansen fprintf( fileObject,"\n"); 196859599516SKenneth E. Jansen 196959599516SKenneth E. Jansen } else { 197059599516SKenneth E. Jansen 197159599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 197259599516SKenneth E. Jansen if ( cscompare( "integer", ts1 ) ) { 197359599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 197459599516SKenneth E. Jansen fprintf(fileObject,"%d\n",*((int*)((int*)valueArray+n))); 197559599516SKenneth E. Jansen } else if ( cscompare( "double", ts1 ) ) { 197659599516SKenneth E. Jansen for( int n=0; n < nUnits ; n++ ) 197759599516SKenneth E. Jansen fprintf(fileObject,"%lf\n",*((double*)((double*)valueArray+n))); 197859599516SKenneth E. Jansen } 197959599516SKenneth E. Jansen free (ts1); 198059599516SKenneth E. Jansen } 198159599516SKenneth E. Jansen //return ; 198259599516SKenneth E. Jansen } 198359599516SKenneth E. Jansen else { // syncIO case 198459599516SKenneth E. Jansen MPI_Status write_data_status; 198559599516SKenneth E. Jansen isBinary( iotype ); 198659599516SKenneth E. Jansen int nUnits = *nItems; 198759599516SKenneth E. Jansen 198859599516SKenneth E. Jansen //MR CHANGE 198959599516SKenneth E. Jansen // if ( cscompare(datatype,"double") ) 199059599516SKenneth E. Jansen char* ts1 = StringStripper( datatype ); 199159599516SKenneth E. Jansen if ( cscompare("double",ts1) ) 199259599516SKenneth E. Jansen //MR CHANGE END 199359599516SKenneth E. Jansen { 199459599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->double_chunk+DB_HEADER_SIZE/sizeof(double)), valueArray, nUnits*sizeof(double)); 199559599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 199659599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 199759599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 199859599516SKenneth E. Jansen //BLOCK_SIZE/sizeof(double), 199959599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(double), 200059599516SKenneth E. Jansen MPI_DOUBLE ); 200159599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 200259599516SKenneth E. Jansen PhastaIOActiveFiles[i]->double_chunk, 200359599516SKenneth E. Jansen &write_data_status ); 200459599516SKenneth E. Jansen data_size=8*nUnits; 200559599516SKenneth E. Jansen } 200659599516SKenneth E. Jansen //MR CHANGE 200759599516SKenneth E. Jansen // else if ( cscompare ( datatype, "integer")) 200859599516SKenneth E. Jansen else if ( cscompare("integer",ts1) ) 200959599516SKenneth E. Jansen //MR CHANGE END 201059599516SKenneth E. Jansen { 201159599516SKenneth E. Jansen memcpy((PhastaIOActiveFiles[i]->int_chunk+DB_HEADER_SIZE/sizeof(int)), valueArray, nUnits*sizeof(int)); 201259599516SKenneth E. Jansen MPI_File_write_at_all_begin( PhastaIOActiveFiles[i]->file_handle, 201359599516SKenneth E. Jansen PhastaIOActiveFiles[i]->my_offset, 201459599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 201559599516SKenneth E. Jansen nUnits+DB_HEADER_SIZE/sizeof(int), 201659599516SKenneth E. Jansen MPI_INT ); 201759599516SKenneth E. Jansen MPI_File_write_at_all_end( PhastaIOActiveFiles[i]->file_handle, 201859599516SKenneth E. Jansen PhastaIOActiveFiles[i]->int_chunk, 201959599516SKenneth E. Jansen &write_data_status ); 202059599516SKenneth E. Jansen data_size=4*nUnits; 202159599516SKenneth E. Jansen } 202259599516SKenneth E. Jansen else { 202359599516SKenneth E. Jansen printf("Error: writedatablock - DATA_TYPE_ILLEGAL - %s\n",datatype); 202459599516SKenneth E. Jansen endTimer(&timer_end); 202559599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, 0, 0, ""); 202659599516SKenneth E. Jansen return; 202759599516SKenneth E. Jansen } 202859599516SKenneth E. Jansen free(ts1); 202959599516SKenneth E. Jansen } 203059599516SKenneth E. Jansen 203159599516SKenneth E. Jansen endTimer(&timer_end); 203259599516SKenneth E. Jansen char extra_msg[1024]; 203359599516SKenneth E. Jansen memset(extra_msg, '\0', 1024); 203459599516SKenneth E. Jansen char* key = StringStripper(keyphrase); 203559599516SKenneth E. Jansen sprintf(extra_msg, " field is %s ", key); 203659599516SKenneth E. Jansen printPerf("writedatablock", timer_start, timer_end, data_size, 1, extra_msg); 203759599516SKenneth E. Jansen free(key); 203859599516SKenneth E. Jansen 203959599516SKenneth E. Jansen } 204059599516SKenneth E. Jansen 204159599516SKenneth E. Jansen void 204259599516SKenneth E. Jansen SwapArrayByteOrder( void* array, 204359599516SKenneth E. Jansen int nbytes, 204459599516SKenneth E. Jansen int nItems ) 204559599516SKenneth E. Jansen { 204659599516SKenneth E. Jansen /* This swaps the byte order for the array of nItems each 204759599516SKenneth E. Jansen of size nbytes , This will be called only locally */ 204859599516SKenneth E. Jansen int i,j; 204959599516SKenneth E. Jansen unsigned char* ucDst = (unsigned char*)array; 205059599516SKenneth E. Jansen 205159599516SKenneth E. Jansen for(i=0; i < nItems; i++) { 205259599516SKenneth E. Jansen for(j=0; j < (nbytes/2); j++) 205359599516SKenneth E. Jansen std::swap( ucDst[j] , ucDst[(nbytes - 1) - j] ); 205459599516SKenneth E. Jansen ucDst += nbytes; 205559599516SKenneth E. Jansen } 205659599516SKenneth E. Jansen } 205759599516SKenneth E. Jansen 205859599516SKenneth E. Jansen void 205959599516SKenneth E. Jansen writestring( int* fileDescriptor, 206059599516SKenneth E. Jansen const char inString[] ) 206159599516SKenneth E. Jansen { 206259599516SKenneth E. Jansen 206359599516SKenneth E. Jansen int filePtr = *fileDescriptor - 1; 206459599516SKenneth E. Jansen FILE* fileObject = fileArray[filePtr] ; 206559599516SKenneth E. Jansen fprintf(fileObject,"%s",inString ); 206659599516SKenneth E. Jansen return; 206759599516SKenneth E. Jansen } 206859599516SKenneth E. Jansen 206959599516SKenneth E. Jansen void 207059599516SKenneth E. Jansen Gather_Headers( int* fileDescriptor, 207159599516SKenneth E. Jansen vector< string >& headers ) 207259599516SKenneth E. Jansen { 207359599516SKenneth E. Jansen 207459599516SKenneth E. Jansen FILE* fileObject; 207559599516SKenneth E. Jansen char Line[1024]; 207659599516SKenneth E. Jansen 207759599516SKenneth E. Jansen fileObject = fileArray[ (*fileDescriptor)-1 ]; 207859599516SKenneth E. Jansen 207959599516SKenneth E. Jansen while( !feof(fileObject) ) { 208059599516SKenneth E. Jansen fgets( Line, 1024, fileObject); 208159599516SKenneth E. Jansen if ( Line[0] == '#' ) { 208259599516SKenneth E. Jansen headers.push_back( Line ); 208359599516SKenneth E. Jansen } else { 208459599516SKenneth E. Jansen break; 208559599516SKenneth E. Jansen } 208659599516SKenneth E. Jansen } 208759599516SKenneth E. Jansen rewind( fileObject ); 208859599516SKenneth E. Jansen clearerr( fileObject ); 208959599516SKenneth E. Jansen } 209059599516SKenneth E. Jansen void 209159599516SKenneth E. Jansen isWrong( void ) { (Wrong_Endian) ? fprintf(stdout,"YES\n"): fprintf(stdout,"NO\n") ; } 209259599516SKenneth E. Jansen 209359599516SKenneth E. Jansen void 209459599516SKenneth E. Jansen togglestrictmode( void ) { Strict_Error = !Strict_Error; } 209559599516SKenneth E. Jansen 209659599516SKenneth E. Jansen int 209759599516SKenneth E. Jansen isLittleEndian( void ) 209859599516SKenneth E. Jansen { 209959599516SKenneth E. Jansen // this function returns a 1 if the current running architecture is 210059599516SKenneth E. Jansen // LittleEndian Byte Ordered, else it returns a zero 210159599516SKenneth E. Jansen 210259599516SKenneth E. Jansen union { 210359599516SKenneth E. Jansen long a; 210459599516SKenneth E. Jansen char c[sizeof( long )]; 210559599516SKenneth E. Jansen } endianUnion; 210659599516SKenneth E. Jansen 210759599516SKenneth E. Jansen endianUnion.a = 1 ; 210859599516SKenneth E. Jansen 210959599516SKenneth E. Jansen if ( endianUnion.c[sizeof(long)-1] != 1 ) return 1 ; 211059599516SKenneth E. Jansen else return 0; 211159599516SKenneth E. Jansen } 211259599516SKenneth E. Jansen 211359599516SKenneth E. Jansen namespace PHASTA { 211459599516SKenneth E. Jansen const char* const PhastaIO_traits<int>::type_string = "integer"; 211559599516SKenneth E. Jansen const char* const PhastaIO_traits<double>::type_string = "double"; 211659599516SKenneth E. Jansen } 2117