2 * SPDX-License-Identifier: MIT
4 * SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
13 static uint64_t sum_of(uint64_t *values
, size_t values_count
)
16 for (size_t k
=0; k
<values_count
; ++k
) {
24 fprintf(stderr
, "Usage: test-mpi N\n");
28 static uint64_t *allocate_values(size_t upto
)
30 uint64_t *values
= (uint64_t*)malloc(sizeof(uint64_t) * upto
);
31 for (size_t k
=0; k
<upto
; ++k
) {
37 static void send_values(int target
, uint64_t *values
,
41 MPI_Isend(values
, values_count
, MPI_UINT64_T
,
42 target
, 0, MPI_COMM_WORLD
, request
);
45 static void recv_answer(int target
, uint64_t *value
,
48 MPI_Irecv(value
, 1, MPI_UINT64_T
,
49 target
, 0, MPI_COMM_WORLD
, request
);
52 static void send_answer(uint64_t value
)
54 MPI_Send(&value
, 1, MPI_UINT64_T
,
55 0, 0, MPI_COMM_WORLD
);
58 static uint64_t *recv_values(size_t chunk_size
)
60 uint64_t *values
= (uint64_t*)malloc(sizeof(uint64_t) * chunk_size
);
61 MPI_Recv(values
, chunk_size
, MPI_UINT64_T
,
62 0, 0, MPI_COMM_WORLD
, MPI_STATUS_IGNORE
);
66 int main(int argc
, char *argv
[])
77 upto
= atoll(argv
[1]);
80 fprintf(stderr
, "N must be greater than 0\n");
86 MPI_Init(&argc
, &argv
);
88 MPI_Comm_set_errhandler(MPI_COMM_WORLD
,
91 MPI_Comm_rank(MPI_COMM_WORLD
, &rank
);
92 MPI_Comm_size(MPI_COMM_WORLD
, &size
);
99 chunk_size
= upto
/ (size
- 1);
100 rest
= upto
% (size
- 1);
108 MPI_Request requests
[size
- 1];
110 values
= allocate_values(upto
);
112 for (int k
=1; k
<size
; ++k
) {
114 values
+ (chunk_size
* (k
- 1)),
119 sums
[0] = sum_of(values
+ chunk_size
* (size
- 1),
122 MPI_Waitall(size
- 1, requests
, MPI_STATUS_IGNORE
);
124 for (int k
=1; k
<size
; ++k
) {
125 recv_answer(k
, &sums
[k
], &requests
[k
-1]);
128 MPI_Waitall(size
- 1, requests
, MPI_STATUS_IGNORE
);
130 total
= sum_of(sums
, size
);
132 send_answer(sum_of(recv_values(chunk_size
),
140 (((uint64_t)upto
* ((uint64_t)upto
+ 1U)) >> 1U));
This page took 0.031976 seconds and 4 git commands to generate.