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

Macros

#define _XMP_ATOMIC_REG   0
 
#define _XMP_ATOMIC_DONE   1
 

Functions

void XMP_gasnet_atomic_sync_memory ()
 
void _XMP_gasnet_intrinsic_initialize ()
 
void _xmp_gasnet_atomic_define_do (gasnet_token_t token, const char *src_addr, const size_t elmt_size, gasnet_handlerarg_t addr_hi, gasnet_handlerarg_t addr_lo, gasnet_handlerarg_t local_atomic_operations)
 
void _xmp_gasnet_atomic_define_reply_do (gasnet_token_t token, gasnet_handlerarg_t local_atomic_operations)
 
void _XMP_gasnet_atomic_define (int target_rank, _XMP_coarray_t *dst_desc, size_t dst_offset, int value, _XMP_coarray_t *src_desc, size_t src_offset, size_t elmt_size)
 
void _xmp_gasnet_atomic_ref_do (gasnet_token_t token, const size_t elmt_size, gasnet_handlerarg_t src_addr_hi, gasnet_handlerarg_t src_addr_lo, gasnet_handlerarg_t dst_addr_hi, gasnet_handlerarg_t dst_addr_lo, gasnet_handlerarg_t local_atomic_operations)
 
void _xmp_gasnet_atomic_ref_reply_do (gasnet_token_t token, int *dst_addr, size_t elmt_size, gasnet_handlerarg_t src_addr_hi, gasnet_handlerarg_t src_addr_lo, gasnet_handlerarg_t local_atomic_operations)
 
void _XMP_gasnet_atomic_ref (int target_rank, _XMP_coarray_t *dst_desc, size_t dst_offset, int *value, size_t elmt_size)
 

Variables

gasnet_hsl_t _hsl
 

Macro Definition Documentation

◆ _XMP_ATOMIC_DONE

#define _XMP_ATOMIC_DONE   1

◆ _XMP_ATOMIC_REG

#define _XMP_ATOMIC_REG   0

Function Documentation

◆ _XMP_gasnet_atomic_define()

void _XMP_gasnet_atomic_define ( int  target_rank,
_XMP_coarray_t dst_desc,
size_t  dst_offset,
int  value,
_XMP_coarray_t src_desc,
size_t  src_offset,
size_t  elmt_size 
)
59 {
60  char *dst_addr = dst_desc->addr[target_rank] + elmt_size * dst_offset;
61  char *src_addr = (src_desc == NULL)? (char*)&value : src_desc->addr[_XMP_world_rank] + elmt_size * src_offset;
62  if(target_rank == _XMP_world_rank){
63  gasnet_hsl_lock(&_hsl);
64  memcpy(dst_addr, src_addr, elmt_size);
65  gasnet_hsl_unlock(&_hsl);
66  }
67  else{
68  _extend_atomic_queue();
69  _xmp_gasnet_atomic_queue[_atomic_operations] = _XMP_ATOMIC_REG;
70  gasnet_AMRequestMedium3(target_rank, _XMP_GASNET_ATOMIC_DEFINE_DO, src_addr, elmt_size, HIWORD(dst_addr), LOWORD(dst_addr), _atomic_operations);
71  _atomic_operations++;
72  }
73 }
Here is the caller graph for this function:

◆ _xmp_gasnet_atomic_define_do()

void _xmp_gasnet_atomic_define_do ( gasnet_token_t  token,
const char *  src_addr,
const size_t  elmt_size,
gasnet_handlerarg_t  addr_hi,
gasnet_handlerarg_t  addr_lo,
gasnet_handlerarg_t  local_atomic_operations 
)
42 {
43  int *dst_addr = (int *)UPCRI_MAKEWORD(addr_hi, addr_lo);
44 
45  gasnet_hsl_lock(&_hsl);
46  memcpy(dst_addr, src_addr, elmt_size);
47  gasnet_hsl_unlock(&_hsl);
48 
49  gasnet_AMReplyShort1(token, _XMP_GASNET_ATOMIC_DEFINE_REPLY_DO, local_atomic_operations);
50 }

◆ _xmp_gasnet_atomic_define_reply_do()

void _xmp_gasnet_atomic_define_reply_do ( gasnet_token_t  token,
gasnet_handlerarg_t  local_atomic_operations 
)
53 {
54  _xmp_gasnet_atomic_queue[local_atomic_operations] = _XMP_ATOMIC_DONE;
55 }

◆ _XMP_gasnet_atomic_ref()

void _XMP_gasnet_atomic_ref ( int  target_rank,
_XMP_coarray_t dst_desc,
size_t  dst_offset,
int *  value,
size_t  elmt_size 
)
97 {
98  gasnet_AMPoll();
99  char *dst_addr = dst_desc->addr[target_rank] + elmt_size * dst_offset;
100  if(target_rank == _XMP_world_rank){
101  gasnet_hsl_lock(&_hsl);
102  memcpy(value, dst_addr, elmt_size);
103  gasnet_hsl_unlock(&_hsl);
104  }
105  else{
106  _extend_atomic_queue();
107  _xmp_gasnet_atomic_queue[_atomic_operations] = _XMP_ATOMIC_REG;
108  gasnet_AMRequestShort6(target_rank, _XMP_GASNET_ATOMIC_REF_DO, elmt_size,
109  HIWORD(value), LOWORD(value), HIWORD(dst_addr), LOWORD(dst_addr), _atomic_operations);
110  _atomic_operations++;
111  }
112 }
Here is the caller graph for this function:

◆ _xmp_gasnet_atomic_ref_do()

void _xmp_gasnet_atomic_ref_do ( gasnet_token_t  token,
const size_t  elmt_size,
gasnet_handlerarg_t  src_addr_hi,
gasnet_handlerarg_t  src_addr_lo,
gasnet_handlerarg_t  dst_addr_hi,
gasnet_handlerarg_t  dst_addr_lo,
gasnet_handlerarg_t  local_atomic_operations 
)
79 {
80  int *dst_addr = (int *)UPCRI_MAKEWORD(dst_addr_hi, dst_addr_lo);
81  gasnet_AMReplyMedium3(token, _XMP_GASNET_ATOMIC_REF_REPLY_DO, dst_addr, elmt_size, src_addr_hi,
82  src_addr_lo, local_atomic_operations);
83 }

◆ _xmp_gasnet_atomic_ref_reply_do()

void _xmp_gasnet_atomic_ref_reply_do ( gasnet_token_t  token,
int *  dst_addr,
size_t  elmt_size,
gasnet_handlerarg_t  src_addr_hi,
gasnet_handlerarg_t  src_addr_lo,
gasnet_handlerarg_t  local_atomic_operations 
)
87 {
88  int *src_addr = (int *)UPCRI_MAKEWORD(src_addr_hi, src_addr_lo);
89  gasnet_hsl_lock(&_hsl);
90  memcpy(src_addr, dst_addr, elmt_size);
91  gasnet_hsl_unlock(&_hsl);
92  _xmp_gasnet_atomic_queue[local_atomic_operations] = _XMP_ATOMIC_DONE;
93 }

◆ _XMP_gasnet_intrinsic_initialize()

void _XMP_gasnet_intrinsic_initialize ( )
34 {
35  gasnet_hsl_init(&_hsl);
36  _xmp_gasnet_atomic_queue = malloc(sizeof(int) * _XMP_GASNET_ATOMIC_INIT_SIZE);
37 }
Here is the caller graph for this function:

◆ XMP_gasnet_atomic_sync_memory()

void XMP_gasnet_atomic_sync_memory ( )
26 {
27  for(int i=0;i<_atomic_operations;i++)
28  GASNET_BLOCKUNTIL(_xmp_gasnet_atomic_queue[i] == _XMP_ATOMIC_DONE);
29 
30  _atomic_operations = 0;
31 }
Here is the caller graph for this function:

Variable Documentation

◆ _hsl

gasnet_hsl_t _hsl
xmp_coarray::addr
char ** addr
Definition: xmp_data_struct.h:329
_XMP_world_rank
int _XMP_world_rank
Definition: xmp_world.c:9
_hsl
gasnet_hsl_t _hsl
Definition: xmp_intrinsic_gasnet.c:2
_XMP_ATOMIC_DONE
#define _XMP_ATOMIC_DONE
Definition: xmp_intrinsic_gasnet.c:7
_XMP_ATOMIC_REG
#define _XMP_ATOMIC_REG
Definition: xmp_intrinsic_gasnet.c:6