2 /*****************************************************************************
4 * Function: alltoall_pair
9 send_buff: send input buffer
10 send_count: number of elements to send
11 send_type: data type of elements being sent
12 recv_buff: receive output buffer
13 recv_count: number of elements to received
14 recv_type: data type of elements being received
17 * Descrp: Function works when P is power of two. In each phase of P - 1
18 phases, nodes in pair communicate their data.
22 ****************************************************************************/
25 alltoall_pair(void * send_buff, int send_count, MPI_Datatype send_type,
26 void * recv_buff, int recv_count, MPI_Datatype recv_type,
30 MPI_Aint send_chunk, recv_chunk;
34 int i, src, dst, rank, num_procs;
35 int tag = 1, success = 1, failure = 0, pof2 = 1;
37 char * send_ptr = (char *) send_buff;
38 char * recv_ptr = (char *) recv_buff;
40 MPI_Comm_rank(comm, &rank);
41 MPI_Comm_size(comm, &num_procs);
42 MPI_Type_extent(send_type, &send_chunk);
43 MPI_Type_extent(recv_type, &recv_chunk);
45 MPI_Win_create(recv_buff, num_procs*recv_chunk*send_count,recv_chunk,0,
47 send_chunk *= send_count;
48 recv_chunk *= recv_count;
50 MPI_Win_fence(assert, win);
51 for (i = 0; i < num_procs; i++)
54 MPI_Put(send_ptr + dst * send_chunk, send_count, send_type, dst,
55 rank*send_chunk, send_count, send_type, win);
57 MPI_Win_fence (assert, win);
64 smpi_coll_tuned_alltoall_pair(void * send_buff, int send_count, MPI_Datatype send_type,
65 void * recv_buff, int recv_count, MPI_Datatype recv_type,
69 MPI_Aint send_chunk, recv_chunk;
71 int i, src, dst, rank, num_procs;
72 int tag = 1, success = 1;
74 char * send_ptr = (char *) send_buff;
75 char * recv_ptr = (char *) recv_buff;
77 MPI_Comm_rank(comm, &rank);
78 MPI_Comm_size(comm, &num_procs);
79 MPI_Type_extent(send_type, &send_chunk);
80 MPI_Type_extent(recv_type, &recv_chunk);
82 send_chunk *= send_count;
83 recv_chunk *= recv_count;
85 for (i = 0; i < num_procs; i++)
88 MPI_Sendrecv(send_ptr + dst * send_chunk, send_count, send_type, dst,
89 tag, recv_ptr + src * recv_chunk, recv_count, recv_type,