19 #ifndef PML_CM_SENDREQ_H
20 #define PML_CM_SENDREQ_H
22 #include "pml_cm_request.h"
24 #include "ompi/mca/pml/base/pml_base_bsend.h"
31 mca_pml_base_send_mode_t req_send_mode;
59 #define MCA_PML_CM_THIN_SEND_REQUEST_ALLOC(sendreq, comm, dst, \
62 ompi_free_list_item_t* item; \
63 ompi_proc = ompi_comm_peer_lookup( comm, dst ); \
65 if(OPAL_UNLIKELY(NULL == ompi_proc)) { \
66 rc = OMPI_ERR_OUT_OF_RESOURCE; \
70 OMPI_FREE_LIST_WAIT(&mca_pml_base_send_requests, \
72 sendreq = (mca_pml_cm_thin_send_request_t*)item; \
73 sendreq->req_send.req_base.req_pml_type = MCA_PML_CM_REQUEST_SEND_THIN; \
74 sendreq->req_mtl.ompi_req = (ompi_request_t*) sendreq; \
75 sendreq->req_mtl.completion_callback = mca_pml_cm_send_request_completion; \
80 #define MCA_PML_CM_HVY_SEND_REQUEST_ALLOC(sendreq, comm, dst, \
83 ompi_free_list_item_t* item; \
84 ompi_proc = ompi_comm_peer_lookup( comm, dst ); \
85 if(OPAL_UNLIKELY(NULL == ompi_proc)) { \
86 rc = OMPI_ERR_OUT_OF_RESOURCE; \
90 OMPI_FREE_LIST_WAIT(&mca_pml_base_send_requests, \
92 sendreq = (mca_pml_cm_hvy_send_request_t*)item; \
93 sendreq->req_send.req_base.req_pml_type = MCA_PML_CM_REQUEST_SEND_HEAVY; \
94 sendreq->req_mtl.ompi_req = (ompi_request_t*) sendreq; \
95 sendreq->req_mtl.completion_callback = mca_pml_cm_send_request_completion; \
100 #define MCA_PML_CM_SEND_REQUEST_INIT_COMMON(req_send, \
110 OBJ_RETAIN(datatype); \
111 (req_send)->req_base.req_comm = comm; \
112 (req_send)->req_base.req_datatype = datatype; \
113 opal_convertor_copy_and_prepare_for_send( \
114 ompi_proc->proc_convertor, \
115 &(datatype->super), \
119 &(req_send)->req_base.req_convertor ); \
120 (req_send)->req_base.req_ompi.req_mpi_object.comm = comm; \
121 (req_send)->req_base.req_ompi.req_status.MPI_SOURCE = \
123 (req_send)->req_base.req_ompi.req_status.MPI_TAG = tag; \
124 (req_send)->req_base.req_ompi.req_status._ucount = count; \
125 (req_send)->req_send_mode = sendmode; \
126 (req_send)->req_base.req_free_called = false; \
129 #define MCA_PML_CM_HVY_SEND_REQUEST_INIT( sendreq, \
141 OMPI_REQUEST_INIT(&(sendreq->req_send.req_base.req_ompi), \
143 sendreq->req_tag = tag; \
144 sendreq->req_peer = dst; \
145 sendreq->req_addr = buf; \
146 sendreq->req_count = count; \
147 MCA_PML_CM_SEND_REQUEST_INIT_COMMON( (&sendreq->req_send), \
155 opal_convertor_get_packed_size( \
156 &sendreq->req_send.req_base.req_convertor, \
157 &sendreq->req_count ); \
159 sendreq->req_blocking = blocking; \
160 sendreq->req_send.req_base.req_pml_complete = \
161 (persistent ? true:false); \
165 #define MCA_PML_CM_THIN_SEND_REQUEST_INIT( sendreq, \
175 OMPI_REQUEST_INIT(&(sendreq->req_send.req_base.req_ompi), \
177 MCA_PML_CM_SEND_REQUEST_INIT_COMMON( (&sendreq->req_send), \
185 sendreq->req_send.req_base.req_pml_complete = false; \
189 #define MCA_PML_CM_SEND_REQUEST_START_SETUP(req_send) \
191 (req_send)->req_base.req_pml_complete = false; \
192 (req_send)->req_base.req_ompi.req_complete = false; \
193 (req_send)->req_base.req_ompi.req_state = \
194 OMPI_REQUEST_ACTIVE; \
195 (req_send)->req_base.req_ompi.req_status._cancelled = 0; \
199 #define MCA_PML_CM_THIN_SEND_REQUEST_START(sendreq, \
207 MCA_PML_CM_SEND_REQUEST_START_SETUP(&(sendreq)->req_send); \
208 ret = OMPI_MTL_CALL(isend(ompi_mtl, \
212 &sendreq->req_send.req_base.req_convertor, \
215 &sendreq->req_mtl)); \
218 #define MCA_PML_CM_HVY_SEND_REQUEST_BSEND_ALLOC(sendreq, ret) \
221 unsigned int iov_count; \
224 if(sendreq->req_count > 0) { \
225 sendreq->req_buff = \
226 mca_pml_base_bsend_request_alloc_buf(sendreq->req_count); \
227 if (NULL == sendreq->req_buff) { \
228 ret = MPI_ERR_BUFFER; \
230 iov.iov_base = (IOVBASE_TYPE*)sendreq->req_buff; \
231 max_data = iov.iov_len = sendreq->req_count; \
233 opal_convertor_pack( &sendreq->req_send.req_base.req_convertor, \
237 opal_convertor_prepare_for_send( &sendreq->req_send.req_base.req_convertor, \
238 &(ompi_mpi_packed.dt.super), \
239 max_data, sendreq->req_buff ); \
245 #define MCA_PML_CM_HVY_SEND_REQUEST_START(sendreq, ret) \
247 ret = OMPI_SUCCESS; \
248 MCA_PML_CM_SEND_REQUEST_START_SETUP(&(sendreq)->req_send); \
249 if (sendreq->req_send.req_send_mode == MCA_PML_BASE_SEND_BUFFERED) { \
250 MCA_PML_CM_HVY_SEND_REQUEST_BSEND_ALLOC(sendreq, ret); \
252 if (OMPI_SUCCESS == ret) { \
253 ret = OMPI_MTL_CALL(isend(ompi_mtl, \
254 sendreq->req_send.req_base.req_comm, \
257 &sendreq->req_send.req_base.req_convertor, \
258 sendreq->req_send.req_send_mode, \
259 sendreq->req_blocking, \
260 &sendreq->req_mtl)); \
261 if(OMPI_SUCCESS == ret && \
262 sendreq->req_send.req_send_mode == MCA_PML_BASE_SEND_BUFFERED) { \
263 sendreq->req_send.req_base.req_ompi.req_status.MPI_ERROR = 0; \
264 ompi_request_complete(&(sendreq)->req_send.req_base.req_ompi, true); \
276 #define MCA_PML_CM_HVY_SEND_REQUEST_PML_COMPLETE(sendreq) \
278 assert( false == sendreq->req_send.req_base.req_pml_complete ); \
280 if (sendreq->req_send.req_send_mode == MCA_PML_BASE_SEND_BUFFERED && \
281 sendreq->req_count > 0 ) { \
282 mca_pml_base_bsend_request_free(sendreq->req_buff); \
285 OPAL_THREAD_LOCK(&ompi_request_lock); \
286 if( false == sendreq->req_send.req_base.req_ompi.req_complete ) { \
288 ompi_request_complete(&(sendreq->req_send.req_base.req_ompi), true); \
290 sendreq->req_send.req_base.req_pml_complete = true; \
292 if( sendreq->req_send.req_base.req_free_called ) { \
293 MCA_PML_CM_HVY_SEND_REQUEST_RETURN( sendreq ); \
295 if(sendreq->req_send.req_base.req_ompi.req_persistent) { \
298 opal_convertor_set_position(&sendreq->req_send.req_base.req_convertor, \
302 OPAL_THREAD_UNLOCK(&ompi_request_lock); \
309 #define MCA_PML_CM_HVY_SEND_REQUEST_RETURN(sendreq) \
312 OBJ_RELEASE(sendreq->req_send.req_base.req_datatype); \
313 OBJ_RELEASE(sendreq->req_send.req_base.req_comm); \
314 OMPI_REQUEST_FINI(&sendreq->req_send.req_base.req_ompi); \
315 opal_convertor_cleanup( &(sendreq->req_send.req_base.req_convertor) ); \
316 OMPI_FREE_LIST_RETURN( &mca_pml_base_send_requests, \
317 (ompi_free_list_item_t*)sendreq); \
327 #define MCA_PML_CM_THIN_SEND_REQUEST_PML_COMPLETE(sendreq) \
329 assert( false == sendreq->req_send.req_base.req_pml_complete ); \
331 OPAL_THREAD_LOCK(&ompi_request_lock); \
332 if( false == sendreq->req_send.req_base.req_ompi.req_complete ) { \
334 ompi_request_complete(&(sendreq->req_send.req_base.req_ompi), true); \
336 sendreq->req_send.req_base.req_pml_complete = true; \
338 if( sendreq->req_send.req_base.req_free_called ) { \
339 MCA_PML_CM_THIN_SEND_REQUEST_RETURN( sendreq ); \
341 OPAL_THREAD_UNLOCK(&ompi_request_lock); \
348 #define MCA_PML_CM_THIN_SEND_REQUEST_RETURN(sendreq) \
351 OBJ_RELEASE(sendreq->req_send.req_base.req_datatype); \
352 OBJ_RELEASE(sendreq->req_send.req_base.req_comm); \
353 OMPI_REQUEST_FINI(&sendreq->req_send.req_base.req_ompi); \
354 opal_convertor_cleanup( &(sendreq->req_send.req_base.req_convertor) ); \
355 OMPI_FREE_LIST_RETURN( &mca_pml_base_send_requests, \
356 (ompi_free_list_item_t*)sendreq); \
int32_t req_tag
user defined tag
Definition: pml_cm_sendreq.h:50
Definition: pml_cm_sendreq.h:29
P2P Management Layer (PML)
Definition: pml_cm_sendreq.h:37
mca_mtl_request_t req_mtl
the mtl specific memory.
Definition: pml_cm_sendreq.h:39
void * req_buff
pointer to send buffer - may not be application buffer
Definition: pml_cm_sendreq.h:51
int32_t req_peer
peer process - rank w/in this communicator
Definition: pml_cm_sendreq.h:49
void * req_addr
pointer to application buffer
Definition: pml_cm_sendreq.h:47
Matching Transport Layer.
Definition: pml_cm_sendreq.h:45
Compiler-specific prefetch functions.
mca_mtl_request_t req_mtl
the mtl specific memory.
Definition: pml_cm_sendreq.h:53
size_t req_count
count of user datatype elements
Definition: pml_cm_sendreq.h:48
Base type for PML CM P2P requests.
Definition: pml_cm_request.h:41
#define OBJ_CLASS_DECLARATION(NAME)
Declaration for class descriptor.
Definition: opal_object.h:236