Exemplo n.º 1
0
/*
 * mpiPi_collect_basics() - all tasks send their basic info to the
 * collectorRank.
 */
void
mpiPi_collect_basics ()
{
  int i = 0;
  double app_time = mpiPi.cumulativeTime;
  int cnt;
  mpiPi_task_info_t mti;
  int blockcounts[4] = { 1, 1, 1, MPIPI_HOSTNAME_LEN_MAX };
  MPI_Datatype types[4] = { MPI_DOUBLE, MPI_DOUBLE, MPI_INT, MPI_CHAR };
  MPI_Aint displs[4];
  MPI_Datatype mti_type;
  MPI_Request *recv_req_arr;

  mpiPi_msg_debug ("Collect Basics\n");

  cnt = 0;

  PMPI_Address (&mti.mpi_time, &displs[cnt++]);
  PMPI_Address (&mti.app_time, &displs[cnt++]);
  PMPI_Address (&mti.rank, &displs[cnt++]);
  PMPI_Address (&mti.hostname, &displs[cnt++]);

  for (i = (cnt - 1); i >= 0; i--)
    {
      displs[i] -= displs[0];
    }
  PMPI_Type_struct (cnt, blockcounts, displs, types, &mti_type);
  PMPI_Type_commit (&mti_type);

  if (mpiPi.rank == mpiPi.collectorRank)
    {
      /* In the case where multiple reports are generated per run,
         only allocate memory for global_task_info once */
      if (mpiPi.global_task_info == NULL)
	{
	  mpiPi.global_task_info =
	    (mpiPi_task_info_t *) calloc (mpiPi.size,
					  sizeof (mpiPi_task_info_t));
	  if (mpiPi.global_task_info == NULL)
	    mpiPi_abort ("Failed to allocate memory for global_task_info");

	  mpiPi_msg_debug
	    ("MEMORY : Allocated for global_task_info :          %13ld\n",
	     mpiPi.size * sizeof (mpiPi_task_info_t));
	}

      bzero (mpiPi.global_task_info, mpiPi.size * sizeof (mpiPi_task_info_t));

      recv_req_arr =
	(MPI_Request *) malloc (sizeof (MPI_Request) * mpiPi.size);
      for (i = 0; i < mpiPi.size; i++)
	{
	  mpiPi_task_info_t *p = &mpiPi.global_task_info[i];
	  if (i != mpiPi.collectorRank)
	    {
	      PMPI_Irecv (p, 1, mti_type, i, mpiPi.tag,
			  mpiPi.comm, &(recv_req_arr[i]));
	    }
	  else
	    {
	      strcpy (p->hostname, mpiPi.hostname);
	      p->app_time = app_time;
	      p->rank = mpiPi.rank;
	      recv_req_arr[i] = MPI_REQUEST_NULL;
	    }
	}
      PMPI_Waitall (mpiPi.size, recv_req_arr, MPI_STATUSES_IGNORE);
      free (recv_req_arr);
      /* task MPI time is calculated from callsites data 
         in mpiPi_insert_callsite_records.
       */
      for (i = 0; i < mpiPi.size; i++)
	mpiPi.global_task_info[i].mpi_time = 0.0;
    }
  else
    {
      strcpy (mti.hostname, mpiPi.hostname);
      mti.app_time = app_time;
      mti.rank = mpiPi.rank;
      PMPI_Send (&mti, 1, mti_type, mpiPi.collectorRank,
		 mpiPi.tag, mpiPi.comm);
    }

  PMPI_Type_free (&mti_type);

  return;
}
Exemplo n.º 2
0
int main(int argc, char** argv) {

    MPI_Init(&argc, &argv);

    int rank, peer, commsize;

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &commsize);
    if (rank % 2) peer = rank - 1 % commsize;
    else peer = rank + 1 % commsize;

    if (commsize % 2 != 0) {
        fprintf(stderr, "Use even number of processes.\n");
        exit(EXIT_FAILURE);
    }

    char* mpi_inbuf;
    char* mpi_outbuf;
    char* pmpi_inbuf;
    char* pmpi_outbuf;

    test_start("isend/irecv + test (2, vector[[int], count=2, blklen=3, stride=5])");
    init_buffers(20*sizeof(int), &mpi_inbuf, &pmpi_inbuf, &mpi_outbuf, &pmpi_outbuf);

    MPI_Datatype vector_ddt;
    MPI_Type_vector(2, 3, 5, MPI_INT, &vector_ddt);
    MPI_Type_commit(&vector_ddt);

    MPI_Datatype pmpi_vector_ddt;
    PMPI_Type_vector(2, 3, 5, MPI_INT, &pmpi_vector_ddt);
    PMPI_Type_commit(&pmpi_vector_ddt);

    MPI_Request requests_mpi[2];
    MPI_Request requests_pmpi[2];
    MPI_Status statuses_mpi[2]; 
    MPI_Status statuses_pmpi[2];

    if (rank % 2 == 0) {
        MPI_Isend(mpi_inbuf, 2, vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_mpi[0]));
        MPI_Irecv(mpi_outbuf, 2, vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_mpi[1]));

        PMPI_Isend(pmpi_inbuf, 2, pmpi_vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_pmpi[0]));
        PMPI_Irecv(pmpi_outbuf, 2, pmpi_vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_pmpi[1]));       
    }
    else {
        MPI_Irecv(mpi_outbuf, 2, vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_mpi[0]));       
        MPI_Isend(mpi_inbuf, 2, vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_mpi[1]));

        PMPI_Irecv(pmpi_outbuf, 2, pmpi_vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_pmpi[0]));       
        PMPI_Isend(pmpi_inbuf, 2, pmpi_vector_ddt, peer, 0, MPI_COMM_WORLD, &(requests_pmpi[1]));
    }

    int flag;
    flag = 0;
    while (flag == 0) MPI_Test(&(requests_mpi[0]), &flag, &(statuses_mpi[0]));
    flag = 0;
    while (flag == 0) MPI_Test(&(requests_mpi[1]), &flag, &(statuses_mpi[1]));
    flag = 0;
    while (flag == 0) MPI_Test(&(requests_pmpi[0]), &flag, &(statuses_pmpi[0]));
    flag = 0;
    while (flag == 0) MPI_Test(&(requests_pmpi[1]), &flag, &(statuses_pmpi[1]));

    int res = compare_buffers(20*sizeof(int), &mpi_inbuf, &pmpi_inbuf, &mpi_outbuf, &pmpi_outbuf);
    free_buffers(&mpi_inbuf, &pmpi_inbuf, &mpi_outbuf, &pmpi_outbuf);
    test_result(res);

    MPI_Type_free(&vector_ddt);
    PMPI_Type_free(&pmpi_vector_ddt);

    MPI_Finalize();

}
Exemplo n.º 3
0
int MPI_Type_commit(MPI_Datatype* datatype) {
  return PMPI_Type_commit(datatype);
}