Skip to content

Commit 3cc7ccb

Browse files
committed
ch4: implement MPIR_Data send/recv in netmod/shm/mpidig (WIP)
1 parent 824a6f6 commit 3cc7ccb

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

src/mpid/ch4/ch4_api.txt

+7
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,18 @@ Non Native API:
138138
SHM*: req
139139

140140
Native API:
141+
send_data : int
142+
NM*: data-2, rank, tag, comm, attr-2, addr, req_p
143+
SHM*: data-2, rank, tag, comm, attr-2, addr, req_p
141144
mpi_isend : int
142145
NM*: buf, count, datatype, rank, tag, comm, attr-2, addr, req_p
143146
SHM*: buf, count, datatype, rank, tag, comm, attr-2, addr, req_p
144147
mpi_cancel_send : int
145148
NM*: sreq
146149
SHM*: sreq
150+
recv_data : int
151+
NM*: data-2, rank, tag, comm, attr-2, addr, req_p, partner
152+
SHM*: data-2, rank, tag, comm, attr-2, req_p
147153
mpi_irecv : int
148154
NM*: buf-2, count, datatype, rank, tag, comm, attr-2, addr, req_p, partner
149155
SHM*: buf-2, count, datatype, rank, tag, comm, attr-2, req_p
@@ -446,6 +452,7 @@ PARAM:
446452
context_id: MPIR_Context_id_t
447453
count: MPI_Aint
448454
data: const void *
455+
data-2: MPIR_Data *
449456
data_sz: MPI_Aint
450457
datatype: MPI_Datatype
451458
datatype_p: MPIR_Datatype *

src/mpid/ch4/src/mpidig_send.h

+40-17
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ MPL_STATIC_INLINE_PREFIX bool MPIDIG_check_eager(int is_local, MPI_Aint am_hdr_s
4040
#endif
4141
}
4242

43-
MPL_STATIC_INLINE_PREFIX int MPIDIG_isend_impl(const void *buf, MPI_Aint count,
44-
MPI_Datatype datatype, int rank, int tag,
43+
MPL_STATIC_INLINE_PREFIX int MPIDIG_isend_impl(MPIR_Data * data, int rank, int tag,
4544
MPIR_Comm * comm, int context_offset,
4645
MPIDI_av_entry_t * addr, uint8_t flags,
4746
int src_vci, int dst_vci,
@@ -78,29 +77,35 @@ MPL_STATIC_INLINE_PREFIX int MPIDIG_isend_impl(const void *buf, MPI_Aint count,
7877
MPIR_cc_inc(sreq->cc_ptr); /* expecting SSEND_ACK */
7978
}
8079
MPI_Aint data_sz;
81-
MPIDI_Datatype_check_size(datatype, count, data_sz);
80+
if (data->length > 0) {
81+
data_sz = data->length;
82+
} else {
83+
MPIDI_Datatype_check_size(data->datatype, data->count, data_sz);
84+
}
8285
am_hdr.data_sz = data_sz;
8386
am_hdr.rndv_hdr_sz = 0;
8487

8588
#ifdef HAVE_DEBUGGER_SUPPORT
86-
MPIDIG_REQUEST(sreq, datatype) = datatype;
87-
MPIDIG_REQUEST(sreq, buffer) = (void *) buf;
88-
MPIDIG_REQUEST(sreq, count) = count;
89+
/* FIXME: partial data support in debugger */
90+
MPIDIG_REQUEST(sreq, datatype) = data->datatype;
91+
MPIDIG_REQUEST(sreq, buffer) = data->buf;
92+
MPIDIG_REQUEST(sreq, count) = data->count;
8993
#endif
9094

9195
int is_local = MPIDI_av_is_local(addr);
9296
MPI_Aint am_hdr_sz = (MPI_Aint) sizeof(am_hdr);
9397
if (MPIDIG_check_eager(is_local, am_hdr_sz, data_sz, sreq)) {
9498
/* EAGER send */
95-
CH4_CALL(am_isend(rank, comm, MPIDIG_SEND, &am_hdr, am_hdr_sz, buf, count, datatype,
96-
src_vci, dst_vci, sreq), is_local, mpi_errno);
99+
CH4_CALL(am_isend(rank, comm, MPIDIG_SEND, &am_hdr, am_hdr_sz,
100+
data->buf, data->count, data->datatype, src_vci, dst_vci, sreq),
101+
is_local, mpi_errno);
97102
} else {
98103
/* RNDV send */
99-
MPIDIG_REQUEST(sreq, buffer) = (void *) buf;
100-
MPIDIG_REQUEST(sreq, count) = count;
101-
MPIDIG_REQUEST(sreq, datatype) = datatype;
104+
MPIDIG_REQUEST(sreq, buffer) = data->buf;
105+
MPIDIG_REQUEST(sreq, count) = data->count;
106+
MPIDIG_REQUEST(sreq, datatype) = data->datatype;
102107
MPIDIG_REQUEST(sreq, u.send.dest) = rank;
103-
MPIR_Datatype_add_ref_if_not_builtin(datatype);
108+
MPIR_Datatype_add_ref_if_not_builtin(data->datatype);
104109
MPIDIG_AM_SEND_SET_RNDV(am_hdr.flags, MPIDIG_RNDV_GENERIC);
105110

106111
CH4_CALL(am_send_hdr(rank, comm, MPIDIG_SEND, &am_hdr, am_hdr_sz, src_vci, dst_vci),
@@ -115,10 +120,7 @@ MPL_STATIC_INLINE_PREFIX int MPIDIG_isend_impl(const void *buf, MPI_Aint count,
115120
goto fn_exit;
116121
}
117122

118-
MPL_STATIC_INLINE_PREFIX int MPIDIG_mpi_isend(const void *buf,
119-
MPI_Aint count,
120-
MPI_Datatype datatype,
121-
int rank,
123+
MPL_STATIC_INLINE_PREFIX int MPIDIG_send_data(MPIR_Data * data, int rank,
122124
int tag, MPIR_Comm * comm, int context_offset,
123125
MPIDI_av_entry_t * addr, int src_vci, int dst_vci,
124126
MPIR_Request ** request,
@@ -128,13 +130,34 @@ MPL_STATIC_INLINE_PREFIX int MPIDIG_mpi_isend(const void *buf,
128130
MPIR_FUNC_ENTER;
129131

130132
uint8_t flags = syncflag ? MPIDIG_AM_SEND_FLAGS_SYNC : MPIDIG_AM_SEND_FLAGS_NONE;
131-
mpi_errno = MPIDIG_isend_impl(buf, count, datatype, rank, tag, comm, context_offset, addr,
133+
mpi_errno = MPIDIG_isend_impl(data, rank, tag, comm, context_offset, addr,
132134
flags, src_vci, dst_vci, request, errflag);
133135

134136
MPIR_FUNC_EXIT;
135137
return mpi_errno;
136138
}
137139

140+
MPL_STATIC_INLINE_PREFIX int MPIDIG_mpi_isend(const void *buf,
141+
MPI_Aint count,
142+
MPI_Datatype datatype,
143+
int rank,
144+
int tag, MPIR_Comm * comm, int context_offset,
145+
MPIDI_av_entry_t * addr, int src_vci, int dst_vci,
146+
MPIR_Request ** request,
147+
bool syncflag, MPIR_Errflag_t errflag)
148+
{
149+
MPIR_Data data = {
150+
.buf = (void *) buf,
151+
.count = count,
152+
.datatype = datatype,
153+
.offset = 0,
154+
.length = -1,
155+
};
156+
157+
return MPIDIG_send_data(&data, rank, tag, comm, context_offset, addr, src_vci, dst_vci,
158+
request, syncflag, errflag);
159+
}
160+
138161
MPL_STATIC_INLINE_PREFIX int MPIDIG_mpi_cancel_send(MPIR_Request * sreq)
139162
{
140163
int mpi_errno = MPI_SUCCESS;

0 commit comments

Comments
 (0)