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

📄 clog_preamble.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
📖 第 1 页 / 共 2 页
字号:
/*   (C) 2001 by Argonne National Laboratory.       See COPYRIGHT in top-level directory.*/#include "mpe_logging_conf.h"#if defined( HAVE_SYS_TYPES_H)#include <sys/types.h>#endif#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_UNISTD_H )#include <unistd.h>#endif#ifdef HAVE_IO_H#include <io.h>#endif#include "clog.h"#include "clog_const.h"#include "clog_util.h"#include "clog_preamble.h"#if !defined( CLOG_NOMPI )#include "mpi.h"#endif#ifdef NEEDS_SNPRINTF_DECLextern int snprintf( char *, size_t, const char *, ... );#endif#define ONE_GIGA  1073741824CLOG_Preamble_t *CLOG_Preamble_create( void ){    CLOG_Preamble_t  *preamble;    preamble = (CLOG_Preamble_t *) MALLOC( sizeof(CLOG_Preamble_t) );    if ( preamble == NULL ) {        fprintf( stderr, __FILE__":CLOG_Preamble_create() - "                         "MALLOC() fails.\n" );        fflush( stderr );        return NULL;    }    strcpy( preamble->version, "" );    preamble->block_size              = 0;    preamble->num_buffered_blocks     = 0;    preamble->is_big_endian           = CLOG_BOOL_NULL;    preamble->comm_world_size         = 0;    preamble->known_eventID_start     = 0;    preamble->user_eventID_start      = 0;    preamble->user_solo_eventID_start = 0;    preamble->known_stateID_count     = 0;    preamble->user_stateID_count      = 0;    preamble->user_solo_eventID_count = 0;    return preamble;}void CLOG_Preamble_free( CLOG_Preamble_t **preamble_handle ){    CLOG_Preamble_t  *preamble;    preamble = *preamble_handle;    if ( preamble != NULL )        FREE( preamble );    *preamble_handle = NULL;}void CLOG_Preamble_env_init( CLOG_Preamble_t *preamble ){    char *env_block_size;    char *env_buffered_blocks;    int   my_rank, num_procs;#if !defined( CLOG_NOMPI )    int   ierr;#endif#if !defined( CLOG_NOMPI )    PMPI_Comm_rank( MPI_COMM_WORLD, &my_rank );    PMPI_Comm_size( MPI_COMM_WORLD, &num_procs );#else    my_rank   = 0;    num_procs = 1;#endif    preamble->comm_world_size  = num_procs;    strcpy( preamble->version, CLOG_VERSION );    /* Set the OS's native byte ordering to the CLOG_Preamble_t */#if defined( WORDS_BIGENDIAN )    preamble->is_big_endian = CLOG_BOOL_TRUE;#else    preamble->is_big_endian = CLOG_BOOL_FALSE;#endif    if ( my_rank == 0 ) {        env_block_size = (char *) getenv( "CLOG_BLOCK_SIZE" );        if ( env_block_size != NULL ) {            preamble->block_size = atoi( env_block_size );            if (    preamble->block_size <= 0                 || preamble->block_size >  ONE_GIGA )                preamble->block_size = CLOG_DEFAULT_BLOCK_SIZE;        }        else            preamble->block_size = CLOG_DEFAULT_BLOCK_SIZE;                                                                                            env_buffered_blocks = (char *) getenv( "CLOG_BUFFERED_BLOCKS" );        if ( env_buffered_blocks != NULL ) {            preamble->num_buffered_blocks = atoi( env_buffered_blocks );            if (    preamble->num_buffered_blocks <= 0                 || preamble->num_buffered_blocks >  ONE_GIGA )                preamble->num_buffered_blocks = CLOG_DEFAULT_BUFFERED_BLOCKS;        }        else            preamble->num_buffered_blocks = CLOG_DEFAULT_BUFFERED_BLOCKS;    }#if !defined( CLOG_NOMPI )    /*       MPI_Bcast() from _root_ on preamble's block_size       and num_buffered_blocks to all.    */    ierr = PMPI_Bcast( &(preamble->block_size), 1, MPI_INT,                       0, MPI_COMM_WORLD );    if ( ierr != MPI_SUCCESS ) {        fprintf( stderr, __FILE__":CLOG_Preamble_env_init() - \n"                         "\t""MPI_Bcast(preamble->block_size) fails.\n" );        fflush( stderr );        PMPI_Abort( MPI_COMM_WORLD, 1 );    }    ierr = PMPI_Bcast( &(preamble->num_buffered_blocks), 1, MPI_INT,                       0, MPI_COMM_WORLD );    if ( ierr != MPI_SUCCESS ) {        fprintf( stderr, __FILE__":CLOG_Preamble_env_init() - \n"                         "\t""MPI_Bcast(num_buffered_blocks) fails.\n" );        fflush( stderr );        PMPI_Abort( MPI_COMM_WORLD, 1 );    }#endif    /*       user_stateID_count and user_solo_eventID_count are set with       some typical values, just in case the the program crashes       before CLOG_Merger_init() is called.    */    preamble->known_eventID_start     = CLOG_KNOWN_EVENTID_START;    preamble->user_eventID_start      = CLOG_USER_EVENTID_START;    preamble->user_solo_eventID_start = CLOG_USER_SOLO_EVENTID_START;    preamble->known_stateID_count     = CLOG_USER_STATEID_START                                      - CLOG_KNOWN_STATEID_START;    preamble->user_stateID_count      = 100;    preamble->user_solo_eventID_count = 100;}#define CLOG_PREAMBLE_STRLEN  32/*    is_always_big_endian != CLOG_BOOL_TRUE    => saving the OS native byte ordering determined by configure.*/void CLOG_Preamble_write( const CLOG_Preamble_t *preamble,                                int              is_always_big_endian,                                int              fd ){    char  buffer[ CLOG_PREAMBLE_SIZE ];    char  value_str[ CLOG_PREAMBLE_STRLEN ];    char *buf_ptr, *buf_tail;    int   ierr;    buf_ptr  = (char *) buffer;    buf_tail = buf_ptr + CLOG_PREAMBLE_SIZE - 1;    /* Write the CLOG version ID */    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail,                                    preamble->version,                                    "CLOG Version ID" );    /* Write the CLOG Endianess */    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail,                                    "is_big_endian=",                                    "CLOG Endianess Title" );    if ( is_always_big_endian == CLOG_BOOL_TRUE )        strcpy( value_str, "TRUE " );  /* Always BIG_ENDIAN (Java byteorder) */    else {  /* This is OS native byte ordering */        if ( preamble->is_big_endian == CLOG_BOOL_TRUE )            strcpy( value_str, "TRUE " );        else            strcpy( value_str, "FALSE" );    }    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail, value_str,                                    "CLOG Endianess Value" );    /* Write the CLOG Block Size */    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail,                                    "block_size=",                                    "CLOG Block Size Title" );    snprintf( value_str, CLOG_PREAMBLE_STRLEN, "%d",              preamble->block_size );    /* just in case, there isn't \0 in value_str  */    value_str[ CLOG_PREAMBLE_STRLEN-1 ] = '\0';    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail, value_str,                                    "CLOG Block Size Value" );    /* Write the CLOG Number of Buffered Blocks */    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail,                                    "num_buffered_blocks=",                                    "CLOG Buffered Blocks Title" );    snprintf( value_str, CLOG_PREAMBLE_STRLEN, "%d",              preamble->num_buffered_blocks );    /* just in case, there isn't \0 in value_str  */    value_str[ CLOG_PREAMBLE_STRLEN-1 ] = '\0';    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail, value_str,                                    "CLOG Buffered Blocks Value" );    /* Write the MPI_COMM_WORLD's size */    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail,                                    "comm_world_size=",                                    "MPI_COMM_WORLD Size Title" );    snprintf( value_str, CLOG_PREAMBLE_STRLEN, "%d",              preamble->comm_world_size );    /* just in case, there isn't \0 in value_str  */    value_str[ CLOG_PREAMBLE_STRLEN-1 ] = '\0';    buf_ptr = CLOG_Util_strbuf_put( buf_ptr, buf_tail, value_str,                                    "MPI_COMM_WORLD Size Value" );    /* Write the CLOG_KNOWN_EVENTID_START */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -