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

📄 rlog.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  $Id: rlog.c,v 1.16 2006/01/21 02:34:02 ashton Exp $ * *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "rlog.h"#include <stdlib.h>#include <string.h>#include <errno.h>#include <math.h>#include "mpichconf.h" /* HAVE_SNPRINTF */#include "mpimem.h"    /* MPIU_Snprintf */#include "mpibase.h"   /* MPIU_Error_printf */#include "mpi.h"/*#define RLOG_timestamp PMPI_Wtime*/#include "mpichtimer.h"static double RLOG_timestamp(void){    double d;    MPID_Time_t t;    MPID_Wtime(&t);    MPID_Wtime_todouble(&t, &d);    return d;}static int WriteFileData(const char *pBuffer, int length, FILE *fout){    int num_written;    while (length)    {	num_written = (int)fwrite(pBuffer, 1, length, fout);	if (num_written == -1)	{	    MPIU_Error_printf("Error: fwrite failed - %s\n", strerror(errno));	    return errno;	}	/*printf("fwrite(%d)", num_written);fflush(stdout);*/	length -= num_written;	pBuffer += num_written;    }    return 0;}static void MarkDiskStart(RLOG_Struct *pRLOG){    pRLOG->DiskEvent.start_time = RLOG_timestamp() - pRLOG->dFirstTimestamp;    pRLOG->DiskEvent.recursion = pRLOG->nRecursion;}static void WriteDiskEvent(RLOG_Struct *pRLOG){    pRLOG->DiskEvent.end_time = RLOG_timestamp() - pRLOG->dFirstTimestamp;    WriteFileData((const char *)&pRLOG->DiskHeader, sizeof(RLOG_HEADER), pRLOG->pOutput->f);    WriteFileData((const char *)&pRLOG->DiskEvent, sizeof(RLOG_EVENT), pRLOG->pOutput->f);}RLOG_Struct* RLOG_InitLog(int rank, int size){    RLOG_Struct* pRLOG;    pRLOG = (RLOG_Struct*)MPIU_Malloc(sizeof(RLOG_Struct));    if (pRLOG == NULL)	return NULL;    pRLOG->nRank = rank;    pRLOG->nSize = size;    pRLOG->nRecursion = 0;    pRLOG->nCurEventId = RLOG_FIRST_EVENT_ID;    pRLOG->dFirstTimestamp = 0.0;    MPIU_Snprintf(pRLOG->pszFileName, 256, "log%d.irlog", rank);    pRLOG->pOutput = NULL;    pRLOG->pOutput = IRLOG_CreateOutputStruct(pRLOG->pszFileName);    if (pRLOG->pOutput == NULL)    {	MPIU_Error_printf("RLOG Error: unable to allocate an output structure.\n");	MPIU_Free(pRLOG);	return NULL;    }    RLOG_EnableLogging(pRLOG);    /* save the parts of the header and event that do not change */    pRLOG->DiskEvent.event = RLOG_GetNextEventID(pRLOG);    pRLOG->DiskEvent.rank = rank;    pRLOG->DiskHeader.type = RLOG_EVENT_TYPE;    pRLOG->DiskHeader.length = sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT);    /* put the description of the state in the log file */    RLOG_DescribeState(pRLOG, pRLOG->DiskEvent.event, "RLOG_DISK", "255   0   0");    RLOG_DisableLogging(pRLOG);    return pRLOG;}int RLOG_FinishLog(RLOG_Struct* pRLOG){    RLOG_HEADER header;    /* FixUpBuffer(); */    MarkDiskStart(pRLOG);    WriteFileData(pRLOG->pOutput->buffer, pRLOG->pOutput->pCurHeader - pRLOG->pOutput->buffer, pRLOG->pOutput->f);    WriteDiskEvent(pRLOG);    pRLOG->pOutput->pCurHeader = pRLOG->pOutput->buffer;    header.type = RLOG_ENDLOG_TYPE;    header.length = sizeof(RLOG_HEADER);    WriteFileData((const char *)&header, sizeof(RLOG_HEADER), pRLOG->pOutput->f);    IRLOG_CloseOutputStruct(&pRLOG->pOutput);    return 0;}void RLOG_EnableLogging(RLOG_Struct* pRLOG){    pRLOG->bLogging = RLOG_TRUE;}void RLOG_DisableLogging(RLOG_Struct* pRLOG){    pRLOG->bLogging = RLOG_FALSE;}void RLOG_SaveFirstTimestamp(RLOG_Struct* pRLOG){    pRLOG->dFirstTimestamp = RLOG_timestamp();}int RLOG_GetNextEventID(RLOG_Struct* pRLOG){    return pRLOG->nCurEventId++;}void WriteCurrentDataAndLogEvent(RLOG_Struct *pRLOG, int event, double starttime, double endtime, int recursion){    double disk_start, disk_end;    /* save the disk event start */    disk_start = RLOG_timestamp();    /* write the data and reset the buffer */    WriteFileData(pRLOG->pOutput->buffer, pRLOG->pOutput->pCurHeader - pRLOG->pOutput->buffer, pRLOG->pOutput->f);    pRLOG->pOutput->pCurHeader = pRLOG->pOutput->buffer;    /* save the disk event end */    disk_end = RLOG_timestamp();    /* save the event that was interrupted by the disk event */    RLOG_LogEvent(pRLOG, event, starttime, endtime, recursion);    /* save the disk event */    RLOG_LogEvent(pRLOG, pRLOG->DiskEvent.event, disk_start, disk_end, recursion);}/* maybe these casts will be faster than using local pointer variables */#define RLOG_HEADER_CAST() ((RLOG_HEADER*)pRLOG->pOutput->pCurHeader)#define RLOG_EVENT_CAST()  ((RLOG_EVENT*)((char*)pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER)))#define RLOG_IARROW_CAST()  ((RLOG_IARROW*)((char*)pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER)))#ifndef RLOG_LogEventvoid RLOG_LogEvent(RLOG_Struct *pRLOG, int event, double starttime, double endtime, int recursion){    if (pRLOG->bLogging == RLOG_FALSE)	return;    if (pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT) > pRLOG->pOutput->pEnd)    {	WriteCurrentDataAndLogEvent(pRLOG, event, starttime, endtime, recursion);	return;    }    RLOG_HEADER_CAST()->type = RLOG_EVENT_TYPE;    RLOG_HEADER_CAST()->length = sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT);    RLOG_EVENT_CAST()->rank = pRLOG->nRank;    RLOG_EVENT_CAST()->end_time = endtime - pRLOG->dFirstTimestamp;    RLOG_EVENT_CAST()->start_time = starttime - pRLOG->dFirstTimestamp;    RLOG_EVENT_CAST()->event = event;    RLOG_EVENT_CAST()->recursion = recursion;    /* advance the current position pointer */    pRLOG->pOutput->pCurHeader += sizeof(RLOG_HEADER) + sizeof(RLOG_EVENT);}#endifvoid RLOG_LogSend(RLOG_Struct* pRLOG, int dest, int tag, int size){    if (pRLOG->bLogging == RLOG_FALSE)	return;    if (pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER) + sizeof(RLOG_IARROW) > pRLOG->pOutput->pEnd)    {	MarkDiskStart(pRLOG);	WriteFileData(pRLOG->pOutput->buffer, pRLOG->pOutput->pCurHeader - pRLOG->pOutput->buffer, pRLOG->pOutput->f);	WriteDiskEvent(pRLOG);	pRLOG->pOutput->pCurHeader = pRLOG->pOutput->buffer;    }    RLOG_HEADER_CAST()->type = RLOG_IARROW_TYPE;    RLOG_HEADER_CAST()->length = sizeof(RLOG_HEADER) + sizeof(RLOG_IARROW);    RLOG_IARROW_CAST()->sendrecv = RLOG_SENDER;    RLOG_IARROW_CAST()->rank = pRLOG->nRank;    RLOG_IARROW_CAST()->remote = dest;    RLOG_IARROW_CAST()->tag = tag;    RLOG_IARROW_CAST()->length = size;    RLOG_IARROW_CAST()->timestamp = RLOG_timestamp() - pRLOG->dFirstTimestamp;    /* advance the current position pointer */    pRLOG->pOutput->pCurHeader += sizeof(RLOG_HEADER) + sizeof(RLOG_IARROW);}void RLOG_LogRecv(RLOG_Struct* pRLOG, int src, int tag, int size){    if (pRLOG->bLogging == RLOG_FALSE)	return;    if (pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER) + sizeof(RLOG_IARROW) > pRLOG->pOutput->pEnd)    {	MarkDiskStart(pRLOG);	WriteFileData(pRLOG->pOutput->buffer, pRLOG->pOutput->pCurHeader - pRLOG->pOutput->buffer, pRLOG->pOutput->f);	WriteDiskEvent(pRLOG);	pRLOG->pOutput->pCurHeader = pRLOG->pOutput->buffer;    }    RLOG_HEADER_CAST()->type = RLOG_IARROW_TYPE;    RLOG_HEADER_CAST()->length = sizeof(RLOG_HEADER) + sizeof(RLOG_IARROW);    RLOG_IARROW_CAST()->sendrecv = RLOG_RECEIVER;    RLOG_IARROW_CAST()->rank = pRLOG->nRank;    RLOG_IARROW_CAST()->remote = src;    RLOG_IARROW_CAST()->tag = tag;    RLOG_IARROW_CAST()->length = size;    RLOG_IARROW_CAST()->timestamp = RLOG_timestamp() - pRLOG->dFirstTimestamp;    /* advance the current position pointer */    pRLOG->pOutput->pCurHeader += sizeof(RLOG_HEADER) + sizeof(RLOG_IARROW);}void RLOG_LogCommID(RLOG_Struct* pRLOG, int comm_id){    RLOG_HEADER *pHeader;    RLOG_COMM *pComm;    if (pRLOG->bLogging == RLOG_FALSE)	return;    if (pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER) + sizeof(RLOG_COMM) > pRLOG->pOutput->pEnd)    {	MarkDiskStart(pRLOG);	WriteFileData(pRLOG->pOutput->buffer, pRLOG->pOutput->pCurHeader - pRLOG->pOutput->buffer, pRLOG->pOutput->f);	WriteDiskEvent(pRLOG);	pRLOG->pOutput->pCurHeader = pRLOG->pOutput->buffer;    }    pHeader = (RLOG_HEADER*)pRLOG->pOutput->pCurHeader;    pComm = (RLOG_COMM*)((char*)pHeader + sizeof(RLOG_HEADER));    pHeader->type = RLOG_COMM_TYPE;    pHeader->length = sizeof(RLOG_HEADER) + sizeof(RLOG_COMM);    pComm->newcomm = comm_id;    pComm->rank = pRLOG->nRank;    /* advance the current position pointer */    pRLOG->pOutput->pCurHeader += pHeader->length;}/* Random color utility funcions */#ifndef RGB#define RGB(r,g,b)      ((unsigned long)(((unsigned char)(r)|((unsigned short)((unsigned char)(g))<<8))|(((unsigned long)(unsigned char)(b))<<16)))#endifstatic unsigned long getColorRGB(double fraction, double intensity, unsigned char *r, unsigned char *g, unsigned char *b){    double red, green, blue;    double dtemp;    fraction = fabs(modf(fraction, &dtemp));        if (intensity > 2.0)	intensity = 2.0;    if (intensity < 0.0)	intensity = 0.0;    dtemp = 1.0/6.0;    if (fraction < 1.0/6.0)    {	red = 1.0;	green = fraction / dtemp;	blue = 0.0;    }    else    {	if (fraction < 1.0/3.0)	{	    red = 1.0 - ((fraction - dtemp) / dtemp);	    green = 1.0;	    blue = 0.0;	}	else	{	    if (fraction < 0.5)	    {		red = 0.0;		green = 1.0;		blue = (fraction - (dtemp*2.0)) / dtemp;	    }	    else	    {		if (fraction < 2.0/3.0)		{		    red = 0.0;		    green = 1.0 - ((fraction - (dtemp*3.0)) / dtemp);		    blue = 1.0;		}		else		{		    if (fraction < 5.0/6.0)		    {			red = (fraction - (dtemp*4.0)) / dtemp;			green = 0.0;			blue = 1.0;		    }		    else		    {			red = 1.0;			green = 0.0;			blue = 1.0 - ((fraction - (dtemp*5.0)) / dtemp);		    }		}	    }	}    }    if (intensity > 1)    {	intensity = intensity - 1.0;	red = red + ((1.0 - red) * intensity);	green = green + ((1.0 - green) * intensity);	blue = blue + ((1.0 - blue) * intensity);    }    else    {	red = red * intensity;	green = green * intensity;	blue = blue * intensity;    }    *r = (unsigned char)(red * 255.0);    *g = (unsigned char)(green * 255.0);    *b = (unsigned char)(blue * 255.0);    return RGB(*r,*g,*b);}static unsigned long random_color(unsigned char *r, unsigned char *g, unsigned char *b){    double d1, d2;    /* To avoid warning messages from about "cast does not match function type"       we allow implicit casts */    d1 = rand();    d1 = d1 / (double) RAND_MAX;    d2 = rand();    d2 = d2 / (double)RAND_MAX;    return getColorRGB(d1, d2 + 0.5, r, g, b);}#define MAX_RANDOM_COLOR_STR 40static char random_color_str[MAX_RANDOM_COLOR_STR];static char *get_random_color_str(void){    unsigned char r,g,b;    random_color(&r, &g, &b);    MPIU_Snprintf(random_color_str, MAX_RANDOM_COLOR_STR, "%3d %3d %3d", (int)r, (int)g, (int)b);    return random_color_str;}void RLOG_DescribeState(RLOG_Struct* pRLOG, int state, char *name, char *color){    RLOG_HEADER *pHeader;    RLOG_STATE *pState;    if (pRLOG->bLogging == RLOG_FALSE)	return;    if (pRLOG->pOutput->pCurHeader + sizeof(RLOG_HEADER) + sizeof(RLOG_STATE) > pRLOG->pOutput->pEnd)    {	MarkDiskStart(pRLOG);	WriteFileData(pRLOG->pOutput->buffer, pRLOG->pOutput->pCurHeader - pRLOG->pOutput->buffer, pRLOG->pOutput->f);	WriteDiskEvent(pRLOG);	pRLOG->pOutput->pCurHeader = pRLOG->pOutput->buffer;    }    pHeader = (RLOG_HEADER*)pRLOG->pOutput->pCurHeader;    pState = (RLOG_STATE*)((char*)pHeader + sizeof(RLOG_HEADER));    pHeader->type = RLOG_STATE_TYPE;    pHeader->length = sizeof(RLOG_HEADER) + sizeof(RLOG_STATE);    pState->event = state;    MPIU_Strncpy(pState->color, (color != NULL) ? color : get_random_color_str(), RLOG_COLOR_LENGTH);    pState->color[RLOG_COLOR_LENGTH-1] = '\0';    if (name)    {	MPIU_Strncpy(pState->description, name, RLOG_DESCRIPTION_LENGTH);	pState->description[RLOG_DESCRIPTION_LENGTH-1] = '\0';    }    else    {	pState->description[0] = '\0';    }    /* advance the current position pointer */    pRLOG->pOutput->pCurHeader += pHeader->length;}

⌨️ 快捷键说明

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