-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathall2all.cpp
More file actions
63 lines (57 loc) · 1.51 KB
/
all2all.cpp
File metadata and controls
63 lines (57 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include "../../utils/utils.hh"
#include "../../utils/TimeStamp.hh"
#include "all2all.hh"
#include <mpi.h>
//all2all.hh.
double mpi_all2all(int rank, int nprocs,
double *sendbuf, double *recvbuf, int n){
TimeStamp clk;
clk.tic();
MPI_Alltoall(sendbuf, n, MPI_DOUBLE, recvbuf, n, MPI_DOUBLE,
MPI_COMM_WORLD);
double cycles = clk.toc();
return cycles;
}
//all2all.hh.
double scatter_all2all(int rank, int nprocs,
double *sendbuf, double *recvbuf, int n){
TimeStamp clk;
clk.tic();
for(int root=0; root < nprocs; root++)
MPI_Scatter(sendbuf, n, MPI_DOUBLE,
recvbuf+n*root,n,MPI_DOUBLE,
root,MPI_COMM_WORLD);
double cycles = clk.toc();
return cycles;
}
//all2all.hh.
MPI_Request *all2all_init(int rank, int nprocs,
double *sendbuf, double *recvbuf, int n){
MPI_Request *reqlist = new MPI_Request[2*nprocs];
for(int i=0; i < nprocs; i++) {
int dest = i;
int tag = rank;
MPI_Send_init(sendbuf+dest*n, n, MPI_DOUBLE, dest, tag,
MPI_COMM_WORLD, reqlist+i);
}
for(int i=0; i < nprocs; i++){
int source = i;
int tag = source;
MPI_Recv_init(recvbuf+source*n, n, MPI_DOUBLE, source, tag,
MPI_COMM_WORLD, reqlist+nprocs+i);
}
return reqlist;
}
//all2all.hh.
double all2all(int rank, int nprocs, MPI_Request* reqlist){
TimeStamp clk;
clk.tic();
MPI_Startall(2*nprocs, reqlist);
MPI_Waitall(2*nprocs, reqlist, MPI_STATUS_IGNORE);
double cycles = clk.toc();
return cycles;
}
//all2all.hh.
void all2all_finalize(MPI_Request *reqlist){
delete[] reqlist;
}