libxmp/libxmpf in Omni Compiler  1.3.4
xmp_lock_unlock_gasnet.c File Reference
#include "xmp_internal.h"
#include "gasnet_tools.h"
Include dependency graph for xmp_lock_unlock_gasnet.c:

Macros

#define MPI_PORTABLE_PLATFORM_H
 

Functions

void _xmp_gasnet_lock_initialize (xmp_gasnet_lock_t *lock, const unsigned int number_of_elements)
 
void _xmp_gasnet_do_lock (int target_rank, xmp_gasnet_lock_t *lock, int *replystate)
 
void _xmp_gasnet_lock (_XMP_coarray_t *c, const unsigned int offset, const unsigned int target_rank)
 
void _xmp_gasnet_do_unlock (int target_rank, xmp_gasnet_lock_t *lock, int *replystate, int *replyarg)
 
void _xmp_gasnet_unlock (_XMP_coarray_t *c, const unsigned int offset, const unsigned int target_rank)
 
void _xmp_gasnet_lock_request (gasnet_token_t token, int node, uint32_t addr_hi, uint32_t addr_lo)
 
void _xmp_gasnet_setlockstate (gasnet_token_t token, int state)
 
void _xmp_gasnet_do_setlockstate (int state)
 
void _xmp_gasnet_unlock_request (gasnet_token_t token, int node, uint32_t addr_hi, uint32_t addr_lo)
 
void _xmp_gasnet_lockhandoff (gasnet_token_t token, int handoffarg)
 
void _xmp_gasnet_do_lockhandoff (int handoffarg)
 

Macro Definition Documentation

◆ MPI_PORTABLE_PLATFORM_H

#define MPI_PORTABLE_PLATFORM_H

Function Documentation

◆ _xmp_gasnet_do_lock()

void _xmp_gasnet_do_lock ( int  target_rank,
xmp_gasnet_lock_t lock,
int *  replystate 
)
23 {
24  gasnet_hsl_lock((gasnet_hsl_t *)(lock->hsl));
25  if(lock->islocked == _XMP_N_INT_TRUE){
26  /* add waiter to end of queue */
27  lock->wait_list[lock->wait_tail++] = target_rank;
28  if(lock->wait_tail == lock->wait_size)
29  lock->wait_tail = 0; // The wait point move to head because of circular queue.
30 
31  /* If full, grow NOW to preserve property that head==tail only when empty */
32  if(lock->wait_tail == lock->wait_head){
33  int *old_list = lock->wait_list;
34  int old_head = lock->wait_head;
35  int old_size = lock->wait_size;
36  int leading = old_size - old_head;
37  lock->wait_size = MIN(old_size + _XMP_LOCK_CHUNK, _XMP_world_size);
38  lock->wait_list = malloc(lock->wait_size * sizeof(int));
39  memcpy(lock->wait_list, old_list+old_head, leading*sizeof(int));
40  memcpy(lock->wait_list+leading, old_list, old_head*sizeof(int));
41  free(old_list);
42  lock->wait_head = 0;
43  lock->wait_tail = old_size;
44  }
45 
46  *replystate = _XMP_LOCKSTATE_WAITING;
47  }
48  else{
49  lock->islocked = _XMP_N_INT_TRUE;
50  *replystate = _XMP_LOCKSTATE_GRANTED;
51  }
52  gasnet_hsl_unlock((gasnet_hsl_t *)(lock->hsl));
53 }
Here is the caller graph for this function:

◆ _xmp_gasnet_do_lockhandoff()

void _xmp_gasnet_do_lockhandoff ( int  handoffarg)
177 {
178  local_handoffarg = handoffarg;
179  gasnett_local_wmb();
180  local_lockstate = (int)_XMP_LOCKSTATE_HANDOFF;
181 }
Here is the caller graph for this function:

◆ _xmp_gasnet_do_setlockstate()

void _xmp_gasnet_do_setlockstate ( int  state)
151 {
152  gasnett_local_wmb(); // prevent the compiler from reordering.
153  local_lockstate = state;
154 }
Here is the caller graph for this function:

◆ _xmp_gasnet_do_unlock()

void _xmp_gasnet_do_unlock ( int  target_rank,
xmp_gasnet_lock_t lock,
int *  replystate,
int *  replyarg 
)
80 {
81  gasnet_hsl_lock((gasnet_hsl_t *)(lock->hsl));
82  if(lock->wait_head != lock->wait_tail) { /* someone waiting - handoff ownership */
83  *replyarg = lock->wait_list[lock->wait_head++];
84  if(lock->wait_head == lock->wait_size)
85  lock->wait_head = 0;
86 
87  *replystate = _XMP_LOCKSTATE_HANDOFF;
88  }
89  else{ /* nobody waiting - unlock */
90  lock->islocked = _XMP_N_INT_FALSE;
91 
92  gasnet_hsl_unlock((gasnet_hsl_t *)(lock->hsl));
93  *replystate = _XMP_LOCKSTATE_DONE;
94  }
95  gasnet_hsl_unlock((gasnet_hsl_t *)(lock->hsl));
96 }
Here is the caller graph for this function:

◆ _xmp_gasnet_lock()

void _xmp_gasnet_lock ( _XMP_coarray_t c,
const unsigned int  offset,
const unsigned int  target_rank 
)
59 {
60  xmp_gasnet_lock_t *lockaddr = (xmp_gasnet_lock_t *)(c->addr[target_rank]) + offset;
61  if(target_rank == _XMP_world_rank){
62  _xmp_gasnet_do_lock(target_rank, lockaddr, (int *)(&local_lockstate));
63  }
64  else{
65  local_lockstate = _XMP_LOCKSTATE_WAITING;
66 
67  /* this memory barrier prevents a race against GASNet handler on "local_lockstate",
68  and provides the wmb half of the memory barrier semantics required by xmp_lock()
69  not required in local case - synchronous HSL critical section takes care of it */
70  gasnett_local_wmb();
71 
72  // only supports 64 bits arch.
73  gasnet_AMRequestShort3(target_rank, _XMP_GASNET_LOCK_REQUEST, _XMP_world_rank, HIWORD(lockaddr), LOWORD(lockaddr));
74 }
75 
76  GASNET_BLOCKUNTIL(local_lockstate != (int)_XMP_LOCKSTATE_WAITING);
77 }
Here is the call graph for this function:

◆ _xmp_gasnet_lock_initialize()

void _xmp_gasnet_lock_initialize ( xmp_gasnet_lock_t lock,
const unsigned int  number_of_elements 
)
10 {
11  for(int i=0;i<number_of_elements;i++){
12  (lock + i)->hsl = malloc(sizeof(gasnet_hsl_t));
13  gasnet_hsl_init((gasnet_hsl_t *)((lock + i)->hsl));
14  (lock + i)->islocked = _XMP_N_INT_FALSE;
15  (lock + i)->wait_size = MIN(_XMP_LOCK_CHUNK, _XMP_world_size);
16  (lock + i)->wait_list = malloc((lock + i)->wait_size * sizeof(int));
17  (lock + i)->wait_head = 0;
18  (lock + i)->wait_tail = 0;
19  }
20 }

◆ _xmp_gasnet_lock_request()

void _xmp_gasnet_lock_request ( gasnet_token_t  token,
int  node,
uint32_t  addr_hi,
uint32_t  addr_lo 
)
134 {
135  int replystate;
136  xmp_gasnet_lock_t *lockaddr = (xmp_gasnet_lock_t *)UPCRI_MAKEWORD(addr_hi, addr_lo);
137 
138  _xmp_gasnet_do_lock(node, lockaddr, &replystate);
139 
140  if(replystate != (int)_XMP_LOCKSTATE_WAITING){
141  gasnet_AMReplyShort1(token, _XMP_GASNET_SETLOCKSTATE, replystate);
142  }
143 }
Here is the call graph for this function:

◆ _xmp_gasnet_lockhandoff()

void _xmp_gasnet_lockhandoff ( gasnet_token_t  token,
int  handoffarg 
)
172 {
173  _xmp_gasnet_do_lockhandoff(handoffarg);
174 }
Here is the call graph for this function:

◆ _xmp_gasnet_setlockstate()

void _xmp_gasnet_setlockstate ( gasnet_token_t  token,
int  state 
)
146 {
148 }
Here is the call graph for this function:

◆ _xmp_gasnet_unlock()

void _xmp_gasnet_unlock ( _XMP_coarray_t c,
const unsigned int  offset,
const unsigned int  target_rank 
)
99 {
100  xmp_gasnet_lock_t *lockaddr = (xmp_gasnet_lock_t *)(c->addr[target_rank]) + offset;
101  if(target_rank == _XMP_world_rank){
102  upcr_poll();
103  _xmp_gasnet_do_unlock(_XMP_world_rank, lockaddr, (int *)&local_lockstate, (int *)&local_handoffarg);
104  }
105  else{
106  local_lockstate = _XMP_LOCKSTATE_WAITING;
107 
108  /* this memory barrier prevents a race against GASNet handler on "local_lockstate",
109  and provides the wmb half of the memory barrier semantics required by xmp_unlock()
110  not required in local case - synchronous HSL critical section takes care of it
111  */
112  gasnett_local_wmb();
113 
114  // only supports 64 bits arch.
115  gasnet_AMRequestShort3(target_rank, _XMP_GASNET_UNLOCK_REQUEST, _XMP_world_rank, HIWORD(lockaddr), LOWORD(lockaddr));
116  }
117 
118  GASNET_BLOCKUNTIL(local_lockstate != (int)_XMP_LOCKSTATE_WAITING);
119 
120  if(local_lockstate == _XMP_LOCKSTATE_HANDOFF){
121  /* tell the next locker that he acquired */
122  int next_node = local_handoffarg;
123 
124  if(next_node == _XMP_world_rank){
125  _xmp_gasnet_do_setlockstate(_XMP_LOCKSTATE_GRANTED);
126  }
127  else{
128  gasnet_AMRequestShort1(next_node, _XMP_GASNET_SETLOCKSTATE, _XMP_LOCKSTATE_GRANTED);
129  }
130  } // end if (local_lockstate == XMP_LOCKSTATE_HANDOFF)
131 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _xmp_gasnet_unlock_request()

void _xmp_gasnet_unlock_request ( gasnet_token_t  token,
int  node,
uint32_t  addr_hi,
uint32_t  addr_lo 
)
157 {
158  int replystate, replyarg;
159  xmp_gasnet_lock_t *lockaddr = (xmp_gasnet_lock_t *)UPCRI_MAKEWORD(addr_hi, addr_lo);
160 
161  _xmp_gasnet_do_unlock(node, lockaddr, &replystate, &replyarg);
162 
163  if(replystate == _XMP_LOCKSTATE_HANDOFF){
164  gasnet_AMReplyShort1(token, _XMP_GASNET_LOCKHANDOFF, replyarg);
165  }
166  else{
167  gasnet_AMReplyShort1(token, _XMP_GASNET_SETLOCKSTATE, replystate);
168  }
169 }
Here is the call graph for this function:
_xmp_gasnet_do_unlock
void _xmp_gasnet_do_unlock(int target_rank, xmp_gasnet_lock_t *lock, int *replystate, int *replyarg)
Definition: xmp_lock_unlock_gasnet.c:79
xmp_coarray::addr
char ** addr
Definition: xmp_data_struct.h:329
xmp_lock::wait_head
int wait_head
Definition: xmp_lock.h:7
_xmp_gasnet_do_lockhandoff
void _xmp_gasnet_do_lockhandoff(int handoffarg)
Definition: xmp_lock_unlock_gasnet.c:176
xmp_lock::islocked
_Bool islocked
Definition: xmp_lock.h:4
_XMP_world_size
int _XMP_world_size
Definition: xmp_world.c:8
xmp_lock::hsl
void * hsl
Definition: xmp_lock.h:5
_XMP_world_rank
int _XMP_world_rank
Definition: xmp_world.c:9
_XMP_N_INT_FALSE
#define _XMP_N_INT_FALSE
Definition: xmp_constant.h:5
_xmp_gasnet_do_lock
void _xmp_gasnet_do_lock(int target_rank, xmp_gasnet_lock_t *lock, int *replystate)
Definition: xmp_lock_unlock_gasnet.c:22
xmp_lock
Definition: xmp_lock.h:3
_xmp_gasnet_do_setlockstate
void _xmp_gasnet_do_setlockstate(int state)
Definition: xmp_lock_unlock_gasnet.c:150
xmp_lock::wait_size
int wait_size
Definition: xmp_lock.h:6
xmp_lock::wait_list
int * wait_list
Definition: xmp_lock.h:9
xmp_lock::wait_tail
int wait_tail
Definition: xmp_lock.h:8
_XMP_N_INT_TRUE
#define _XMP_N_INT_TRUE
Definition: xmp_constant.h:4
MIN
#define MIN(a, b)
Definition: xmp_internal.h:12