4
/* begin_generated_IBM_copyright_prolog */
6
/* ---------------------------------------------------------------- */
7
/* (C)Copyright IBM Corp. 2007, 2008 */
9
/* ---------------------------------------------------------------- */
11
/* end_generated_IBM_copyright_prolog */
13
* \file armci/src/armcix/dcmf/armcix_fence.c
14
* \brief DCMF ARMCI Extension for fence operations.
17
#include "armcix_impl.h"
20
DCMF_Protocol_t __fence_rts_protocol;
21
DCMF_Protocol_t __fence_ack_protocol;
24
* \brief DCMF ARMCI Extention receive short fence request callback
27
* \see ARMCIX_AllFence
28
* \see ARMCIX_DCMF_ReceiveFenceAck
29
* \see DCMF_RecvSendShort
31
void ARMCIX_DCMF_ReceiveFenceRequest (void * clientdata,
32
const DCQuad * msginfo,
38
DCMF_Callback_t * cb = (DCMF_Callback_t *) msginfo;
40
DCMF_Callback_t * ack = (DCMF_Callback_t *) &info;
43
DCMF_Control (&__fence_ack_protocol,
44
DCMF_SEQUENTIAL_CONSISTENCY,
50
* \brief Receive a fence control message.
52
* The fence message type is either a fence \e request or a fence \e ack.
54
* \param[in] clientdata Registered clientdata, the armci connection array
55
* \param[in] info Fence control information
56
* \param[in] peer Rank of the node that sent this control message
59
* \see ARMCIX_AllFence
60
* \see ARMCIX_DCMF_ReceiveFenceRequest
61
* \see DCMF_RecvControl
63
void ARMCIX_DCMF_ReceiveFenceAck (void * clientdata,
64
const DCMF_Control_t * info,
67
DCMF_Callback_t * cb = (DCMF_Callback_t *) info;
69
cb->function(cb->clientdata, NULL);
74
* \brief Register the DCMF ARMCI Extention fence operation.
76
* \param[in] connection_array Connection array
78
* \see DCMF_Control_register
80
void ARMCIX_DCMF_Fence_register (ARMCIX_DCMF_Connection_t * connection_array)
82
DCMF_CriticalSection_enter (0);
84
DCMF_Send_Configuration_t send_configuration = {
85
DCMF_DEFAULT_SEND_PROTOCOL,
87
ARMCIX_DCMF_ReceiveFenceRequest,
92
DCMF_Send_register (&__fence_rts_protocol, &send_configuration);
94
DCMF_Control_Configuration_t configuration = {
95
DCMF_DEFAULT_CONTROL_PROTOCOL,
97
ARMCIX_DCMF_ReceiveFenceAck,
100
DCMF_Control_register (&__fence_ack_protocol, &configuration);
102
DCMF_CriticalSection_exit (0);
107
* \brief Point-to-point fence operation.
109
* Blocks until all active messages between the local node and the remote
110
* node have completed and acknowledged by the remote node.
112
* \param[in] proc Rank of the remote node to fence
114
* \see ARMCIX_AllFence
115
* \see ARMCIX_DCMF_ReceiveFenceRequest
116
* \see ARMCIX_DCMF_ReceiveFenceAck
118
void ARMCIX_Fence (int proc)
120
DCMF_CriticalSection_enter (0);
122
DCMF_Request_t request;
123
volatile unsigned active = 1;
125
DCMF_Callback_t * cb = (DCMF_Callback_t *) &quad;
126
cb->function = ARMCIX_DCMF_cb_decrement;
127
cb->clientdata = (void *) &active;
128
DCMF_Send ( &__fence_rts_protocol,
130
(DCMF_Callback_t) { NULL, NULL },
131
DCMF_SEQUENTIAL_CONSISTENCY,
138
while (active) DCMF_Messager_advance ();
140
DCMF_CriticalSection_exit (0);
144
* \brief Global fence operation.
146
* Blocks until all active messages between the local node and all remote
147
* nodes have completed and acknowledged by the remote node.
150
* \see ARMCIX_DCMF_ReceiveFenceRequest
151
* \see ARMCIX_DCMF_ReceiveFenceAck
153
void ARMCIX_AllFence ()
155
DCMF_CriticalSection_enter (0);
157
unsigned size = DCMF_Messager_size ();
160
volatile unsigned active = 0;
162
DCMF_Callback_t * cb = (DCMF_Callback_t *) &quad;
163
cb->function = ARMCIX_DCMF_cb_decrement;
164
cb->clientdata = (void *) &active;
166
DCMF_Callback_t cb_null = { NULL, NULL };
167
DCMF_Callback_t cb_done = { (void (*)(void *, DCMF_Error_t *))ARMCIX_DCMF_request_free, NULL };
168
for (peer = 0; peer < size; peer++)
170
ARMCIX_DCMF_Request_t * new_request = ARMCIX_DCMF_request_allocate (cb_null);
171
cb_done.clientdata = new_request;
174
DCMF_Send ( &__fence_rts_protocol,
175
&(new_request->request),
177
DCMF_SEQUENTIAL_CONSISTENCY,
184
while (active) DCMF_Messager_advance ();
187
DCMF_CriticalSection_exit (0);
190
void ARMCIX_Barrier ()
192
#warning implement ARMCIX_Barrier ?