5 #include "machine-rdma.h"
6 #define CMI_PAMI_ONESIDED_ACK_DISPATCH 12
8 void _initOnesided( pami_context_t
*contexts
, int nc
){
9 pami_dispatch_hint_t options
= (pami_dispatch_hint_t
) {0};
10 pami_dispatch_callback_function pfn
;
12 for (i
= 0; i
< nc
; ++i
) {
13 pfn
.p2p
= ack_rdma_pkt_dispatch
;
14 PAMI_Dispatch_set (contexts
[i
],
15 CMI_PAMI_ONESIDED_ACK_DISPATCH
,
22 //function called on completion of the rdma operation
23 void rzv_rdma_recv_done (pami_context_t ctxt
,
27 CmiPAMIRzvRdmaRecvOp_t
* recvOpInfo
= (CmiPAMIRzvRdmaRecvOp_t
*)clientdata
;
28 CmiPAMIRzvRdmaRecv_t
* recvInfo
= (CmiPAMIRzvRdmaRecv_t
*)(
30 - recvOpInfo
->opIndex
* sizeof(CmiPAMIRzvRdmaRecvOp_t
)
31 - sizeof(CmiPAMIRzvRdmaRecv_t
));
33 rdma_sendAck(ctxt
, recvOpInfo
, recvInfo
->src_ep
);
35 if(recvInfo
->comOps
== recvInfo
->numOps
){
36 recv_done(ctxt
, recvInfo
->msg
, PAMI_SUCCESS
);
40 //function to perform Rget
41 pami_result_t
getData(
42 pami_context_t context
,
43 pami_endpoint_t origin
,
48 pami_memregion_t
*mregion
,
51 pami_rget_simple_t rget
;
52 rget
.rma
.dest
= origin
;
53 rget
.rma
.bytes
= size
;
54 rget
.rma
.cookie
= cookie
;
55 rget
.rma
.done_fn
= rzv_rdma_recv_done
;
56 rget
.rma
.hints
.buffer_registered
= PAMI_HINT_ENABLE
;
57 rget
.rma
.hints
.use_rdma
= PAMI_HINT_ENABLE
;
58 rget
.rdma
.local
.mr
= &cmi_pami_memregion
[dst_context
].mregion
;
59 rget
.rdma
.local
.offset
= (size_t)buffer
-
60 (size_t)cmi_pami_memregion
[dst_context
].baseVA
;
61 rget
.rdma
.remote
.mr
= mregion
;
62 rget
.rdma
.remote
.offset
= offset
;
64 MACHSTATE5(3, "[%d]getData, context:%p, size: %d, buffer: %p, cookie: %p\n", CmiMyPe(), context
, size
, buffer
, cookie
);
67 #if CMK_SMP && !CMK_ENABLE_ASYNC_PROGRESS
68 to_lock
= CpvAccess(uselock
);
72 PAMIX_CONTEXT_LOCK(context
);
74 pami_result_t res
= PAMI_Rget (context
, &rget
);
77 PAMIX_CONTEXT_UNLOCK(context
);
78 MACHSTATE2(3, "[%d]PAMI_Rget result: %d\n", CmiMyPe(), res
);
84 void LrtsIssueRgets(void *recv
, int pe
){
86 CmiPAMIRzvRdmaRecv_t
* recvInfo
= (CmiPAMIRzvRdmaRecv_t
*)recv
;
88 #if CMK_SMP && CMK_ENABLE_ASYNC_PROGRESS
89 int c
= CmiMyNode() % cmi_pami_numcontexts
;
90 pami_context_t my_context
= cmi_pami_contexts
[c
];
92 pami_context_t my_context
= MY_CONTEXT();
98 pami_endpoint_t origin
;
99 PAMI_Endpoint_create (cmi_pami_client
, (pami_task_t
)CmiNodeOf(pe
), recvInfo
->dstContext
, &origin
);
100 recvInfo
->src_ep
= origin
;
103 for(i
=0; i
<recvInfo
->numOps
; i
++){
104 void *buffer
= recvInfo
->rdmaOp
[i
].buffer
;
105 int offset
= recvInfo
->rdmaOp
[i
].offset
;
106 int size
= recvInfo
->rdmaOp
[i
].size
;
107 MACHSTATE5(3, "[%d]LrtsIssueRgets, recv:%p, origin: %u, dst_context: %d, offset: %d\n", CmiMyPe(), recvInfo
, origin
, recvInfo
->dstContext
, offset
);
108 getData(my_context
, origin
, buffer
, &recvInfo
->rdmaOp
[i
],
109 recvInfo
->dstContext
, offset
, &recvInfo
->mregion
, size
);
113 //function to send the acknowledgement to the sender
115 pami_context_t context
,
116 CmiPAMIRzvRdmaRecvOp_t
* recvOpInfo
,
119 pami_send_immediate_t parameters
;
120 parameters
.dispatch
= CMI_PAMI_ONESIDED_ACK_DISPATCH
;
121 parameters
.header
.iov_base
= &recvOpInfo
->src_info
;
122 parameters
.header
.iov_len
= sizeof(void *);
123 parameters
.data
.iov_base
= NULL
;
124 parameters
.data
.iov_len
= 0;
125 parameters
.dest
= src_ep
;
126 PAMI_Send_immediate (context
, ¶meters
);
130 // function called on the sender on receiving acknowledgement from the receiver to signal the completion of the rdma operation
131 void ack_rdma_pkt_dispatch (
132 pami_context_t context
,
134 const void * header_addr
,
136 const void * pipe_addr
,
138 pami_endpoint_t origin
,
141 CmiAssert(sizeof(void *) == header_size
);
142 CmiRdmaAck
*ack
= *((void **) header_addr
);
143 ack
->fnPtr(ack
->token
);