示例#1
0
int Labels_GeneratePCFfile (char *name, long long options)
{
	FILE *fd;

	fd = fopen (name, "w");
	if (fd == NULL)
		return -1;

	Paraver_default_options (fd);

	Paraver_state_labels (fd);
	Paraver_state_colors (fd);

	MPITEvent_WriteEnabled_MPI_Operations (fd);
	SoftCountersEvent_WriteEnabled_MPI_Operations (fd);
	OMPEvent_WriteEnabledOperations (fd);
	WriteEnabled_pthread_Operations (fd);
	MISCEvent_WriteEnabledOperations (fd, options);
	CUDAEvent_WriteEnabledOperations (fd);

#if USE_HARDWARE_COUNTERS
	HWC_PARAVER_Labels (fd);
#endif

	Paraver_gradient_colors (fd);
	Paraver_gradient_names (fd);

#ifdef HAVE_BFD
	Address2Info_Write_LibraryIDs (fd);
	Address2Info_Write_MPI_Labels (fd, get_option_merge_UniqueCallerID());
	Address2Info_Write_UF_Labels (fd, get_option_merge_UniqueCallerID());
	Address2Info_Write_Sample_Labels (fd, get_option_merge_UniqueCallerID());
	Address2Info_Write_CUDA_Labels (fd, get_option_merge_UniqueCallerID());
	Address2Info_Write_OTHERS_Labels (fd, get_option_merge_UniqueCallerID(),
		num_labels_codelocation, labels_codelocation);
# if defined(BFD_MANAGER_GENERATE_ADDRESSES)
	if (get_option_dump_Addresses())
		ObjectTable_dumpAddresses (fd, ADDRESSES_FOR_BINARY_EV);
# endif
#endif

	Write_rusage_Labels (fd);
	Write_memusage_Labels (fd);
	Write_MPI_Stats_Labels (fd);
	Write_Trace_Mode_Labels (fd);
	Write_Clustering_Labels (fd);
	Write_Spectral_Labels (fd);
	WriteEnabled_OpenCL_Operations (fd);
	WriteEnabled_OPENSHMEM_Operations (fd);

	Write_UserDefined_Labels(fd);

	Write_BasickBlock_Labels(fd);
    
	Concat_User_Labels (fd);

	fclose(fd);
    
	return 0;
}
示例#2
0
void WriteEnabled_pthread_Operations (FILE * fd)
{
	unsigned u;
	int anypresent = FALSE;
#if defined(HAVE_BFD)
	int createpresent = FALSE;
#endif

	for (u = 0; u < MAX_PTHREAD_TYPE_ENTRIES; u++)
	{
		anypresent = anypresent || pthread_event_presency_label[u].present;
#if defined(HAVE_BFD)
		if (pthread_event_presency_label[u].eventtype == PTHREAD_CREATE_EV)
			createpresent = TRUE;
#endif
	}

	if (anypresent)
	{

		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "%d    %d    %s\n", 0, PTHREAD_BASE_EV, "pthread call");
		fprintf (fd, "VALUES\n");
		fprintf (fd, "0 Outside pthread call\n");
		for (u = 0; u < MAX_PTHREAD_TYPE_ENTRIES; u++)
			if (pthread_event_presency_label[u].present)
				fprintf (fd, "%d %s\n", 
					pthread_event_presency_label[u].eventval,
					pthread_event_presency_label[u].description);
		LET_SPACES(fd);
	}

#if defined(HAVE_BFD)
	/* Hey, pthread & OpenMP share the same labels? */
	if (createpresent)
		Address2Info_Write_OMP_Labels (fd, PTHREAD_FUNC_EV, "pthread function",
			PTHREAD_FUNC_LINE_EV, "pthread function line and file",
			get_option_merge_UniqueCallerID());
#endif
}
void OMPEvent_WriteEnabledOperations (FILE * fd)
{
	if (inuse[JOIN_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d  OpenMP Worksharing join\n", JOIN_EV);
		fprintf (fd, "VALUES\n"
		             "0 End\n"
		             "%d Join (w wait)\n"
		             "%d Join (w/o wait)\n\n",
		             JOIN_WAIT_VAL, JOIN_NOWAIT_VAL);
	}
	if (inuse[WRK_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d  OpenMP Worksharing work dispatcher\n", WORK_EV);
		fprintf (fd, "VALUES\n"
		             "0 End\n"
		             "1 Begin\n\n");
	}
	if (inuse[PAR_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d  Parallel (OMP)\n", PAR_EV);
		fprintf (fd, "VALUES\n"
		             "0 close\n"
		             "1 DO (open)\n"
		             "2 SECTIONS (open)\n"
		             "3 REGION (open)\n\n");
	}
	if (inuse[WSH_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d Worksharing (OMP)\n", WSH_EV);
		fprintf (fd, "VALUES\n"
		             "0 End\n"
		             "4 DO \n"
		             "5 SECTIONS\n"
		             "6 SINGLE\n\n");
	}
#if defined(HAVE_BFD)
	if (inuse[FNC_OMP_INDEX])
	{
		Address2Info_Write_OMP_Labels (fd, OMPFUNC_EV, "Executed OpenMP parallel function",
			OMPFUNC_LINE_EV, "Executed OpenMP parallel function line and file",
			get_option_merge_UniqueCallerID());
		Address2Info_Write_OMP_Labels (fd, TASKFUNC_EV, "Executed OpenMP task function",
			TASKFUNC_LINE_EV, "Executed OpenMP task function line and file",
			get_option_merge_UniqueCallerID());
		Address2Info_Write_OMP_Labels (fd, TASKFUNC_INST_EV, "Instantiated OpenMP task function",
			TASKFUNC_INST_LINE_EV, "Instantiated OpenMP task function line and file",
			get_option_merge_UniqueCallerID());
	}
#endif
	if (inuse[LCK_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OpenMP named-Lock\n", NAMEDCRIT_EV);
		fprintf (fd, "VALUES\n"
		             "%d Unlocked status\n"
		             "%d Lock\n"
		             "%d Unlock\n"
		             "%d Locked status\n\n",
		             UNLOCKED_VAL, LOCK_VAL, UNLOCK_VAL, LOCKED_VAL);

		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OpenMP named-Lock address name\n", NAMEDCRIT_NAME_EV);
	}
	if (inuse[ULCK_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OpenMP unnamed-Lock\n", UNNAMEDCRIT_EV);
		fprintf (fd, "VALUES\n"
		             "%d Unlocked status\n"
		             "%d Lock\n"
		             "%d Unlock\n"
		             "%d Locked status\n\n",
		             UNLOCKED_VAL, LOCK_VAL, UNLOCK_VAL, LOCKED_VAL);
	}
	if (inuse[BARRIER_OMP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OpenMP barrier\n", BARRIEROMP_EV);
		fprintf (fd, "VALUES\n0 End\n1 Begin\n");
	}
	if (inuse[GETSETNUMTHREADS_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OpenMP set num threads\n", OMPSETNUMTHREADS_EV);
		fprintf (fd, "0 %d OpenMP get num threads\n", OMPGETNUMTHREADS_EV);
		fprintf (fd, "VALUES\n"
		             "0 End\n"
		             "1 Begin\n");
	}
	if (inuse[TASKWAIT_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OMP taskwait\n", TASKWAIT_EV);
		fprintf (fd, "VALUES\n0 End\n1 Begin\n\n");
	}
	if (inuse[TASKLOOP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		  "0 %d Taskloop Identifier\n\n",
		  TASKLOOPID_EV);

		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OMP taskloop\n", TASKLOOP_EV);
		fprintf (fd, "VALUES\n0 End\n1 Begin\n\n");
	}
	if (inuse[ORDERED_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n");
		fprintf (fd, "0 %d OpenMP ordered section\n", ORDERED_EV);
		fprintf (fd, "VALUES\n"
						     "%d Outside ordered\n"
						     "%d Waiting to enter\n"
						     "%d Signaling the exit\n"
						     "%d Inside ordered\n\n",
						     OUTORDERED_VAL, WAITORDERED_VAL, POSTORDERED_VAL, INORDERED_VAL);
	}
	if (inuse[OMPT_CRITICAL_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP critical\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_CRITICAL_EV);
	}
	if (inuse[OMPT_ATOMIC_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP atomic\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_ATOMIC_EV);
	}
	if (inuse[OMPT_LOOP_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP loop\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_LOOP_EV);
	}
	if (inuse[OMPT_WORKSHARE_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP workshare\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_WORKSHARE_EV);
	}
	if (inuse[OMPT_SECTIONS_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP sections\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_SECTIONS_EV);
	}
	if (inuse[OMPT_SINGLE_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP single\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_SINGLE_EV);
	}
	if (inuse[OMPT_MASTER_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		             "0 %d OMP master\n"
		             "VALUES\n0 End\n1 Begin\n\n",
		         OMPT_MASTER_EV);
	}
	if (inuse[TASKGROUP_START_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		  "0 %d Taskgroup calls\n"
		  "VALUES\n0 Outside\n1 Start\n2 End\n",
		  TASKGROUP_START_EV);
		fprintf (fd, "EVENT_TYPE\n"
		  "0 %d Within Taskgroup region\n"
		  "VALUES\n0 End\n1 Begin\n\n",
		  TASKGROUP_INGROUP_DEEP_EV);
	}
	if (inuse[TASK_INDEX])
	{
		fprintf (fd, "EVENT_TYPE\n"
		  "0 %d Task Identifier\n\n",
		  TASKID_EV);
	}
	if (inuse[OMP_STATS_INDEX])
	{
		fprintf (fd,
		  "EVENT_TYPE\n"
		  "0 %d Number of OpenMP instantiated tasks\n"
		  "0 %d Number of OpenMP executed tasks\n\n",
		OMP_STATS_BASE+OMP_NUM_TASKS_INSTANTIATED,
		OMP_STATS_BASE+OMP_NUM_TASKS_EXECUTED);
	}
}
static UINT64 paraver_translate_bfd_event (unsigned ptask, unsigned task,
	unsigned eventtype, UINT64 eventvalue)
{
	if (eventtype == USRFUNC_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2UF_FUNCTION, get_option_merge_UniqueCallerID());
	else if (eventtype == USRFUNC_LINE_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2UF_LINE, get_option_merge_UniqueCallerID());
	else if (eventtype >= CALLER_EV && eventtype < CALLER_EV + MAX_CALLERS)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2MPI_FUNCTION, get_option_merge_UniqueCallerID());
	else if (eventtype >= CALLER_LINE_EV && eventtype < CALLER_LINE_EV + MAX_CALLERS)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2MPI_LINE, get_option_merge_UniqueCallerID());
	else if (eventtype >= SAMPLING_EV && eventtype < SAMPLING_EV + MAX_CALLERS)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2SAMPLE_FUNCTION, get_option_merge_UniqueCallerID());
	else if (eventtype >= SAMPLING_LINE_EV && eventtype < SAMPLING_LINE_EV + MAX_CALLERS)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2SAMPLE_LINE, get_option_merge_UniqueCallerID());
	else if (eventtype == OMPFUNC_EV || eventtype == TASKFUNC_INST_EV || eventtype == TASKFUNC_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2OMP_FUNCTION, get_option_merge_UniqueCallerID());
	else if (eventtype == OMPFUNC_LINE_EV || eventtype == TASKFUNC_INST_LINE_EV || eventtype == TASKFUNC_LINE_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2OMP_LINE, get_option_merge_UniqueCallerID());
	else if (eventtype == PTHREAD_FUNC_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2OMP_FUNCTION, get_option_merge_UniqueCallerID());
	else if (eventtype == PTHREAD_FUNC_LINE_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2OMP_LINE, get_option_merge_UniqueCallerID());
	else if (eventtype == CUDAFUNC_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2CUDA_FUNCTION, get_option_merge_UniqueCallerID());
	else if (eventtype == CUDAFUNC_LINE_EV)
		return Address2Info_Translate (ptask, task, 
		  eventvalue, ADDR2CUDA_LINE, get_option_merge_UniqueCallerID());
	else
	{
		if (Extrae_Vector_Count (&RegisteredCodeLocationTypes) > 0)
		{
			unsigned u;
			unsigned umax = Extrae_Vector_Count (&RegisteredCodeLocationTypes);
			for (u = 0; u < umax; u++)
			{
				Extrae_Addr2Type_t *element = 
					Extrae_Vector_Get (&RegisteredCodeLocationTypes, u);

				if (element->FunctionType == eventtype)
					return Address2Info_Translate (ptask, task, 
					  eventvalue, element->FunctionType_lbl, get_option_merge_UniqueCallerID());
				else if (element->LineType == eventtype)
					return Address2Info_Translate (ptask, task, 
					  eventvalue, element->LineType_lbl, get_option_merge_UniqueCallerID());
			}
		}
	}

	return eventvalue;
}
示例#5
0
void MISCEvent_WriteEnabledOperations (FILE * fd, long long options)
{	
	if (options & TRACEOPTION_BG_ARCH)
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, BG_PERSONALITY_PROCESSOR_ID, BG_PROCESSOR_ID);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_A, BG_TORUS_A);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_B, BG_TORUS_B);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_C, BG_TORUS_C);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_D, BG_TORUS_D);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, BG_PERSONALITY_TORUS_E, BG_TORUS_E);
		LET_SPACES (fd);
	}
	if (inuse[GETCPU_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, GETCPU_EV, GETCPU_LBL);
		LET_SPACES(fd);
	}
	if (inuse[APPL_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, APPL_EV, APPL_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, EVT_END_LBL);
		fprintf (fd, "%d      %s\n", EVT_BEGIN, EVT_BEGIN_LBL);
		LET_SPACES (fd);
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, CLOCK_FROM_SYSTEM_EV,
		  CLOCK_FROM_SYSTEM_LBL);
		LET_SPACES (fd);
	}
	if (inuse[FLUSH_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, FLUSH_EV, FLUSH_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, EVT_END_LBL);
		fprintf (fd, "%d      %s\n", EVT_BEGIN, EVT_BEGIN_LBL);
		LET_SPACES (fd);
	}
	if (inuse[TRACING_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, TRACING_EV, TRACING_LBL);

		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, TRAC_DISABLED_LBL);
		fprintf (fd, "%d      %s\n", EVT_BEGIN, TRAC_ENABLED_LBL);
		LET_SPACES (fd);
	}
	if (inuse[TRACE_INIT_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, TRACE_INIT_EV, TRACE_INIT_LBL);

		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, EVT_END_LBL);
		fprintf (fd, "%d      %s\n", EVT_BEGIN, EVT_BEGIN_LBL);
		LET_SPACES (fd);
	}
	if (inuse[INOUT_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, IO_EV, IO_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, EVT_END_LBL);
		fprintf (fd, "%d      %s\n", READ_VAL_EV, READ_LBL);
		fprintf (fd, "%d      %s\n", WRITE_VAL_EV, WRITE_LBL);
		LET_SPACES (fd);
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, IO_SIZE_EV, IO_SIZE_LBL);
		LET_SPACES (fd);
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, IO_DESCRIPTOR_EV, IO_DESCRIPTOR_LBL);
		LET_SPACES (fd);
	}
	if (inuse[FORK_SYSCALL_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, FORK_SYSCALL_EV, FORK_SYSCALL_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, EVT_END_LBL);
		fprintf (fd, "%d      %s\n", PRV_FORK_VALUE, FORK_LBL);
		fprintf (fd, "%d      %s\n", PRV_WAIT_VALUE, WAIT_LBL);
		fprintf (fd, "%d      %s\n", PRV_WAITPID_VALUE, WAITPID_LBL);
		fprintf (fd, "%d      %s\n", PRV_EXEC_VALUE, EXEC_LBL);
		fprintf (fd, "%d      %s\n", PRV_SYSTEM_VALUE, SYSTEM_LBL);
		LET_SPACES (fd);
	}
	if (inuse[DYNAMIC_MEM_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, DYNAMIC_MEM_EV, DYNAMIC_MEM_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "%d      %s\n", EVT_END, EVT_END_LBL);
		fprintf (fd, "%d      %s\n", PRV_MALLOC_VALUE, MALLOC_LBL);
		fprintf (fd, "%d      %s\n", PRV_FREE_VALUE, FREE_LBL);
		fprintf (fd, "%d      %s\n", PRV_REALLOC_VALUE, REALLOC_LBL);
		fprintf (fd, "%d      %s\n", PRV_CALLOC_VALUE, CALLOC_LBL);
		LET_SPACES (fd);

		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT,
		  DYNAMIC_MEM_REQUESTED_SIZE_EV,
		  DYNAMIC_MEM_REQUESTED_SIZE_LBL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT,
		  DYNAMIC_MEM_POINTER_IN_EV,
		  DYNAMIC_MEM_POINTER_IN_LBL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT,
		  DYNAMIC_MEM_POINTER_OUT_EV,
		  DYNAMIC_MEM_POINTER_OUT_LBL);
		LET_SPACES (fd);
	}
	if (inuse[SAMPLING_MEM_INDEX])
	{
		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_LD_EV,
		  SAMPLING_ADDRESS_LD_LBL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_ST_EV,
		  SAMPLING_ADDRESS_ST_LBL);
		LET_SPACES (fd);

		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_MEM_LEVEL_EV,
		  SAMPLING_ADDRESS_MEM_LEVEL_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "0 other (uncacheable or I/O)\n");
		fprintf (fd, "1 L1 cache\n");
		fprintf (fd, "2 Line Fill Buffer (LFB)\n");
		fprintf (fd, "3 L2 cache\n");
		fprintf (fd, "4 L3 cache\n");
		fprintf (fd, "5 Remote (1 or 2 hop) cache\n");
		fprintf (fd, "6 DRAM (either local or remote)\n");
		LET_SPACES(fd);

		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_MEM_HITORMISS_EV,
		  SAMPLING_ADDRESS_MEM_HITORMISS_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "0 N/A\n");
		fprintf (fd, "1 hit\n");
		fprintf (fd, "2 miss\n");
		LET_SPACES (fd);

		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_TLB_LEVEL_EV,
		  SAMPLING_ADDRESS_TLB_LEVEL_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "0 other (hw walker or OS fault handler)\n");
		fprintf (fd, "1 L1 TLB\n");
		fprintf (fd, "2 L2 TLB\n");
		LET_SPACES (fd);

		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_TLB_HITORMISS_EV,
		  SAMPLING_ADDRESS_TLB_HITORMISS_LBL);
		fprintf (fd, "%s\n", VALUES_LABEL);
		fprintf (fd, "0 N/A\n");
		fprintf (fd, "1 hit\n");
		fprintf (fd, "2 miss\n");
		LET_SPACES (fd);

		fprintf (fd, "%s\n", TYPE_LABEL);
		fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, SAMPLING_ADDRESS_REFERENCE_COST_EV,
		  SAMPLING_ADDRESS_REFERENCE_COST_LBL);
		LET_SPACES (fd);

		Address2Info_Write_MemReferenceCaller_Labels (fd, get_option_merge_UniqueCallerID());
	}

	/* These events are always emitted */
	fprintf (fd, "%s\n", TYPE_LABEL);
	fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, PID_EV, PID_LBL);
	fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, PPID_EV, PPID_LBL);
	fprintf (fd, "%d    %d    %s\n", MISC_GRADIENT, FORK_DEPTH_EV, FORK_DEPTH_LBL);
	LET_SPACES (fd);
}
示例#6
0
/******************************************************************************
 *** Labels_loadSYMfile
 ******************************************************************************/
void Labels_loadSYMfile (int taskid, int allobjects, unsigned ptask,
	unsigned task, char *name, int report)
{
#ifndef HAVE_BFD
	static int shown_BFD_missing = FALSE;
#endif
	static int Labels_loadSYMfile_init = FALSE;
	FILE *FD;
	char LINE[1024], Type;
	unsigned function_count = 0, hwc_count = 0, other_count = 0;

	if (!Labels_loadSYMfile_init)
	{
		Extrae_Vector_Init (&defined_user_event_types);
        Extrae_Vector_Init (&defined_basic_block_labels);
		Labels_loadSYMfile_init = TRUE;
	}
	event_type_t * last_event_type_used = NULL;

	if (!name)
		return;

	if (strlen(name) == 0)
		return;

	if (!file_exists(name))
		return;

	FD = (FILE *) fopen (name, "r");
	if (FD == NULL)
	{
		fprintf (stderr, "mpi2prv: WARNING: Task %d Can\'t open symbols file %s\n", taskid, name);
		return;
	}

	while (!feof (FD))
	{
		int args_assigned;

		if (fgets (LINE, 1024, FD) == NULL)
			break;

		args_assigned = sscanf (LINE, "%c %[^\n]", &Type, LINE);

		if (args_assigned == 2)
		{
			switch (Type)
			{
				case 'B':
					{
						unsigned long start, end, offset;
						char module[1024];
						int res = sscanf (LINE, "0 \"%lx-%lx %lx %[^\n\"]\"", &start, &end, &offset, module);
						if (res == 4)
						{
#ifdef HAVE_BFD
							ObjectTable_AddBinaryObject (allobjects, ptask, task, start, end, offset, module);
#else
							if (!shown_BFD_missing)
								fprintf (stdout, "mpi2prv: Ignoring symbols from the application execution because mpi2prv does not support BFD\n");
							shown_BFD_missing = TRUE;
							UNREFERENCED_PARAMETER(allobjects);
							UNREFERENCED_PARAMETER(ptask);
							UNREFERENCED_PARAMETER(task);
#endif
						}
						else
							fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);
					}
					break;

				case 'O':
				case 'U':
				case 'P':
					{
#ifdef HAVE_BFD
						/* Example of line: U 0x100016d4 fA mpi_test.c 0 */
						char fname[1024], modname[1024];
						int line;
						int type;
						int res;
						UINT64 address;

						res = sscanf (LINE, "%lx \"%[^\"]\" \"%[^\"]\" %d", &address, fname, modname, &line);
						if (res != 4)
							fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);

						if (!get_option_merge_UniqueCallerID())
						{
							if (Type == 'O')
								type = OTHER_FUNCTION_TYPE;
							else if (Type == 'U')
								type = USER_FUNCTION_TYPE;
							else /* if (Type == 'P') */
								type = OUTLINED_OPENMP_TYPE;
						}
						else
							type = UNIQUE_TYPE;

						Address2Info_AddSymbol (address, type, fname, modname, line);
						function_count++;
#endif /* HAVE_BFD */
					}
					break;

				case 'H':
					{
						int res, eventcode;
						char hwc_description[1024];

						res = sscanf (LINE, "%d \"%[^\"]\"", &eventcode, hwc_description);
						if (res != 2)
							fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);

						Labels_AddHWCounter_Code_Description (eventcode, hwc_description);
						hwc_count++;
					}
					break;

				case 'c':
				case 'C':
					{
						int res, eventcode;
						char code_description[1024];

						res = sscanf (LINE, "%d \"%[^\"]\"", &eventcode, code_description);
						if (res != 2)
							fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);

						Labels_Add_CodeLocation_Label (eventcode,
							Type=='C'?CODELOCATION_FUNCTION:CODELOCATION_FILELINE,
							code_description);
						other_count++;
					}
					break;

                case 'd':
                    {
                        int res, eventvalue;
                        char value_description[1024];
                        value_t * evt_value = NULL;
                        unsigned i, max = Extrae_Vector_Count (&last_event_type_used->event_values);

                        res = sscanf (LINE, "%d \"%[^\"]\"", &eventvalue, value_description);
                        if (res != 2)
                            fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);
                        
                        for (i = 0; i < max; i++)
                        {
                            value_t * evt = Extrae_Vector_Get (&last_event_type_used->event_values, i);
                            if(evt->value == eventvalue)
                            {
                                if(strcmp(evt->label, value_description))
                                {
                                    fprintf(stderr, PACKAGE_NAME"(%s,%d): Warning! Ignoring duplicate definition \"%s\" for value type %d,%d!\n",__FILE__, __LINE__, value_description,last_event_type_used->event_type.type, eventvalue);
                                }
                                evt_value = evt;
                                break;
                            }
                        }
                        if (!evt_value)
                        {
                            evt_value = (value_t*) malloc (sizeof (value_t));
                            if (evt_value == NULL)
                            {
                                fprintf (stderr, PACKAGE_NAME"(%s,%d): Fatal error! Cannot allocate memory to store the 'd' symbol in TRACE.sym file\n", __FILE__, __LINE__);
                                exit(-1);
                            }
                            evt_value->value = eventvalue;
                            strcpy(evt_value->label, value_description);
                            Extrae_Vector_Append (&last_event_type_used->event_values, evt_value);
                            other_count++;
                        }
                    }
                    break;
                case 'D':
                    {
                        int res, eventcode;
                        char code_description[1024];
                        unsigned i, max = Extrae_Vector_Count (&defined_user_event_types);
                        event_type_t * evt_type = NULL;

                        res = sscanf (LINE, "%d \"%[^\"]\"", &eventcode, code_description);
                        if (res != 2)
                            fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);

                        for (i = 0; i < max; i++)
                        {
                            event_type_t * evt = Extrae_Vector_Get (&defined_user_event_types, i);
                            if (evt->event_type.type == eventcode)
                            {
                                if(strcmp(evt->event_type.label, code_description))
                                {
                                    fprintf(stderr, PACKAGE_NAME"(%s,%d): Warning! Ignoring duplicate definition \"%s\" for type %d!\n", __FILE__, __LINE__, code_description, eventcode);
                                }
                                evt_type = evt;
                                break;
                            }
                        }

                        if (!evt_type)
                        {
                            evt_type = (event_type_t*)  malloc (sizeof (event_type_t));
                            if (evt_type == NULL)
                            {
                                fprintf (stderr, "Extrae (%s,%d): Fatal error! Cannot allocate memory to store the 'D' symbol in TRACE.sym file\n", __FILE__, __LINE__);
                                exit(-1);
                            }
                            evt_type->event_type.type = eventcode;
                            strcpy(evt_type->event_type.label, code_description);
                            Extrae_Vector_Init(&evt_type->event_values);
    
                            Extrae_Vector_Append(&defined_user_event_types, evt_type);
                            other_count++;
                        }
                        last_event_type_used = evt_type;
                    }
                    break;

                case 'b': // BasicBlocks symbol
                    {
                        int res, eventvalue;
                        char bb_description[1024];
                        unsigned i, max = Extrae_Vector_Count (&defined_basic_block_labels);
                        event_type_t * evt_type = NULL;
                        value_t * evt_value = NULL;

                        res = sscanf (LINE, "%d \"%[^\"]\"", &eventvalue, bb_description);
                        if (res != 2)
                            fprintf (stderr, PACKAGE_NAME": Error! Invalid line ('%s') in %s\n", LINE, name);
                        if (max==0){
                            evt_type = (event_type_t*)  malloc (sizeof (event_type_t));
                            if (evt_type == NULL)
                            {
                                fprintf (stderr, "Extrae (%s,%d): Fatal error! Cannot allocate memory to store the 'B' symbol in TRACE.sym file\n", __FILE__, __LINE__);
                                exit(-1);
                            }
                            evt_type->event_type.type = USRFUNC_EV_BB;
                            strcpy(evt_type->event_type.label, "BASIC_BLOCKS");
                            Extrae_Vector_Init(&evt_type->event_values);
                            Extrae_Vector_Append(&defined_basic_block_labels, evt_type);
                        } else 
                        {
                            evt_type = Extrae_Vector_Get (&defined_basic_block_labels, 0); // There is only one event type in the vector
                        }

                        max = Extrae_Vector_Count (&evt_type->event_values);

                        for(i = 0; i < max; i++)
                        {
                            value_t * evt = Extrae_Vector_Get (&evt_type->event_values, i);
                            if(evt->value == eventvalue)
                            {
                                if(strcmp(evt->label, bb_description))
                                {
                                    fprintf(stderr, "Extrae (%s,%d): Warning! Ignoring duplicate definition \"%s\" for value type %d,%d!\n",__FILE__, __LINE__, bb_description,evt_type->event_type.type, eventvalue);
                                }
                                evt_value = evt;
                                break;
                            }
                        }

                        if (!evt_value)
                        {
                            evt_value = (value_t*) malloc (sizeof (value_t));
                            if (evt_value == NULL)
                            {
                                fprintf (stderr, "Extrae (%s,%d): Fatal error! Cannot allocate memory to store the 'B' symbol in TRACE.sym file\n", __FILE__, __LINE__);
                                exit(-1);
                            }
                            evt_value->value = eventvalue;
                            strcpy(evt_value->label, bb_description);
                            Extrae_Vector_Append (&evt_type->event_values, evt_value);
                            other_count++;
                        }
                    }
                    break;
				default:
					fprintf (stderr, PACKAGE_NAME" mpi2prv: Error! Task %d found unexpected line in symbol file '%s'\n", taskid, LINE);
					break;
			}
		}
	}

	if (taskid == 0 && report)
	{
		fprintf (stdout, "mpi2prv: A total of %u symbols were imported from %s file\n", function_count+hwc_count+other_count, name);
		fprintf (stdout, "mpi2prv: %u function symbols imported\n", function_count);
		fprintf (stdout, "mpi2prv: %u HWC counter descriptions imported\n", hwc_count);
	}

	fclose (FD);
}