Rdma support for pamilrts machine layer
[charm.git] / src / arch / pamilrts / machine-onesided.c
blob1417b68f23e79a665e922fbc8bb932550553a4a4
1 /*
2 included in machine.c
3 Nitin Bhat 06/03/2016
4 */
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;
11 int i = 0;
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,
16 pfn,
17 NULL,
18 options);
22 //function called on completion of the rdma operation
23 void rzv_rdma_recv_done (pami_context_t ctxt,
24 void * clientdata,
25 pami_result_t result)
27 CmiPAMIRzvRdmaRecvOp_t* recvOpInfo = (CmiPAMIRzvRdmaRecvOp_t *)clientdata;
28 CmiPAMIRzvRdmaRecv_t* recvInfo = (CmiPAMIRzvRdmaRecv_t *)(
29 ((char *)recvOpInfo)
30 - recvOpInfo->opIndex * sizeof(CmiPAMIRzvRdmaRecvOp_t)
31 - sizeof(CmiPAMIRzvRdmaRecv_t));
33 rdma_sendAck(ctxt, recvOpInfo, recvInfo->src_ep);
34 recvInfo->comOps++;
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,
44 void *buffer,
45 void *cookie,
46 int dst_context,
47 int offset,
48 pami_memregion_t *mregion,
49 int size)
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);
66 int to_lock = 0;
67 #if CMK_SMP && !CMK_ENABLE_ASYNC_PROGRESS
68 to_lock = CpvAccess(uselock);
69 #endif
71 if(to_lock)
72 PAMIX_CONTEXT_LOCK(context);
74 pami_result_t res = PAMI_Rget (context, &rget);
76 if(to_lock)
77 PAMIX_CONTEXT_UNLOCK(context);
78 MACHSTATE2(3, "[%d]PAMI_Rget result: %d\n", CmiMyPe(), res);
79 return 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];
91 #else
92 pami_context_t my_context= MY_CONTEXT();
93 #endif
95 INCR_ORECVS();
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;
102 int i;
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
114 void rdma_sendAck (
115 pami_context_t context,
116 CmiPAMIRzvRdmaRecvOp_t* recvOpInfo,
117 int src_ep)
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, &parameters);
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,
133 void * clientdata,
134 const void * header_addr,
135 size_t header_size,
136 const void * pipe_addr,
137 size_t pipe_size,
138 pami_endpoint_t origin,
139 pami_recv_t * recv)
141 CmiAssert(sizeof(void *) == header_size);
142 CmiRdmaAck *ack = *((void **) header_addr);
143 ack->fnPtr(ack->token);