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

📄 irlog2rlog.c

📁 刚才是说明 现在是安装程序在 LINUX环境下进行编程的MPICH安装文件
💻 C
📖 第 1 页 / 共 2 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  $Id: irlog2rlog.c,v 1.5 2002/11/11 13:50:50 gropp Exp $ * *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#include "rlog.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include <errno.h>#ifndef BOOL#define BOOL int#endif#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif#ifndef min#define min(a,b) (((a) < (b)) ? (a) : (b))#endif#define MAX_RANK 1024*1024typedef struct RLOG_State_list{    RLOG_STATE state;    struct RLOG_State_list *next;} RLOG_State_list;typedef struct RecursionStruct{    char filename[1024];    int rank;    int level;    int num_events;    FILE *fout;    struct RecursionStruct *next;} RecursionStruct;typedef struct StartArrowStruct{    double start_time;    int src, tag, length;    struct StartArrowStruct *next;} StartArrowStruct;typedef struct EndArrowStruct{    int src, tag;    double timestamp;    struct EndArrowStruct *next;} EndArrowStruct;typedef struct ArrowNode{    int rank;    StartArrowStruct *pStartList;    EndArrowStruct *pEndList;    struct ArrowNode *pNext;} ArrowNode;ArrowNode *g_pArrowList = NULL;RecursionStruct *g_pLevel = NULL;FILE *g_fArrow = NULL;char g_pszArrowFilename[1024];RLOG_State_list *g_pList = NULL;static int ReadFileData(char *pBuffer, int length, FILE *fin){    int num_read;    while (length)    {	num_read = fread(pBuffer, 1, length, fin);	if (num_read == -1)	{	    printf("Error: fread failed - %s\n", strerror(errno));	    return errno;	}	/*printf("fread(%d)", num_read);fflush(stdout);*/	length -= num_read;	pBuffer += num_read;    }    return 0;}static int WriteFileData(const char *pBuffer, int length, FILE *fout){    int num_written;    while (length)    {	num_written = fwrite(pBuffer, 1, length, fout);	if (num_written == -1)	{	    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;}ArrowNode *GetArrowNode(int rank){    ArrowNode *pNode = g_pArrowList;    while (pNode)    {	if (pNode->rank == rank)	    return pNode;	pNode = pNode->pNext;    }    pNode = (ArrowNode *)malloc(sizeof(ArrowNode));    pNode->pEndList = NULL;    pNode->pStartList = NULL;    pNode->rank = rank;    pNode->pNext = g_pArrowList;    g_pArrowList = pNode;    return pNode;}EndArrowStruct *ExtractEndNode(ArrowNode *pNode, int src, int tag){    EndArrowStruct *pIter, *pRet;    if (pNode->pEndList == NULL)	return NULL;    if ((pNode->pEndList->src == src) && (pNode->pEndList->tag == tag))    {	pRet = pNode->pEndList;	pNode->pEndList = pNode->pEndList->next;	return pRet;    }    pIter = pNode->pEndList;    while (pIter->next != NULL)    {	if ((pIter->next->src == src) && (pIter->next->tag == tag))	{	    pRet = pIter->next;	    pIter->next = pIter->next->next;	    return pRet;	}	pIter = pIter->next;    }    return NULL;}StartArrowStruct *ExtractStartNode(ArrowNode *pNode, int src, int tag){    StartArrowStruct *pIter, *pRet;    if (pNode->pStartList == NULL)	return NULL;    if ((pNode->pStartList->src == src) && (pNode->pStartList->tag == tag))    {	pRet = pNode->pStartList;	pNode->pStartList = pNode->pStartList->next;	return pRet;    }    pIter = pNode->pStartList;    while (pIter->next != NULL)    {	if ((pIter->next->src == src) && (pIter->next->tag == tag))	{	    pRet = pIter->next;	    pIter->next = pIter->next->next;	    return pRet;	}	pIter = pIter->next;    }    return NULL;}void SaveArrow(RLOG_IARROW *pArrow){    ArrowNode *pNode;    StartArrowStruct *pStart, *pStartIter;    EndArrowStruct *pEnd, *pEndIter;    RLOG_ARROW arrow;    if (g_fArrow == NULL)    {	strcpy(g_pszArrowFilename, "ArrowFile.tmp");	g_fArrow = fopen(g_pszArrowFilename, "w+b");	if (g_fArrow == NULL)	{	    printf("unable to open ArrowFile.tmp\n");	    return;	}    }    if (pArrow->sendrecv == RLOG_SENDER)    {	pNode = GetArrowNode(pArrow->remote);	pEnd = ExtractEndNode(pNode, pArrow->rank, pArrow->tag);	if (pEnd == NULL)	{	    pStart = (StartArrowStruct *)malloc(sizeof(StartArrowStruct));	    pStart->src = pArrow->rank;	    pStart->tag = pArrow->tag;	    pStart->length = pArrow->length;	    pStart->start_time = pArrow->timestamp;	    pStart->next = NULL;	    if (pNode->pStartList == NULL)	    {		pNode->pStartList = pStart;	    }	    else	    {		pStartIter = pNode->pStartList;		while (pStartIter->next != NULL)		    pStartIter = pStartIter->next;		pStartIter->next = pStart;	    }	    return;	}	arrow.src = pArrow->rank;	arrow.dest = pArrow->remote;	arrow.length = pArrow->length;	arrow.start_time = pEnd->timestamp;	arrow.end_time = pArrow->timestamp;	arrow.tag = pArrow->tag;	arrow.leftright = RLOG_ARROW_LEFT;	fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow);	free(pEnd);    }    else    {	arrow.dest = pArrow->rank;	arrow.end_time = pArrow->timestamp;	arrow.tag = pArrow->tag;	arrow.length = pArrow->length;	pNode = GetArrowNode(pArrow->rank);	pStart = ExtractStartNode(pNode, pArrow->remote, pArrow->tag);	if (pStart != NULL)	{	    arrow.src = pStart->src;	    arrow.start_time = pStart->start_time;	    arrow.length = pStart->length; /* the sender length is more accurate than the receiver length */	    arrow.leftright = RLOG_ARROW_RIGHT;	    free(pStart);	    fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow);	}	else	{	    pEnd = (EndArrowStruct *)malloc(sizeof(EndArrowStruct));	    pEnd->src = pArrow->remote;	    pEnd->tag = pArrow->tag;	    pEnd->timestamp = pArrow->timestamp;	    pEnd->next = NULL;	    if (pNode->pEndList == NULL)	    {		pNode->pEndList = pEnd;	    }	    else	    {		pEndIter = pNode->pEndList;		while (pEndIter->next != NULL)		    pEndIter = pEndIter->next;		pEndIter->next = pEnd;	    }	}    }    /* fwrite(pArrow, sizeof(RLOG_IARROW), 1, g_fArrow); */}#ifdef FOOvoid SaveArrow(RLOG_IARROW *pArrow){    ArrowNode *pNode;    StartArrowStruct *pStart, *pStartIter;    EndArrowStruct *pEnd, *pEndIter;    RLOG_ARROW arrow;    long file_pos;    if (g_fArrow == NULL)    {	strcpy(g_pszArrowFilename, "ArrowFile.tmp");	g_fArrow = fopen(g_pszArrowFilename, "w+b");	if (g_fArrow == NULL)	{	    printf("unable to open ArrowFile.tmp\n");	    return;	}    }    if (pArrow->sendrecv == RLOG_SENDER)    {	pNode = GetArrowNode(pArrow->remote);	pEnd = ExtractEndNode(pNode, pArrow->rank, pArrow->tag);	if (pEnd == NULL)	{	    pStart = (StartArrowStruct *)malloc(sizeof(StartArrowStruct));	    pStart->src = pArrow->rank;	    pStart->tag = pArrow->tag;	    pStart->length = pArrow->length;	    pStart->start_time = pArrow->timestamp;	    pStart->next = NULL;	    if (pNode->pStartList == NULL)	    {		pNode->pStartList = pStart;	    }	    else	    {		pStartIter = pNode->pStartList;		while (pStartIter->next != NULL)		    pStartIter = pStartIter->next;		pStartIter->next = pStart;	    }	    return;	}	/* save the file position */	file_pos = ftell(g_fArrow);	/* read the previously written arrow */	fseek(g_fArrow, pEnd->file_pos, SEEK_SET);	fread(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow);	arrow.src = pArrow->rank;	arrow.length = pArrow->length;	arrow.start_time = pArrow->timestamp;	/* write the updated arrow back */	fseek(g_fArrow, pEnd->file_pos, SEEK_SET);	fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow);	/* return the the current position */	fseek(g_fArrow, file_pos, SEEK_SET);	free(pEnd);    }    else    {	arrow.dest = pArrow->rank;	arrow.end_time = pArrow->timestamp;	arrow.tag = pArrow->tag;	arrow.length = pArrow->length;	pNode = GetArrowNode(pArrow->rank);	pStart = ExtractStartNode(pNode, pArrow->remote, pArrow->tag);	if (pStart != NULL)	{	    arrow.src = pStart->src;	    arrow.start_time = pStart->start_time;	    arrow.length = pStart->length; /* the sender length is more accurate than the receiver length */	    free(pStart);	}	else	{	    arrow.src = -1;	    arrow.start_time = -1.0;	    pEnd = (EndArrowStruct *)malloc(sizeof(EndArrowStruct));	    pEnd->src = pArrow->remote;	    pEnd->tag = pArrow->tag;	    pEnd->file_pos = ftell(g_fArrow);	    pEnd->next = NULL;	    if (pNode->pEndList == NULL)	    {		pNode->pEndList = pEnd;	    }	    else	    {		pEndIter = pNode->pEndList;		while (pEndIter->next != NULL)		    pEndIter = pEndIter->next;		pEndIter->next = pEnd;	    }	}	fwrite(&arrow, sizeof(RLOG_ARROW), 1, g_fArrow);    }    /* fwrite(pArrow, sizeof(RLOG_IARROW), 1, g_fArrow); */}#endifRecursionStruct *GetLevel(int rank, int recursion){    RecursionStruct *pLevel;    pLevel = g_pLevel;    while (pLevel)    {	if (pLevel->level == recursion && pLevel->rank == rank)	    return pLevel;	pLevel = pLevel->next;    }    pLevel = (RecursionStruct*)malloc(sizeof(RecursionStruct));    sprintf(pLevel->filename, "irlog.%d.%d.tmp", rank, recursion);    pLevel->fout = fopen(pLevel->filename, "w+b");    pLevel->rank = rank;    pLevel->level = recursion;    pLevel->num_events = 0;    pLevel->next = g_pLevel;    g_pLevel = pLevel;    return pLevel;}void SaveEvent(RLOG_EVENT *pEvent){    RecursionStruct *pLevel;    pLevel = GetLevel(pEvent->rank, pEvent->recursion);    pLevel->num_events++;    fwrite(pEvent, sizeof(RLOG_EVENT), 1, pLevel->fout);}void SaveState(RLOG_STATE *pState){    RLOG_State_list *pIter;    pIter = g_pList;    while (pIter)    {	if (pIter->state.event == pState->event)	{	    /* replace old with new */	    memcpy(&pIter->state, pState, sizeof(RLOG_STATE));	    return;	}	pIter = pIter->next;    }

⌨️ 快捷键说明

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