@@ -42,52 +42,35 @@ KokkosComm::Req isend(const ExecSpace &space, const SendView &sv, int dest,
42
42
using KCT = KokkosComm::Traits<SendView>;
43
43
using KCPT = KokkosComm::PackTraits<SendView>;
44
44
45
- if (KCPT::needs_pack (sv)) {
46
- using Packer = typename KCPT::packer_type;
47
- using MpiArgs = typename Packer::args_type;
48
-
49
- MpiArgs args = Packer::pack (space, sv);
50
- space.fence ();
51
-
45
+ auto isend_fn = [&](auto &&view, auto count, auto datatype, auto &&request) {
52
46
if constexpr (SendMode == CommMode::Standard) {
53
- MPI_Isend (KCT::data_handle (args.view ), args.count , args.datatype , dest,
54
- tag, comm, &req.mpi_req ());
47
+ MPI_Isend (view, count, datatype, dest, tag, comm, request);
55
48
} else if constexpr (SendMode == CommMode::Ready) {
56
- MPI_Irsend (KCT::data_handle (args.view ), args.count , args.datatype , dest,
57
- tag, comm, &req.mpi_req ());
49
+ MPI_Irsend (view, count, datatype, dest, tag, comm, request);
58
50
} else if constexpr (SendMode == CommMode::Synchronous) {
59
- MPI_Issend (KCT::data_handle (args.view ), args.count , args.datatype , dest,
60
- tag, comm, &req.mpi_req ());
51
+ MPI_Issend (view, count, datatype, dest, tag, comm, request);
61
52
} else if constexpr (SendMode == CommMode::Default) {
62
53
#ifdef KOKKOSCOMM_FORCE_SYNCHRONOUS_MODE
63
- MPI_Issend (KCT::data_handle (args.view ), args.count , args.datatype , dest,
64
- tag, comm, &req.mpi_req ());
54
+ MPI_Issend (view, count, datatype, dest, tag, comm, request);
65
55
#else
66
- MPI_Isend (KCT::data_handle (args.view ), args.count , args.datatype , dest,
67
- tag, comm, &req.mpi_req ());
56
+ MPI_Isend (view, count, datatype, dest, tag, comm, request);
68
57
#endif
69
58
}
59
+ };
60
+
61
+ if (KCPT::needs_pack (sv)) {
62
+ using Packer = typename KCPT::packer_type;
63
+ using MpiArgs = typename Packer::args_type;
64
+
65
+ MpiArgs args = Packer::pack (space, sv);
66
+ space.fence ();
67
+ isend_fn (KCT::data_handle (args.view ), args.count , args.datatype ,
68
+ &req.mpi_req ());
70
69
req.keep_until_wait (args.view );
71
70
} else {
72
71
using SendScalar = typename SendView::value_type;
73
- if constexpr (SendMode == CommMode::Standard) {
74
- MPI_Isend (KCT::data_handle (sv), KCT::span (sv), mpi_type_v<SendScalar>,
75
- dest, tag, comm, &req.mpi_req ());
76
- } else if constexpr (SendMode == CommMode::Ready) {
77
- MPI_Irsend (KCT::data_handle (sv), KCT::span (sv), mpi_type_v<SendScalar>,
78
- dest, tag, comm, &req.mpi_req ());
79
- } else if constexpr (SendMode == CommMode::Synchronous) {
80
- MPI_Issend (KCT::data_handle (sv), KCT::span (sv), mpi_type_v<SendScalar>,
81
- dest, tag, comm, &req.mpi_req ());
82
- } else if constexpr (SendMode == CommMode::Default) {
83
- #ifdef KOKKOSCOMM_FORCE_SYNCHRONOUS_MODE
84
- MPI_Issend (KCT::data_handle (sv), KCT::span (sv), mpi_type_v<SendScalar>,
85
- dest, tag, comm, &req.mpi_req ());
86
- #else
87
- MPI_Isend (KCT::data_handle (sv), KCT::span (sv), mpi_type_v<SendScalar>,
88
- dest, tag, comm, &req.mpi_req ());
89
- #endif
90
- }
72
+ isend_fn (KCT::data_handle (sv), KCT::span (sv), mpi_type_v<SendScalar>,
73
+ &req.mpi_req ());
91
74
if (KCT::is_reference_counted ()) {
92
75
req.keep_until_wait (sv);
93
76
}
0 commit comments