874e11bf8bea664e56abb89e6edb8053872c9274
2 * SPDX-License-Identifier: MIT
4 * SPDX-FileCopyrightText: 2023 Olivier Dion <odion@efficios.com>
14 static uint64_t sum_of(uint64_t *values
, size_t values_count
)
17 for (size_t k
=0; k
<values_count
; ++k
) {
25 fprintf(stderr
, "Usage: test-mpi N\n");
29 static uint64_t *allocate_values(size_t upto
)
31 uint64_t *values
= (uint64_t*)malloc(sizeof(uint64_t) * upto
);
32 for (size_t k
=0; k
<upto
; ++k
) {
38 static void send_values(int target
, uint64_t *values
,
42 MPI_Isend(values
, values_count
, MPI_UINT64_T
,
43 target
, 0, MPI_COMM_WORLD
, request
);
46 static void recv_answer(int target
, uint64_t *value
,
49 MPI_Irecv(value
, 1, MPI_UINT64_T
,
50 target
, 0, MPI_COMM_WORLD
, request
);
53 static void send_answer(uint64_t value
)
55 MPI_Send(&value
, 1, MPI_UINT64_T
,
56 0, 0, MPI_COMM_WORLD
);
59 static uint64_t *recv_values(size_t chunk_size
)
61 uint64_t *values
= (uint64_t*)malloc(sizeof(uint64_t) * chunk_size
);
62 MPI_Recv(values
, chunk_size
, MPI_UINT64_T
,
63 0, 0, MPI_COMM_WORLD
, MPI_STATUS_IGNORE
);
67 int main(int argc
, char *argv
[])
78 upto
= atoll(argv
[1]);
81 fprintf(stderr
, "N must be greater than 0\n");
85 MPI_Init(&argc
, &argv
);
87 MPI_Comm_set_errhandler(MPI_COMM_WORLD
,
90 MPI_Comm_rank(MPI_COMM_WORLD
, &rank
);
91 MPI_Comm_size(MPI_COMM_WORLD
, &size
);
98 chunk_size
= upto
/ (size
- 1);
99 rest
= upto
% (size
- 1);
107 MPI_Request requests
[size
- 1];
109 values
= allocate_values(upto
);
111 for (int k
=1; k
<size
; ++k
) {
113 values
+ (chunk_size
* (k
- 1)),
118 sums
[0] = sum_of(values
+ chunk_size
* (size
- 1),
121 MPI_Waitall(size
- 1, requests
, MPI_STATUS_IGNORE
);
123 for (int k
=1; k
<size
; ++k
) {
124 recv_answer(k
, &sums
[k
], &requests
[k
-1]);
127 MPI_Waitall(size
- 1, requests
, MPI_STATUS_IGNORE
);
129 total
= sum_of(sums
, size
);
131 send_answer(sum_of(recv_values(chunk_size
),
139 (((uint64_t)upto
* ((uint64_t)upto
+ 1U)) >> 1U));
This page took 0.036588 seconds and 5 git commands to generate.