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

Functions

void _XMP_gpu_pack_array (_XMP_gpu_array_t *device_desc, void *host_shadow_buffer, void *gpu_array_addr, size_t type_size, size_t alloc_size, int array_dim, int *lower, int *upper, int *stride)
 
void _XMP_gpu_unpack_array (_XMP_gpu_array_t *device_desc, void *gpu_array_addr, void *host_shadow_buffer, size_t type_size, size_t alloc_size, int array_dim, int *lower, int *upper, int *stride)
 
void _XMP_gpu_pack_shadow_NORMAL (_XMP_gpu_data_t *desc, void **lo_buffer, void **hi_buffer, int array_index)
 
void _XMP_gpu_unpack_shadow_NORMAL (_XMP_gpu_data_t *desc, void *lo_buffer, void *hi_buffer, int array_index)
 

Function Documentation

◆ _XMP_gpu_pack_array()

void _XMP_gpu_pack_array ( _XMP_gpu_array_t device_desc,
void *  host_shadow_buffer,
void *  gpu_array_addr,
size_t  type_size,
size_t  alloc_size,
int  array_dim,
int *  lower,
int *  upper,
int *  stride 
)
Here is the caller graph for this function:

◆ _XMP_gpu_pack_shadow_NORMAL()

void _XMP_gpu_pack_shadow_NORMAL ( _XMP_gpu_data_t desc,
void **  lo_buffer,
void **  hi_buffer,
int  array_index 
)
17  {
19 
20  _XMP_array_t *array_desc = desc->host_array_desc;
21  if (!array_desc->is_allocated) {
22  return;
23  }
24 
25  _XMP_array_info_t *ai = &(array_desc->info[array_index]);
28 
29  int size = ai->shadow_comm_size;
30  if (size == 1) {
31  return;
32  }
33 
34  int rank = ai->shadow_comm_rank;
35  void *device_array_addr = desc->device_addr;
36  int array_dim = array_desc->dim;
37  size_t array_type_size = array_desc->type_size;
38 
39  int lower[array_dim], upper[array_dim], stride[array_dim];
40 
41  // pack lo shadow
42  if (rank != (size - 1)) {
43  if (ai->shadow_size_lo > 0) {
44  // FIXME strict condition
45  if (ai->shadow_size_lo > ai->par_size) {
46  _XMP_fatal("shadow size is too big");
47  }
48 
49  // alloc buffer
50  size_t alloc_size = (ai->shadow_size_lo) * (ai->dim_elmts) * (array_type_size);
51  *lo_buffer = _XMP_alloc(alloc_size);
52 
53  // calc index
54  for (int i = 0; i < array_dim; i++) {
55  if (i == array_index) {
56  lower[i] = array_desc->info[i].local_upper - array_desc->info[i].shadow_size_lo + 1;
57  upper[i] = lower[i] + array_desc->info[i].shadow_size_lo - 1;
58  stride[i] = 1;
59  }
60  else {
61  lower[i] = array_desc->info[i].local_lower;
62  upper[i] = array_desc->info[i].local_upper;
63  stride[i] = array_desc->info[i].local_stride;
64  }
65  }
66 
67  // pack data
68  _XMP_gpu_pack_array(desc->device_array_desc, *lo_buffer, device_array_addr,
69  array_type_size, alloc_size, array_dim,
70  lower, upper, stride);
71  }
72  }
73 
74  // pack hi shadow
75  if (rank != 0) {
76  if (ai->shadow_size_hi > 0) {
77  // FIXME strict condition
78  if (ai->shadow_size_hi > ai->par_size) {
79  _XMP_fatal("shadow size is too big");
80  }
81 
82  // alloc buffer
83  size_t alloc_size = (ai->shadow_size_hi) * (ai->dim_elmts) * (array_type_size);
84  *hi_buffer = _XMP_alloc(alloc_size);
85 
86  // calc index
87  for (int i = 0; i < array_dim; i++) {
88  if (i == array_index) {
89  lower[i] = array_desc->info[i].local_lower;
90  upper[i] = lower[i] + array_desc->info[i].shadow_size_hi - 1;
91  stride[i] = 1;
92  }
93  else {
94  lower[i] = array_desc->info[i].local_lower;
95  upper[i] = array_desc->info[i].local_upper;
96  stride[i] = array_desc->info[i].local_stride;
97  }
98  }
99 
100  // pack data
101  _XMP_gpu_pack_array(desc->device_array_desc, *hi_buffer, device_array_addr,
102  array_type_size, alloc_size, array_dim,
103  lower, upper, stride);
104  }
105  }
106 }
Here is the call graph for this function:

◆ _XMP_gpu_unpack_array()

void _XMP_gpu_unpack_array ( _XMP_gpu_array_t device_desc,
void *  gpu_array_addr,
void *  host_shadow_buffer,
size_t  type_size,
size_t  alloc_size,
int  array_dim,
int *  lower,
int *  upper,
int *  stride 
)
Here is the caller graph for this function:

◆ _XMP_gpu_unpack_shadow_NORMAL()

void _XMP_gpu_unpack_shadow_NORMAL ( _XMP_gpu_data_t desc,
void *  lo_buffer,
void *  hi_buffer,
int  array_index 
)
108  {
110 
111  _XMP_array_t *array_desc = desc->host_array_desc;
112  if (!array_desc->is_allocated) {
113  return;
114  }
115 
116  _XMP_array_info_t *ai = &(array_desc->info[array_index]);
119 
120  int size = ai->shadow_comm_size;
121  if (size == 1) {
122  return;
123  }
124 
125  int rank = ai->shadow_comm_rank;
126  void *device_array_addr = desc->device_addr;
127  int array_dim = array_desc->dim;
128  size_t array_type_size = array_desc->type_size;
129 
130  int lower[array_dim], upper[array_dim], stride[array_dim];
131 
132  // unpack lo shadow
133  if (rank != 0) {
134  if (ai->shadow_size_lo > 0) {
135  // FIXME strict condition
136  if (ai->shadow_size_lo > ai->par_size) {
137  _XMP_fatal("shadow size is too big");
138  }
139 
140  size_t alloc_size = (ai->shadow_size_lo) * (ai->dim_elmts) * (array_type_size);
141 
142  // calc index
143  for (int i = 0; i < array_dim; i++) {
144  if (i == array_index) {
145  lower[i] = 0;
146  upper[i] = array_desc->info[i].shadow_size_lo - 1;
147  stride[i] = 1;
148  }
149  else {
150  lower[i] = array_desc->info[i].local_lower;
151  upper[i] = array_desc->info[i].local_upper;
152  stride[i] = array_desc->info[i].local_stride;
153  }
154  }
155 
156  // unpack data
157  _XMP_gpu_unpack_array(desc->device_array_desc, device_array_addr, lo_buffer,
158  array_type_size, alloc_size, array_dim,
159  lower, upper, stride);
160 
161  // free buffer
162  _XMP_free(lo_buffer);
163  }
164  }
165 
166  // unpack hi shadow
167  if (rank != (size - 1)) {
168  if (ai->shadow_size_hi > 0) {
169  // FIXME strict condition
170  if (ai->shadow_size_hi > ai->par_size) {
171  _XMP_fatal("shadow size is too big");
172  }
173 
174  size_t alloc_size = (ai->shadow_size_hi) * (ai->dim_elmts) * (array_type_size);
175 
176  // calc index
177  for (int i = 0; i < array_dim; i++) {
178  if (i == array_index) {
179  lower[i] = array_desc->info[i].local_upper + 1;
180  upper[i] = lower[i] + array_desc->info[i].shadow_size_hi - 1;
181  stride[i] = 1;
182  }
183  else {
184  lower[i] = array_desc->info[i].local_lower;
185  upper[i] = array_desc->info[i].local_upper;
186  stride[i] = array_desc->info[i].local_stride;
187  }
188  }
189 
190  // unpack data
191  _XMP_gpu_unpack_array(desc->device_array_desc, device_array_addr, hi_buffer,
192  array_type_size, alloc_size, array_dim,
193  lower, upper, stride);
194 
195  // free buffer
196  _XMP_free(hi_buffer);
197  }
198  }
199 }
Here is the call graph for this function:
_XMP_gpu_data_type::host_array_desc
_XMP_array_t * host_array_desc
Definition: xmp_data_struct.h:484
_XMP_array_info_type::shadow_comm_rank
int shadow_comm_rank
Definition: xmp_data_struct.h:257
_XMP_alloc
void * _XMP_alloc(size_t size)
Definition: xmp_util.c:21
_XMP_array_info_type
Definition: xmp_data_struct.h:194
_XMP_gpu_data_type::device_array_desc
_XMP_gpu_array_t * device_array_desc
Definition: xmp_data_struct.h:485
_XMP_gpu_unpack_array
void _XMP_gpu_unpack_array(_XMP_gpu_array_t *device_desc, void *gpu_array_addr, void *host_shadow_buffer, size_t type_size, size_t alloc_size, int array_dim, int *lower, int *upper, int *stride)
_XMP_array_info_type::shadow_comm_size
int shadow_comm_size
Definition: xmp_data_struct.h:256
_XMP_gpu_pack_array
void _XMP_gpu_pack_array(_XMP_gpu_array_t *device_desc, void *host_shadow_buffer, void *gpu_array_addr, size_t type_size, size_t alloc_size, int array_dim, int *lower, int *upper, int *stride)
_XMP_array_info_type::dim_elmts
unsigned long long dim_elmts
Definition: xmp_data_struct.h:243
_XMP_array_info_type::local_stride
int local_stride
Definition: xmp_data_struct.h:211
_XMP_array_info_type::shadow_size_lo
int shadow_size_lo
Definition: xmp_data_struct.h:249
_XMP_array_info_type::align_manner
int align_manner
Definition: xmp_data_struct.h:197
_XMP_array_info_type::local_lower
int local_lower
Definition: xmp_data_struct.h:209
_XMP_array_info_type::shadow_size_hi
int shadow_size_hi
Definition: xmp_data_struct.h:250
_XMP_gpu_data_type::device_addr
void * device_addr
Definition: xmp_data_struct.h:483
_XMP_array_type
Definition: xmp_data_struct.h:266
_XMP_array_type::type_size
size_t type_size
Definition: xmp_data_struct.h:274
_XMP_N_ALIGN_BLOCK
#define _XMP_N_ALIGN_BLOCK
Definition: xmp_constant.h:37
_XMP_array_type::info
_XMP_array_info_t info[1]
Definition: xmp_data_struct.h:313
_XMP_free
void _XMP_free(void *p)
Definition: xmp_util.c:37
_XMP_ASSERT
#define _XMP_ASSERT(_flag)
Definition: xmp_internal.h:34
_XMP_array_type::dim
int dim
Definition: xmp_data_struct.h:272
_XMP_fatal
void _XMP_fatal(char *msg)
Definition: xmp_util.c:42
_XMP_array_info_type::par_size
int par_size
Definition: xmp_data_struct.h:207
_XMP_RETURN_IF_SINGLE
#define _XMP_RETURN_IF_SINGLE
Definition: xmp_internal.h:37
_XMP_array_type::is_allocated
_Bool is_allocated
Definition: xmp_data_struct.h:270
_XMP_array_info_type::is_shadow_comm_member
_Bool is_shadow_comm_member
Definition: xmp_data_struct.h:195
_XMP_array_info_type::local_upper
int local_upper
Definition: xmp_data_struct.h:210