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

📄 rlogutil.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 3 页
字号:
	{	    event.start_time += pOffsets[index];	    event.end_time += pOffsets[index];	    fseek(f, -(int)sizeof(RLOG_EVENT), SEEK_CUR);	    error = WriteFileData((const char *)&event, sizeof(RLOG_EVENT), f);	    if (error)	    {		rlog_err_printf("writing modified event failed.\n");		return -1;	    }	    fseek(f, 0, SEEK_CUR);	}    }    return 0;}int RLOG_ModifyEvents(const char *filename, double *pOffsets, int n){    int i, rank_index, cur_rank, min_rank = 0;    /*int j;*/    RLOG_IOStruct *pInput;    int type, length;    int error;    /* allocate an input structure */    pInput = (RLOG_IOStruct*)malloc(sizeof(RLOG_IOStruct));    if (pInput == NULL)    {	printf("malloc failed - %s\n", strerror(errno));	return -1;    }    pInput->ppCurEvent = NULL;    pInput->ppCurGlobalEvent = NULL;    pInput->gppCurEvent = NULL;    pInput->gppPrevEvent = NULL;    pInput->ppEventOffset = NULL;    pInput->ppNumEvents = NULL;    pInput->nNumArrows = 0;    /* 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 -1;    }    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))	    {		rlog_err_printf("error in header size %d != %d\n", length, sizeof(RLOG_FILE_HEADER));		return -1;	    }	    if (ReadFileData((char*)&pInput->header, sizeof(RLOG_FILE_HEADER), pInput->f))	    {		rlog_err_printf("error reading rlog header\n");		return -1;	    }	    	    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);	    error = ModifyArrows(pInput->f, pInput->nNumArrows, pInput->header.nMinRank, pOffsets, n);	    if (error)	    {		printf("Modifying the arrow section failed, error %d\n", error);		RLOG_CloseInputStruct(&pInput);		return -1;	    }	    /* 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);		RLOG_CloseInputStruct(&pInput);		return -1;	    }	    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));	    ModifyEvents(pInput->f, length / sizeof(RLOG_EVENT), pInput->header.nMinRank, pOffsets, n);	    /* 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);    */    RLOG_CloseInputStruct(&pInput);    return 0;}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);    if (ReadFileData((char*)pState, sizeof(RLOG_STATE), pInput->f))    {	rlog_err_printf("Error reading rlog state\n");	return -1;    }    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);    if (ReadFileData((char*)pState, sizeof(RLOG_STATE), pInput->f))    {	rlog_err_printf("Error reading next rlog state\n");	return -1;    }    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);    if (ReadFileData((char*)pArrow, sizeof(RLOG_ARROW), pInput->f))    {	rlog_err_printf("Error reading rlog arrow\n");	return -1;    }    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);    if (ReadFileData((char*)pArrow, sizeof(RLOG_ARROW), pInput->f))    {	rlog_err_printf("Error reading next rlog arrow\n");	return -1;    }    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);    if (ReadFileData((char*)pEvent, sizeof(RLOG_EVENT), pInput->f))    {	rlog_err_printf("Error reading rlog event\n");	return -1;    }    /* 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);}int RLOG_FindAnyEventBeforeTimestamp(RLOG_IOStruct *pInput, int rank, double timestamp, RLOG_EVENT *pEvent){    RLOG_EVENT event, cur_event;    int index, i, rank_index;    if (pInput == NULL || pEvent == NULL || rank < pInput->header.nMinRank || rank > pInput->header.nMaxRank)	return -1;    rank_index = rank - pInput->header.nMinRank;    if (RLOG_FindEventBeforeTimestamp(pInput, rank, 0, timestamp, &event, &index) == -1)	return -1;    for (i=1; i<pInput->pNumEventRecursions[rank_index]; i++)    {	if (RLOG_FindEventBeforeTimestamp(pInput, rank, i, timestamp, &cur_event, &index) != -1)	{

⌨️ 快捷键说明

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