forked from kokkos/kokkos-comm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_sendrecv.cpp
More file actions
56 lines (47 loc) · 1.7 KB
/
test_sendrecv.cpp
File metadata and controls
56 lines (47 loc) · 1.7 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
//@HEADER
// ************************************************************************
//
// Kokkos v. 4.0
// Copyright (2022) National Technology & Engineering
// Solutions of Sandia, LLC (NTESS).
//
// Under the terms of Contract DE-NA0003525 with NTESS,
// the U.S. Government retains certain rights in this software.
//
// Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions.
// See https://kokkos.org/LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//@HEADER
#include "test_utils.hpp"
#include <KokkosComm.hpp>
template <typename Space, typename View>
void send_recv(benchmark::State &, MPI_Comm comm, const Space &space, int rank,
const View &v) {
if (0 == rank) {
KokkosComm::send(space, v, 1, 0, comm);
KokkosComm::recv(space, v, 1, 0, comm);
} else if (1 == rank) {
KokkosComm::recv(space, v, 0, 0, comm);
KokkosComm::send(space, v, 0, 0, comm);
}
}
void benchmark_sendrecv(benchmark::State &state) {
int rank, size;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size < 2) {
state.SkipWithError("benchmark_sendrecv needs at least 2 ranks");
}
using Scalar = double;
auto space = Kokkos::DefaultExecutionSpace();
using view_type = Kokkos::View<Scalar *>;
view_type a("", 1000000);
while (state.KeepRunning()) {
do_iteration(state, MPI_COMM_WORLD,
send_recv<Kokkos::DefaultExecutionSpace, view_type>, space,
rank, a);
}
state.SetBytesProcessed(sizeof(Scalar) * state.iterations() * a.size() * 2);
}
BENCHMARK(benchmark_sendrecv)->UseManualTime()->Unit(benchmark::kMillisecond);