📄 clog_merger.c
字号:
/* (C) 2001 by Argonne National Laboratory. See COPYRIGHT in top-level directory.*/#include "mpe_logging_conf.h"#if defined( STDC_HEADERS ) || defined( HAVE_STDIO_H )#include <stdio.h>#endif#if defined( STDC_HEADERS ) || defined( HAVE_STDLIB_H )#include <stdlib.h>#endif#if defined( STDC_HEADERS ) || defined( HAVE_STRING_H )#include <string.h>#endif#if defined( HAVE_FCNTL_H )#include <fcntl.h>#endif#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#if defined( HAVE_UNISTD_H )#include <unistd.h>#endif#ifdef HAVE_IO_H#include <io.h>#endif#if !defined( CLOG_NOMPI )#include "mpi.h"#else#include "mpi_null.h"#endif /* Endof if !defined( CLOG_NOMPI ) */#include "clog_const.h"#include "clog_mem.h"#include "clog_merger.h"#include "clog_util.h"#define CLOG_RANK_NULL -1static int clog_merger_minblocksize;CLOG_Merger_t* CLOG_Merger_create( unsigned int block_size ){ CLOG_Merger_t *merger; merger = (CLOG_Merger_t *) MALLOC( sizeof(CLOG_Merger_t) ); if ( merger == NULL ) { fprintf( stderr, __FILE__":CLOG_Merger_create() - \n" "\t""MALLOC() fails for CLOG_Merger_t!\n" ); fflush( stderr ); return NULL; } merger->left_blk = (CLOG_BlockData_t *) CLOG_BlockData_create( block_size ); if ( merger->left_blk == NULL ) { fprintf( stderr, __FILE__":CLOG_Merger_create() - \n" "\t""CLOG_BlockData_create(%d) fails for left_blk!", block_size ); fflush( stderr ); return NULL; } merger->right_blk = (CLOG_BlockData_t *) CLOG_BlockData_create( block_size ); if ( merger->right_blk == NULL ) { fprintf( stderr, __FILE__":CLOG_Merger_create() - \n" "\t""CLOG_BlockData_create(%d) fails for right_blk!", block_size ); fflush( stderr ); return NULL; } merger->sorted_blk = (CLOG_BlockData_t *) CLOG_BlockData_create( block_size ); if ( merger->sorted_blk == NULL ) { fprintf( stderr, __FILE__":CLOG_Merger_create() - \n" "\t""CLOG_BlockData_create(%d) fails for sorted_blk!", block_size ); fflush( stderr ); return NULL; } merger->block_size = block_size; merger->num_active_blks = 0; merger->world_size = 1; merger->local_world_rank = 0; merger->left_world_rank = 0; merger->right_world_rank = 0; merger->parent_world_rank = 0; merger->is_big_endian = CLOG_BOOL_NULL; strncpy( merger->out_filename, "mpe_trace."CLOG_FILE_TYPE, CLOG_PATH_STRLEN ); merger->out_fd = -1; return merger;}void CLOG_Merger_free( CLOG_Merger_t **merger_handle ){ CLOG_Merger_t *merger; merger = *merger_handle; if ( merger != NULL ) { CLOG_BlockData_free( &(merger->sorted_blk) ); CLOG_BlockData_free( &(merger->left_blk) ); CLOG_BlockData_free( &(merger->right_blk) ); FREE( merger ); } *merger_handle = NULL;}/*@ CLOG_Merger_set_neighbor_ranks - locally determine parent and children in a binary treeInput parameters+ merger->local_world_rank - calling process''s id- merger->world_size - total number of processes in treeOutput parameters+ merger->parent_world_rank - parent of local process (or CLOG_RANK_NULL if root). merger->left_world_rank - left child of local process in binary tree (or CLOG_RANK_NULL if none)- merger->right_world_rank - right child of local process in binary tree (or CLOG_RANK_NULL if none)@*/void CLOG_Merger_set_neighbor_ranks( CLOG_Merger_t *merger ){ if ( merger->local_world_rank == 0 ) merger->parent_world_rank = CLOG_RANK_NULL; else merger->parent_world_rank = (merger->local_world_rank - 1) / 2; merger->left_world_rank = (2 * merger->local_world_rank) + 1; if ( merger->left_world_rank > merger->world_size - 1 ) merger->left_world_rank = CLOG_RANK_NULL; merger->right_world_rank = (2 * merger->local_world_rank) + 2; if ( merger->right_world_rank > merger->world_size - 1 ) merger->right_world_rank = CLOG_RANK_NULL;}/* Initialize the CLOG_Merger_t */void CLOG_Merger_init( CLOG_Merger_t *merger, const CLOG_Preamble_t *preamble, const char *merged_file_prefix ){ /* Set up the binary tree MPI ranks ID locally for merging */ PMPI_Comm_size( MPI_COMM_WORLD, &(merger->world_size) ); PMPI_Comm_rank( MPI_COMM_WORLD, &(merger->local_world_rank) ); CLOG_Merger_set_neighbor_ranks( merger ); merger->is_big_endian = preamble->is_big_endian; /* Open the merged output file at root process */ if ( merger->parent_world_rank == CLOG_RANK_NULL ) { strncpy( merger->out_filename, merged_file_prefix, CLOG_PATH_STRLEN ); strcat( merger->out_filename, "."CLOG_FILE_TYPE ); merger->out_fd = OPEN( merger->out_filename, O_CREAT|O_WRONLY|O_TRUNC, 0664 ); if ( merger->out_fd == -1 ) { fprintf( stderr, __FILE__":CLOG_Merger_init() - \n" "\t""Could not open file %s for merging!\n", merger->out_filename ); fflush( stderr ); CLOG_Util_abort( 1 ); } CLOG_Preamble_write( preamble, CLOG_BOOL_TRUE, CLOG_BOOL_TRUE, merger->out_fd ); } /* Initialize the CLOG_Merger's minimum block size: CLOG_REC_ENDBLOCK */ clog_merger_minblocksize = CLOG_Rec_size( CLOG_REC_ENDBLOCK );} /* Finalize the CLOG_Merger_t */void CLOG_Merger_finalize( CLOG_Merger_t *merger, CLOG_Buffer_t *buffer ){ CLOG_BOOL_T do_byte_swap; int ierr; if ( merger->out_fd != -1 ) { /* Update CLOG_Preamble_t with commtable_fptr */ buffer->preamble->commtable_fptr = (CLOG_int64_t) lseek( merger->out_fd, 0, SEEK_CUR ); /* Save CLOG_CommSet_t to file */ do_byte_swap = merger->is_big_endian != CLOG_BOOL_TRUE; ierr = CLOG_CommSet_write( buffer->commset, merger->out_fd, do_byte_swap ); if ( ierr < 0 ) { fprintf( stderr, __FILE__":CLOG_Merger_finalize() - \n" "\t""CLOG_CommSet_write() fails!\n" ); fflush( stderr ); return; } /* Save the updated CLOG_Preamble_t */ lseek( merger->out_fd, 0, SEEK_SET ); CLOG_Preamble_write( buffer->preamble, CLOG_BOOL_TRUE, CLOG_BOOL_TRUE, merger->out_fd ); close( merger->out_fd ); }}/* Flush the sorted buffer to the output logfile.*/void CLOG_Merger_flush( CLOG_Merger_t *merger ){ int ierr; if ( merger->is_big_endian != CLOG_BOOL_TRUE ) CLOG_BlockData_swap_bytes_last( merger->sorted_blk ); ierr = write( merger->out_fd, merger->sorted_blk->head, merger->block_size ); if ( ierr != merger->block_size ) { fprintf( stderr, __FILE__":CLOG_Merger_flush() - \n" "\t""Fail to write to the logfile %s, ierr = %d.\n", merger->out_filename, ierr ); fflush( stderr ); CLOG_Util_abort( 1 ); }}/* clog_merger_minblocksize is defined in CLOG_Merger_init()*/static int CLOG_Merger_reserved_block_size( CLOG_int32_t rectype ){ /* Have CLOG_Rec_size() do the error checking */ return CLOG_Rec_size( rectype ) + clog_merger_minblocksize;}/* Save the CLOG record marked by CLOG_Rec_Header_t to the output file.*/void CLOG_Merger_save_rec( CLOG_Merger_t *merger, const CLOG_Rec_Header_t *hdr ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -