Esempio n. 1
0
void initialize_comunicadors (int n_ptasks)
{
	int ii;
	unsigned jj;

	/* Init intra-communicator */
	INIT_QUEUE (&comunicadors);

#if defined(DEBUG_COMMUNICATORS)
	fprintf (stderr, "DEBUG: Initializing communicators\n");
#endif

	alies_comunicadors = (CommAliasInfo_t **) malloc (n_ptasks * sizeof (CommAliasInfo_t *));
	ASSERT(alies_comunicadors!=NULL, "Not enough memory for intra-communicators alias");

	for (ii = 0; ii < n_ptasks; ii++)
	{
		ptask_t *ptask_info = GET_PTASK_INFO(ii+1);
		alies_comunicadors[ii] = (CommAliasInfo_t *) malloc (ptask_info->ntasks * sizeof (CommAliasInfo_t));
		ASSERT(alies_comunicadors[ii]!=NULL, "Not enough memory for intra-communicators alias");
	}

	/* Init inter-communicator */
	Intercomm_ptask_task = (InterCommInfoAlias_t ***) malloc (n_ptasks * sizeof (InterCommInfoAlias_t **));
	ASSERT(Intercomm_ptask_task!=NULL, "Not enough memory for inter-communicators alias");
	num_InterCommunicatorAlias = (unsigned **) malloc (n_ptasks * sizeof (unsigned *));
	ASSERT(num_InterCommunicatorAlias!=NULL, "Not enough memory for inter-communicators alias");
	for (ii = 0; ii < n_ptasks; ii++)
	{
		ptask_t *ptask_info = GET_PTASK_INFO(ii+1);

		Intercomm_ptask_task[ii] = (InterCommInfoAlias_t**) malloc (ptask_info->ntasks * sizeof (InterCommInfoAlias_t *));
		ASSERT(Intercomm_ptask_task[ii]!=NULL, "Not enough memory for inter-communicators alias");
		memset (Intercomm_ptask_task[ii], 0, ptask_info->ntasks*sizeof(InterCommInfoAlias_t*));

		num_InterCommunicatorAlias[ii] = (unsigned*) malloc (ptask_info->ntasks * sizeof(unsigned));
		ASSERT(num_InterCommunicatorAlias[ii]!=NULL, "Not enough memory for inter-communicators alias");
		memset (num_InterCommunicatorAlias[ii], 0, ptask_info->ntasks*sizeof(unsigned));
	}

	for (ii = 0; ii < n_ptasks; ii++)
	{
		ptask_t *ptask_info = GET_PTASK_INFO(ii+1);
		for (jj = 0; jj < ptask_info->ntasks; jj++)
			INIT_QUEUE (&(alies_comunicadors[ii][jj]));
	}
}
/******************************************************************************
 *** Paraver_WriteHeader
 ******************************************************************************/
static int Paraver_WriteHeader (FileSet_t *fset, int numtasks, int taskid,
	unsigned num_appl, unsigned long long Ftime, struct fdz_fitxer prv_fd,
	struct Pair_NodeCPU *info)
{
	int NumNodes;
	char Header[1024];
	unsigned threads, task, ptask, node;
	TipusComunicador com;
	int final;

	UNREFERENCED_PARAMETER(numtasks);
#if !defined(PARALLEL_MERGE)
	UNREFERENCED_PARAMETER(fset);
#endif

	if (taskid == 0)
	{
		char Date[80];
		time_t h;

		time (&h);
		strftime (Date, 80, "%d/%m/%Y at %H:%M", localtime (&h));

		/* Write the Paraver header */
#if SIZEOF_LONG == 8
		sprintf (Header, "#Paraver (%s):%lu_ns:", Date, Ftime);
#elif SIZEOF_LONG == 4
		sprintf (Header, "#Paraver (%s):%llu_ns:", Date, Ftime);
#endif
		PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));

		NumNodes = 0;
		while (info[NumNodes].files != NULL)
			NumNodes++;

		sprintf (Header, "%d(", NumNodes);
		PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));

		if (NumNodes > 0)
		{
			sprintf (Header, "%d", info[0].CPUs);
			PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));

			NumNodes = 1;
			while (info[NumNodes].CPUs > 0)
			{
				sprintf (Header,",%d", info[NumNodes].CPUs);
				PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));
				NumNodes++;
			}
		}
		sprintf (Header, "):%d:", num_appl);
		PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));
	}

	/* For every application, write down its resources */
	for (ptask = 0; ptask < num_appl; ptask++)
	{
#if defined(PARALLEL_MERGE)
		unsigned *vthreads_count = Gather_Paraver_VirtualThreads (taskid, ptask,
			fset);
#endif

		if (taskid == 0)
		{
			ptask_t *ptask_info = GET_PTASK_INFO(ptask+1);
			task_t *last_task_info = GET_TASK_INFO(ptask+1,ptask_info->ntasks);

			sprintf (Header, "%d(", ptask_info->ntasks);
			PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));

			for (task = 0; task < ptask_info->ntasks-1; task++)
			{
				task_t *task_info = GET_TASK_INFO(ptask+1,task+1);

#if defined(PARALLEL_MERGE)
				threads = vthreads_count[task];
#else
				threads = task_info->num_virtual_threads; /*nthreads;*/
#endif
				node = task_info->nodeid;

				sprintf (Header, "%d:%d,", threads, node);
				PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));
			}
#if defined(PARALLEL_MERGE)
			threads = vthreads_count[ptask_info->ntasks-1];
#else
			threads = last_task_info->num_virtual_threads; /* nthreads */
#endif
			node = last_task_info->nodeid;

			/* Add the communicators info at the last application / ptask */
			if (ptask == num_appl-1)
				sprintf (Header, "%d:%d),%d", threads, node, numero_comunicadors());
			else
				sprintf (Header, "%d:%d),", threads, node);
			PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));

#if defined(PARALLEL_MERGE)
			free (vthreads_count);			
#endif
		}
	}

	if (taskid == 0)
	{
		sprintf (Header, "\n");
		PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));

		/* Write the communicator definition for every application */
		for (ptask = 1; ptask <= num_appl; ptask++)
		{
			/* Write the communicators created manually by the application */
			final = (primer_comunicador (&com) < 0);
			while (!final)
			{
				unsigned u;

				/* Write this communicator */
				sprintf (Header, "c:%d:%lu:%d", ptask, com.id, com.num_tasks);
				PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));
				for (u = 0; u < com.num_tasks; u++)
				{
					sprintf (Header, ":%d", com.tasks[u] + 1);
					PRVWRITECNTL (FDZ_WRITE (prv_fd, Header));
				}
				PRVWRITECNTL (FDZ_WRITE (prv_fd, "\n"));

				/* Get the next communicator */
				final = (seguent_comunicador (&com) < 0);
			}