libxmp/libxmpf in Omni Compiler  1.3.4
xmpco_get_expr.c File Reference
#include <assert.h>
#include "xmpco_internal.h"
#include "_xmpco_putget.h"
Include dependency graph for xmpco_get_expr.c:

Macros

#define SCHEME_DirectGet   20
 
#define SCHEME_BufferGet   21
 
#define SCHEME_ExtraDirectGet   22
 
#define SCHEME_ExtraBufferGet   23
 

Functions

void _XMPCO_coarrayInit_get ()
 
void XMPCO_GET_scalarExpr (CoarrayInfo_t *descPtr, char *baseAddr, int element, int coindex, char *result)
 
void XMPCO_GET_arrayExpr (CoarrayInfo_t *descPtr, char *baseAddr, int element, int coindex, char *result, int rank, int skip[], int count[])
 
void _XMPCO_getVector_DMA (void *descPtr, char *baseAddr, int bytes, int coindex, void *descDMA, size_t offsetDMA, char *nameDMA)
 
void _XMPCO_getVector_buffer (void *descPtr, char *baseAddr, int bytesRU, int coindex, char *result, int bytes)
 

Macro Definition Documentation

◆ SCHEME_BufferGet

#define SCHEME_BufferGet   21

◆ SCHEME_DirectGet

#define SCHEME_DirectGet   20

◆ SCHEME_ExtraBufferGet

#define SCHEME_ExtraBufferGet   23

◆ SCHEME_ExtraDirectGet

#define SCHEME_ExtraDirectGet   22

Function Documentation

◆ _XMPCO_coarrayInit_get()

void _XMPCO_coarrayInit_get ( )
Here is the call graph for this function:

◆ _XMPCO_getVector_buffer()

void _XMPCO_getVector_buffer ( void *  descPtr,
char *  baseAddr,
int  bytesRU,
int  coindex,
char *  result,
int  bytes 
)
344 {
345  size_t rest1, rest2, bufSize;
346  char *src, *dst;
347 
348  src = baseAddr;
349  dst = result;
350  bufSize = _XMPCO_get_localBufSize();
351 
352  // communication for every buffer size
353  for (rest1 = bytesRU, rest2 = bytes;
354  rest1 > bufSize;
355  rest1 -= bufSize, rest2 -=bufSize) {
356  _XMPCO_getVector_DMA(descPtr, src, bufSize, coindex,
358 
359  _XMPCO_debugPrint("=e=MEMCPY %d bytes, cont\'d\n"
360  " from: \'%s\'\n"
361  " to : addr=%p\n",
362  bufSize,
364  dst);
365  (void)memcpy(dst, _localBuf_baseAddr, bufSize);
366 
367  src += bufSize;
368  dst += bufSize;
369  }
370 
371  _XMPCO_getVector_DMA(descPtr, src, rest1, coindex,
373 
374  _XMPCO_debugPrint("=e=MEMCPY %d bytes, final\n"
375  " from: \'%s\'\n"
376  " to : addr=%p\n",
377  rest2,
379  dst);
380  (void)memcpy(dst, _localBuf_baseAddr, rest2);
381 }
Here is the call graph for this function:

◆ _XMPCO_getVector_DMA()

void _XMPCO_getVector_DMA ( void *  descPtr,
char *  baseAddr,
int  bytes,
int  coindex,
void *  descDMA,
size_t  offsetDMA,
char *  nameDMA 
)
323 {
324  char* desc = _XMPCO_get_descForMemoryChunk(descPtr);
325  size_t offset = _XMPCO_get_offsetInMemoryChunk(descPtr, baseAddr);
326 
327  _XMPCO_debugPrint("=e=GET_VECTOR RDMA-DMA %d bytes\n"
328  " from: remote[%d] \'%s\' + %zd\n"
329  " to : %s + %zd\n",
330  bytes,
331  coindex, _XMPCO_get_nameOfCoarray(descPtr), offset,
332  nameDMA, offsetDMA);
333 
334  // ACTION
335  _XMP_coarray_contiguous_get(coindex-1,
336  descDMA, desc,
337  offsetDMA, offset,
338  bytes, bytes);
339 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ XMPCO_GET_arrayExpr()

void XMPCO_GET_arrayExpr ( CoarrayInfo_t descPtr,
char *  baseAddr,
int  element,
int  coindex,
char *  result,
int  rank,
int  skip[],
int  count[] 
)
129 {
130  int coindex0 = _XMPCO_get_initial_image_withDescPtr(coindex, descPtr);
131 
132  if (element % COMM_UNIT != 0) {
133  _XMPCO_fatal("violation of boundary in reference of a coindexed object\n"
134  " xmpf_coarray_get_array_, " __FILE__);
135  return;
136  }
137 
138  /*--------------------------------------*\
139  * Confirm that baseAddr is located in *
140  * the memory chunk corresponding to *
141  * descptr. *
142  \*--------------------------------------*/
143  BOOL pass = _XMPCO_isAddrInMemoryChunk(baseAddr, descPtr);
144  if (!pass) {
145  _XMPCO_fatal("INTERNAL : illegal baseAddr of mold coarray (in xmpf_coarray_get_array_)\n"
146  " possibly because of unexpected copy-in interface\n"
147  " coarray_name=\"%s\", chunk_size=%ud; offset_in_chunk=%ud",
148  _XMPCO_get_nameOfCoarray(descPtr),
149  (unsigned)_XMPCO_get_sizeOfMemoryChunk(descPtr),
150  (unsigned)_XMPCO_get_offsetInMemoryChunk(descPtr, baseAddr));
151  }
152 
153  /*--------------------------------------*\
154  * Check whether the local address *
155  * result is already registered for DMA *
156  * and, if so, get the descriptor, etc. *
157  \*--------------------------------------*/
158  void *descDMA;
159  size_t offsetDMA;
160  char *orgAddrDMA;
161  char *nameDMA;
162  BOOL avail_DMA;
163 
164  descDMA = _XMPCO_get_isEagerCommMode() ? NULL :
165  _XMPCO_get_desc_fromLocalAddr(result, &orgAddrDMA, &offsetDMA, &nameDMA);
166  avail_DMA = descDMA ? TRUE : FALSE;
167 
168  /*--------------------------------------*\
169  * select scheme *
170  \*--------------------------------------*/
171  int scheme = _select_scheme_get_array(avail_DMA);
172 
173  /*--------------------------------------*\
174  * action *
175  \*--------------------------------------*/
176  switch (scheme) {
177  case SCHEME_DirectGet:
178  _XMPCO_debugPrint("select SCHEME_DirectGet/array\n");
179  _getCoarray(descPtr, baseAddr, coindex0, result,
180  element, rank, skip, count,
181  descDMA, offsetDMA, nameDMA);
182  break;
183 
184  case SCHEME_BufferGet:
185  _XMPCO_debugPrint("select SCHEME_BufferGet/array\n");
186  _getCoarray(descPtr, baseAddr, coindex0, result,
187  element, rank, skip, count,
188  NULL, 0, "(localBuf)");
189  break;
190 
191  default:
192  _XMPCO_fatal("undefined scheme number in " __FILE__);
193  }
194 }
Here is the call graph for this function:

◆ XMPCO_GET_scalarExpr()

void XMPCO_GET_scalarExpr ( CoarrayInfo_t descPtr,
char *  baseAddr,
int  element,
int  coindex,
char *  result 
)
54 {
55  int coindex0 = _XMPCO_get_initial_image_withDescPtr(coindex, descPtr);
56 
57  /*--------------------------------------*\
58  * Confirm that *baseAddr is located in *
59  * the memory chunk corresponding to *
60  * descptr. *
61  \*--------------------------------------*/
62  BOOL pass = _XMPCO_isAddrInMemoryChunk(baseAddr, descPtr);
63  if (!pass) {
64  _XMPCO_fatal("INTERNAL: illegal baseAddr of mold coarray (in xmpf_coarray_get_scalar_)\n"
65  " possibly because of unexpected copy-in interface\n"
66  " coarray_name=\"%s\", chunk_size=%ud; offset_in_chunk=%ud",
67  _XMPCO_get_nameOfCoarray(descPtr),
68  (unsigned)_XMPCO_get_sizeOfMemoryChunk(descPtr),
69  (unsigned)_XMPCO_get_offsetInMemoryChunk(descPtr, baseAddr));
70  }
71 
72  /*--------------------------------------*\
73  * Check whether the local address *
74  * result is already registered for DMA *
75  * and, if so, get the descriptor, etc. *
76  \*--------------------------------------*/
77  void *descDMA;
78  size_t offsetDMA;
79  char *orgAddrDMA;
80  char *nameDMA;
81  BOOL avail_DMA;
82 
83  descDMA = _XMPCO_get_isEagerCommMode() ? NULL :
84  _XMPCO_get_desc_fromLocalAddr(result, &orgAddrDMA, &offsetDMA, &nameDMA);
85  avail_DMA = descDMA ? TRUE : FALSE;
86 
87  /*--------------------------------------*\
88  * select scheme *
89  \*--------------------------------------*/
90  int scheme = _select_scheme_get_scalar(element, avail_DMA);
91 
92  switch (scheme) {
93  case SCHEME_DirectGet:
94  _XMPCO_debugPrint("SCHEME_DirectGet/scalar selected\n");
95 
96  assert(avail_DMA);
97  _XMPCO_getVector_DMA(descPtr, baseAddr, element, coindex0,
98  descDMA, offsetDMA, nameDMA);
99  break;
100 
101  case SCHEME_BufferGet:
102  _XMPCO_debugPrint("select SCHEME_BufferGet/scalar\n");
103 
104  _XMPCO_getVector_buffer(descPtr, baseAddr, element, coindex0,
105  result, element);
106  break;
107 
109  {
110  size_t elementRU = ROUND_UP_COMM(element);
111 
112  _XMPCO_debugPrint("select SCHEME_ExtraBufferGet/scalar. elementRU=%ud\n",
113  elementRU);
114 
115  _XMPCO_getVector_buffer(descPtr, baseAddr, elementRU, coindex0,
116  result, element);
117  }
118  break;
119 
120  default:
121  _XMPCO_fatal("undefined scheme number in " __FILE__);
122  }
123 }
Here is the call graph for this function:
SCHEME_BufferGet
#define SCHEME_BufferGet
Definition: xmpco_get_expr.c:12
_XMPCO_getVector_DMA
void _XMPCO_getVector_DMA(void *descPtr, char *baseAddr, int bytes, int coindex, void *descDMA, size_t offsetDMA, char *nameDMA)
Definition: xmpco_get_expr.c:321
_XMPCO_get_desc_fromLocalAddr
void * _XMPCO_get_desc_fromLocalAddr(char *localAddr, char **orgAddr, size_t *offset, char **name)
Definition: xmpco_alloc.c:784
SCHEME_ExtraBufferGet
#define SCHEME_ExtraBufferGet
Definition: xmpco_get_expr.c:14
FALSE
#define FALSE
Definition: xmpco_internal.h:16
_XMPCO_debugPrint
void _XMPCO_debugPrint(char *format,...)
Definition: xmpco_msg.c:20
_localBuf_name
char * _localBuf_name
Definition: xmpco_get_stmt.c:69
_XMPCO_get_nameOfCoarray
char * _XMPCO_get_nameOfCoarray(CoarrayInfo_t *cinfo)
Definition: xmpco_alloc.c:701
SCHEME_DirectGet
#define SCHEME_DirectGet
Definition: xmpco_get_expr.c:11
_localBuf_desc
void * _localBuf_desc
Definition: xmpco_get_stmt.c:65
_XMPCO_get_initial_image_withDescPtr
int _XMPCO_get_initial_image_withDescPtr(int image, CoarrayInfo_t *descPtr)
Definition: xmpco_lib.c:246
_XMPCO_get_isEagerCommMode
BOOL _XMPCO_get_isEagerCommMode(void)
Definition: xmpco_params.c:89
_XMPCO_get_infoOfLocalBuf
void * _XMPCO_get_infoOfLocalBuf(char **baseAddr, size_t *offset, char **name)
Definition: xmpco_alloc.c:770
_XMPCO_get_offsetInMemoryChunk
size_t _XMPCO_get_offsetInMemoryChunk(CoarrayInfo_t *cinfo, char *addr)
Definition: xmpco_alloc.c:740
_localBuf_offset
size_t _localBuf_offset
Definition: xmpco_get_stmt.c:66
_XMP_coarray_contiguous_get
void _XMP_coarray_contiguous_get(const int, void *, const void *, const long, const long, const long, const long)
BOOL
#define BOOL
Definition: xmpco_internal.h:14
_XMPCO_getVector_buffer
void _XMPCO_getVector_buffer(void *descPtr, char *baseAddr, int bytesRU, int coindex, char *result, int bytes)
Definition: xmpco_get_expr.c:342
_XMPCO_get_sizeOfMemoryChunk
size_t _XMPCO_get_sizeOfMemoryChunk(CoarrayInfo_t *cinfo)
Definition: xmpco_alloc.c:735
_XMPCO_fatal
void _XMPCO_fatal(char *format,...)
Definition: xmpco_msg.c:4
TRUE
#define TRUE
Definition: xmpco_internal.h:15
ROUND_UP_COMM
#define ROUND_UP_COMM(n)
Definition: xmpco_internal.h:20
_XMPCO_isAddrInMemoryChunk
BOOL _XMPCO_isAddrInMemoryChunk(char *localAddr, CoarrayInfo_t *cinfo)
Definition: xmpco_alloc.c:747
_XMPCO_get_descForMemoryChunk
void * _XMPCO_get_descForMemoryChunk(CoarrayInfo_t *cinfo)
Definition: xmpco_alloc.c:725
_XMPCO_get_localBufSize
size_t _XMPCO_get_localBufSize(void)
Definition: xmpco_params.c:84
COMM_UNIT
#define COMM_UNIT
COMM_UNIT : minimum unit of size for PUT/GET communication MALLOC_UNIT : minimum unit of size for mem...
Definition: xmpco_params.h:37
_localBuf_baseAddr
char * _localBuf_baseAddr
Definition: xmpco_get_stmt.c:67