rlogutil.c
来自「刚才是说明 现在是安装程序在 LINUX环境下进行编程的MPICH安装文件」· C语言 代码 · 共 781 行 · 第 1/2 页
C
781 行
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* $Id: rlogutil.c,v 1.4 2002/09/27 21:11:15 toonen 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>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;}RLOG_IOStruct *RLOG_CreateInputStruct(const char *filename){ int i, j, rank_index, cur_rank, min_rank = 0; RLOG_IOStruct *pInput; int type, length; /* allocate an input structure */ pInput = (RLOG_IOStruct*)malloc(sizeof(RLOG_IOStruct)); if (pInput == NULL) { printf("malloc failed - %s\n", strerror(errno)); return NULL; } pInput->ppCurEvent = NULL; pInput->ppCurGlobalEvent = NULL; pInput->gppCurEvent = NULL; pInput->gppPrevEvent = NULL; pInput->ppEventOffset = NULL; pInput->ppNumEvents = NULL; /* open the input rlog file */ pInput->f = fopen(filename, "rb"); if (pInput->f == NULL) { printf("fopen(%s) failed, error: %s\n", filename, strerror(errno)); free(pInput); return NULL; } pInput->nNumRanks = 0; /* read the sections */ while (fread(&type, sizeof(int), 1, pInput->f)) { fread(&length, sizeof(int), 1, pInput->f); switch (type) { case RLOG_HEADER_SECTION: /*printf("type: RLOG_HEADER_SECTION, length: %d\n", length);*/ if (length != sizeof(RLOG_FILE_HEADER)) { printf("error in header size %d != %d\n", length, sizeof(RLOG_FILE_HEADER)); } ReadFileData((char*)&pInput->header, sizeof(RLOG_FILE_HEADER), pInput->f); pInput->nNumRanks = pInput->header.nMaxRank + 1 - pInput->header.nMinRank; min_rank = pInput->header.nMinRank; pInput->pRank = (int*)malloc(pInput->nNumRanks * sizeof(int)); pInput->pNumEventRecursions = (int*)malloc(pInput->nNumRanks * sizeof(int)); pInput->ppNumEvents = (int**)malloc(pInput->nNumRanks * sizeof(int*)); pInput->ppCurEvent = (int**)malloc(pInput->nNumRanks * sizeof(int*)); pInput->ppCurGlobalEvent = (int**)malloc(pInput->nNumRanks * sizeof(int*)); pInput->gppCurEvent = (RLOG_EVENT**)malloc(pInput->nNumRanks * sizeof(RLOG_EVENT*)); pInput->gppPrevEvent = (RLOG_EVENT**)malloc(pInput->nNumRanks * sizeof(RLOG_EVENT*)); pInput->ppEventOffset = (long**)malloc(pInput->nNumRanks * sizeof(long*)); for (i=0; i<pInput->nNumRanks; i++) { pInput->pRank[i] = -1; pInput->pNumEventRecursions[i] = 0; pInput->ppNumEvents[i] = NULL; pInput->ppCurEvent[i] = NULL; pInput->ppCurGlobalEvent[i] = NULL; pInput->gppCurEvent[i] = NULL; pInput->gppPrevEvent[i] = NULL; pInput->ppEventOffset[i] = NULL; } break; case RLOG_STATE_SECTION: /*printf("type: RLOG_STATE_SECTION, length: %d\n", length);*/ pInput->nNumStates = length / sizeof(RLOG_STATE); pInput->nStateOffset = ftell(pInput->f); fseek(pInput->f, length, SEEK_CUR); break; case RLOG_ARROW_SECTION: /*printf("type: RLOG_ARROW_SECTION, length: %d\n", length);*/ pInput->nNumArrows = length / sizeof(RLOG_ARROW); pInput->nArrowOffset = ftell(pInput->f); fseek(pInput->f, length, SEEK_CUR); break; case RLOG_EVENT_SECTION: /*printf("type: RLOG_EVENT_SECTION, length: %d, ", length);*/ fread(&cur_rank, sizeof(int), 1, pInput->f); if (cur_rank - min_rank >= pInput->nNumRanks) { printf("Error: event section out of range - %d <= %d <= %d\n", pInput->header.nMinRank, cur_rank, pInput->header.nMaxRank); free(pInput); return NULL; } rank_index = cur_rank - min_rank; fread(&pInput->pNumEventRecursions[rank_index], sizeof(int), 1, pInput->f); /*printf("levels: %d\n", pInput->nNumEventRecursions);*/ if (pInput->pNumEventRecursions[rank_index]) { pInput->ppCurEvent[rank_index] = (int*)malloc(pInput->pNumEventRecursions[rank_index] * sizeof(int)); pInput->ppCurGlobalEvent[rank_index] = (int*)malloc(pInput->pNumEventRecursions[rank_index] * sizeof(int)); pInput->gppCurEvent[rank_index] = (RLOG_EVENT*)malloc(pInput->pNumEventRecursions[rank_index] * sizeof(RLOG_EVENT)); pInput->gppPrevEvent[rank_index] = (RLOG_EVENT*)malloc(pInput->pNumEventRecursions[rank_index] * sizeof(RLOG_EVENT)); pInput->ppNumEvents[rank_index] = (int*)malloc(pInput->pNumEventRecursions[rank_index] * sizeof(int)); pInput->ppEventOffset[rank_index] = (long*)malloc(pInput->pNumEventRecursions[rank_index] * sizeof(long)); } for (i=0; i<pInput->pNumEventRecursions[rank_index]; i++) { fread(&pInput->ppNumEvents[rank_index][i], sizeof(int), 1, pInput->f); /*printf(" level %2d: %d events\n", i, pInput->pNumEvents[i]);*/ } if (pInput->pNumEventRecursions[rank_index]) { pInput->ppEventOffset[rank_index][0] = ftell(pInput->f); for (i=1; i<pInput->pNumEventRecursions[rank_index]; i++) { pInput->ppEventOffset[rank_index][i] = pInput->ppEventOffset[rank_index][i-1] + (pInput->ppNumEvents[rank_index][i-1] * sizeof(RLOG_EVENT)); } } length -= ((pInput->pNumEventRecursions[rank_index] + 2) * sizeof(int)); fseek(pInput->f, length, SEEK_CUR); break; default: /*printf("unknown section: type %d, length %d\n", type, length);*/ fseek(pInput->f, length, SEEK_CUR); break; } } /* reset the iterators */ RLOG_ResetStateIter(pInput); RLOG_ResetArrowIter(pInput); for (j=0; j<pInput->nNumRanks; j++) { for (i=0; i<pInput->pNumEventRecursions[j]; i++) RLOG_ResetEventIter(pInput, j+pInput->header.nMinRank, i); } RLOG_ResetGlobalIter(pInput); return pInput;}int RLOG_CloseInputStruct(RLOG_IOStruct **ppInput){ int i; if (ppInput == NULL) return -1; fclose((*ppInput)->f); for (i=0; i<(*ppInput)->nNumRanks; i++) { if ((*ppInput)->ppCurEvent[i]) free((*ppInput)->ppCurEvent[i]); if ((*ppInput)->ppCurGlobalEvent[i]) free((*ppInput)->ppCurGlobalEvent[i]); if ((*ppInput)->gppCurEvent[i]) free((*ppInput)->gppCurEvent[i]); if ((*ppInput)->gppPrevEvent[i]) free((*ppInput)->gppPrevEvent[i]); if ((*ppInput)->ppEventOffset[i]) free((*ppInput)->ppEventOffset[i]); if ((*ppInput)->ppNumEvents[i]) free((*ppInput)->ppNumEvents[i]); } if ((*ppInput)->ppCurEvent) free((*ppInput)->ppCurEvent); if ((*ppInput)->ppCurGlobalEvent) free((*ppInput)->ppCurGlobalEvent); if ((*ppInput)->gppCurEvent) free((*ppInput)->gppCurEvent); if ((*ppInput)->gppPrevEvent) free((*ppInput)->gppPrevEvent); if ((*ppInput)->ppEventOffset) free((*ppInput)->ppEventOffset); if ((*ppInput)->ppNumEvents) free((*ppInput)->ppNumEvents); free(*ppInput); *ppInput = NULL; return 0;}int RLOG_GetFileHeader(RLOG_IOStruct *pInput, RLOG_FILE_HEADER *pHeader){ if (pInput == NULL) return -1; memcpy(pHeader, &pInput->header, sizeof(RLOG_FILE_HEADER)); return 0;}int RLOG_GetNumStates(RLOG_IOStruct *pInput){ if (pInput == NULL) return -1; return pInput->nNumStates;}int RLOG_GetState(RLOG_IOStruct *pInput, int i, RLOG_STATE *pState){ if (pInput == NULL || pState == NULL || i < 0 || i >= pInput->nNumStates) return -1; fseek(pInput->f, pInput->nStateOffset + (i * sizeof(RLOG_STATE)), SEEK_SET); ReadFileData((char*)pState, sizeof(RLOG_STATE), pInput->f); pInput->nCurState = i+1; return 0;}int RLOG_ResetStateIter(RLOG_IOStruct *pInput){ if (pInput == NULL) return -1; pInput->nCurState = 0; return 0;}int RLOG_GetNextState(RLOG_IOStruct *pInput, RLOG_STATE *pState){ if (pInput == NULL || pState == NULL) return -1; if (pInput->nCurState >= pInput->nNumStates) return 1; fseek(pInput->f, pInput->nStateOffset + (pInput->nCurState * sizeof(RLOG_STATE)), SEEK_SET); ReadFileData((char*)pState, sizeof(RLOG_STATE), pInput->f); pInput->nCurState++; return 0;}int RLOG_GetNumArrows(RLOG_IOStruct *pInput){ if (pInput == NULL) return -1; return pInput->nNumArrows;}int RLOG_GetArrow(RLOG_IOStruct *pInput, int i, RLOG_ARROW *pArrow){ if (pInput == NULL || pArrow == NULL || i < 0 || i >= pInput->nNumArrows) return -1; fseek(pInput->f, pInput->nArrowOffset + (i * sizeof(RLOG_ARROW)), SEEK_SET); ReadFileData((char*)pArrow, sizeof(RLOG_ARROW), pInput->f); pInput->nCurArrow = i+1; return 0;}int RLOG_ResetArrowIter(RLOG_IOStruct *pInput){ if (pInput == NULL) return -1; pInput->nCurArrow = 0; return 0;}int RLOG_GetNextArrow(RLOG_IOStruct *pInput, RLOG_ARROW *pArrow){ if (pInput == NULL) return -1; if (pInput->nCurArrow >= pInput->nNumArrows) return 1; fseek(pInput->f, pInput->nArrowOffset + (pInput->nCurArrow * sizeof(RLOG_ARROW)), SEEK_SET); ReadFileData((char*)pArrow, sizeof(RLOG_ARROW), pInput->f); pInput->nCurArrow++; return 0;}int RLOG_GetNumEventRecursions(RLOG_IOStruct *pInput, int rank){ if (pInput == NULL || rank < pInput->header.nMinRank || rank > pInput->header.nMaxRank) return -1; return pInput->pNumEventRecursions[rank - pInput->header.nMinRank];}int RLOG_GetNumEvents(RLOG_IOStruct *pInput, int rank, int recursion_level){ int rank_index; if (pInput == NULL || recursion_level < 0 || rank < pInput->header.nMinRank || rank > pInput->header.nMaxRank) return -1; rank_index = rank - pInput->header.nMinRank; if (recursion_level >= pInput->pNumEventRecursions[rank_index]) return -1; return pInput->ppNumEvents[rank_index][recursion_level];}int RLOG_GetEvent(RLOG_IOStruct *pInput, int rank, int recursion_level, int index, RLOG_EVENT *pEvent){ int rank_index; if (pInput == NULL || pEvent == NULL || rank < pInput->header.nMinRank || rank > pInput->header.nMaxRank) return -1; rank_index = rank - pInput->header.nMinRank; if (recursion_level < 0 || recursion_level >= pInput->pNumEventRecursions[rank_index]) return -1; if (index < 0 || index >= pInput->ppNumEvents[rank_index][recursion_level]) return -1; fseek(pInput->f, pInput->ppEventOffset[rank_index][recursion_level] + (index * sizeof(RLOG_EVENT)), SEEK_SET); ReadFileData((char*)pEvent, sizeof(RLOG_EVENT), pInput->f); /* GetEvent sets the current iteration position also */ pInput->ppCurEvent[rank_index][recursion_level] = index+1; return 0;}int RLOG_FindEventBeforeTimestamp(RLOG_IOStruct *pInput, int rank, int recursion_level, double timestamp, RLOG_EVENT *pEvent, int *pIndex){ RLOG_EVENT event; int low, high, mid; int rank_index; if (pInput == NULL || pEvent == NULL || rank < pInput->header.nMinRank || rank > pInput->header.nMaxRank) return -1; rank_index = rank - pInput->header.nMinRank; if (recursion_level < 0 || recursion_level >= pInput->pNumEventRecursions[rank_index]) return -1; low = 0; high = pInput->ppNumEvents[rank_index][recursion_level]-1; mid = high/2; for (;;) { RLOG_GetEvent(pInput, rank, recursion_level, mid, &event); if (event.start_time < timestamp) { low = mid; } else high = mid; mid = (low + high) / 2; if (low == mid) { if (event.start_time < timestamp) { RLOG_GetEvent(pInput, rank, recursion_level, low+1, &event); if (event.start_time < timestamp) low++; } break; } } if (pIndex != NULL) *pIndex = low; return RLOG_GetEvent(pInput, rank, recursion_level, low, pEvent);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?