⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clog_merger.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
/*   (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 + -