libxmp/libxmpf in Omni Compiler
1.3.4
|
#include <stdio.h>
#include <stdlib.h>
#include "xmp_internal.h"
#include <signal.h>
#include <string.h>
|
MPI_Win | _XMP_mpi_coarray_get_window (const _XMP_coarray_t *desc, bool is_acc) |
|
char * | _XMP_mpi_coarray_get_remote_addr (const _XMP_coarray_t *desc, const int target_rank, const bool is_acc) |
|
char * | _XMP_mpi_coarray_get_local_addr (const _XMP_coarray_t *desc, const bool is_acc) |
|
void | _XMP_mpi_build_shift_queue (bool is_acc) |
| Set initial value to the shift queue. More...
|
|
void | _XMP_mpi_destroy_shift_queue (bool is_acc) |
| Destroy shift queue. More...
|
|
void | _XMP_mpi_coarray_lastly_deallocate (bool is_acc) |
| Deallocate memory region when calling _XMP_coarray_lastly_deallocate() More...
|
|
void | _XMP_mpi_coarray_deallocate (_XMP_coarray_t *c, bool is_acc) |
|
void | _XMP_mpi_coarray_malloc (_XMP_coarray_t *coarray_desc, void **addr, const size_t coarray_size, bool is_acc) |
|
void | _XMP_mpi_contiguous_put (const int org_target_rank, const _XMP_coarray_t *dst_desc, const _XMP_coarray_t *src_desc, const size_t dst_offset, const size_t src_offset, const size_t dst_elmts, const size_t src_elmts, const size_t elmt_size, const bool is_dst_on_acc, const bool is_src_on_acc) |
|
void | _XMP_mpi_contiguous_get (const int org_target_rank, const _XMP_coarray_t *dst_desc, const _XMP_coarray_t *src_desc, const size_t dst_offset, const size_t src_offset, const size_t dst_elmts, const size_t src_elmts, const size_t elmt_size, const bool is_dst_on_acc, const bool is_src_on_acc) |
|
void | _XMP_mpi_put (const int dst_contiguous, const int src_contiguous, const int org_target_rank, const int dst_dims, const int src_dims, const _XMP_array_section_t *dst_info, const _XMP_array_section_t *src_info, const _XMP_coarray_t *dst_desc, const void *src, const int dst_elmts, const int src_elmts, const int is_dst_on_acc) |
|
void | _XMP_mpi_get (const int src_contiguous, const int dst_contiguous, const int org_target_rank, const int src_dims, const int dst_dims, const _XMP_array_section_t *src_info, const _XMP_array_section_t *dst_info, const _XMP_coarray_t *src_desc, void *dst, const int src_elmts, const int dst_elmts, const int is_src_on_acc) |
|
void | _XMP_mpi_sync_memory () |
| Execute sync_memory. More...
|
|
void | _XMP_mpi_sync_all () |
| Execute sync_all. More...
|
|
void | _XMP_mpi_coarray_attach (_XMP_coarray_t *coarray_desc, void *addr, const size_t coarray_size, const bool is_acc) |
|
void | _XMP_mpi_coarray_detach (_XMP_coarray_t *coarray_desc, const bool is_acc) |
|
void | _XMP_mpi_build_sync_images_table () |
| Build table and Initialize for sync images. More...
|
|
void | _XMP_mpi_sync_images (const int num, const int *image_set, int *status) |
| Execute sync images. More...
|
|
void | _XMP_sync_images_EXEC (int *status) |
|
void | _XMP_sync_images_COMM (MPI_Comm *comm, int *status) |
|
void | _XMP_mpi_coarray_regmem (_XMP_coarray_t *coarray_desc, void *real_addr, const size_t coarray_size, bool is_acc) |
|
void | _XMP_mpi_coarray_deregmem (_XMP_coarray_t *c) |
|
◆ _is_get_blocking
◆ _is_put_blocking
◆ _is_put_local_blocking
◆ _SYNCIMAGE_SENDRECV
#define _SYNCIMAGE_SENDRECV |
◆ _XMP_mpi_build_shift_queue()
void _XMP_mpi_build_shift_queue |
( |
bool |
is_acc | ) |
|
Set initial value to the shift queue.
155 struct _shift_queue_t *shift_queue = is_acc? &_shift_queue_acc : &_shift_queue;
157 shift_queue->
max_size = _XMP_MPI_ONESIDED_COARRAY_SHIFT_QUEUE_INITIAL_SIZE;
158 shift_queue->
num = 0;
159 shift_queue->
shifts = malloc(
sizeof(
size_t) * shift_queue->
max_size);
◆ _XMP_mpi_build_sync_images_table()
void _XMP_mpi_build_sync_images_table |
( |
| ) |
|
Build table and Initialize for sync images.
954 #ifdef _SYNCIMAGE_SENDRECV
959 _sync_images_table_disp = (
unsigned int*)(shift_queue->
total_shift);
962 if(table_size % _XMP_MPI_ALIGNMENT == 0)
965 shift = ((table_size / _XMP_MPI_ALIGNMENT) + 1) * _XMP_MPI_ALIGNMENT;
967 _push_shift_queue(shift_queue, shift);
971 _sync_images_table[i] = 0;
973 MPI_Barrier(MPI_COMM_WORLD);
◆ _XMP_mpi_coarray_attach()
void _XMP_mpi_coarray_attach |
( |
_XMP_coarray_t * |
coarray_desc, |
|
|
void * |
addr, |
|
|
const size_t |
coarray_size, |
|
|
const bool |
is_acc |
|
) |
| |
866 MPI_Win win = MPI_WIN_NULL;
867 char **each_addr = NULL;
871 MPI_Comm comm = *(MPI_Comm *)nodes->
comm;
873 XACC_DEBUG(
"attach addr=%p, size=%zd, is_acc=%d", addr, coarray_size, is_acc);
877 MPI_Win_lock_all(MPI_MODE_NOCHECK, win);
885 MPI_Win_attach(win, addr, coarray_size);
887 each_addr = (
char**)
_XMP_alloc(
sizeof(
char *) * comm_size);
889 MPI_Allgather(&addr,
sizeof(
char *), MPI_BYTE,
890 each_addr,
sizeof(
char *), MPI_BYTE,
896 coarray_desc->addr_dev = each_addr;
897 coarray_desc->real_addr_dev = addr;
898 coarray_desc->win_acc = win;
899 coarray_desc->nodes = nodes;
902 coarray_desc->
addr = each_addr;
904 coarray_desc->win = win;
905 coarray_desc->win_acc = MPI_WIN_NULL;
906 coarray_desc->nodes = nodes;
◆ _XMP_mpi_coarray_deallocate()
225 MPI_Win_unlock_all(c->win);
◆ _XMP_mpi_coarray_deregmem()
1196 _XMP_fatal(
"single window mode does not support coarray deregmem");
1199 MPI_Win_unlock_all(c->win);
◆ _XMP_mpi_coarray_detach()
void _XMP_mpi_coarray_detach |
( |
_XMP_coarray_t * |
coarray_desc, |
|
|
const bool |
is_acc |
|
) |
| |
913 MPI_Win win = is_acc? coarray_desc->win_acc : coarray_desc->win;
914 MPI_Win_unlock_all(win);
919 void *real_addr = coarray_desc->
real_addr;
923 real_addr = coarray_desc->real_addr_dev;
927 MPI_Win_detach(win, real_addr);
933 coarray_desc->addr_dev = NULL;
934 coarray_desc->real_addr_dev = NULL;
935 coarray_desc->win_acc = MPI_WIN_NULL;
936 coarray_desc->nodes = NULL;
940 coarray_desc->
addr = NULL;
942 coarray_desc->win = MPI_WIN_NULL;
943 coarray_desc->nodes = NULL;
◆ _XMP_mpi_coarray_get_local_addr()
char* _XMP_mpi_coarray_get_local_addr |
( |
const _XMP_coarray_t * |
desc, |
|
|
const bool |
is_acc |
|
) |
| |
147 return get_local_addr(desc, is_acc);
◆ _XMP_mpi_coarray_get_remote_addr()
char* _XMP_mpi_coarray_get_remote_addr |
( |
const _XMP_coarray_t * |
desc, |
|
|
const int |
target_rank, |
|
|
const bool |
is_acc |
|
) |
| |
142 return get_remote_addr(desc, target_rank, is_acc);
◆ _XMP_mpi_coarray_get_window()
MPI_Win _XMP_mpi_coarray_get_window |
( |
const _XMP_coarray_t * |
desc, |
|
|
bool |
is_acc |
|
) |
| |
113 return get_window(desc, is_acc);
◆ _XMP_mpi_coarray_lastly_deallocate()
void _XMP_mpi_coarray_lastly_deallocate |
( |
bool |
is_acc | ) |
|
◆ _XMP_mpi_coarray_malloc()
void _XMP_mpi_coarray_malloc |
( |
_XMP_coarray_t * |
coarray_desc, |
|
|
void ** |
addr, |
|
|
const size_t |
coarray_size, |
|
|
bool |
is_acc |
|
) |
| |
239 char **each_addr = NULL;
240 struct _shift_queue_t *shift_queue = is_acc? &_shift_queue_acc : &_shift_queue;
242 char *real_addr = NULL;
243 MPI_Win win = MPI_WIN_NULL;
245 MPI_Comm comm = *(MPI_Comm *)nodes->
comm;
247 if(coarray_size == 0){
248 _XMP_fatal(
"_XMP_mpi_coarray_malloc: zero size is not allowed");
253 MPI_Win_lock_all(MPI_MODE_NOCHECK, win);
255 XACC_DEBUG(
"addr=%p, size=%zd, is_acc=%d", real_addr, coarray_size, is_acc);
271 if(coarray_size % _XMP_MPI_ALIGNMENT == 0)
272 shift = coarray_size;
274 shift = ((coarray_size / _XMP_MPI_ALIGNMENT) + 1) * _XMP_MPI_ALIGNMENT;
277 _push_shift_queue(shift_queue, shift);
284 fprintf(stderr,
"[ERROR] Cannot allocate coarray. Heap memory size of coarray is too small.\n");
285 fprintf(stderr,
" Please set the environmental variable \"XMP_ONESIDED_HEAP_SIZE\".\n");
286 fprintf(stderr,
" e.g.) export XMP_ONESIDED_HEAP_SIZE=%zuM (or more).\n",
295 coarray_desc->addr_dev = each_addr;
296 coarray_desc->real_addr_dev = real_addr;
297 coarray_desc->win_acc = win;
298 coarray_desc->nodes = nodes;
301 coarray_desc->
addr = each_addr;
303 coarray_desc->win = win;
304 coarray_desc->win_acc = MPI_WIN_NULL;
305 coarray_desc->nodes = nodes;
◆ _XMP_mpi_coarray_regmem()
void _XMP_mpi_coarray_regmem |
( |
_XMP_coarray_t * |
coarray_desc, |
|
|
void * |
real_addr, |
|
|
const size_t |
coarray_size, |
|
|
bool |
is_acc |
|
) |
| |
1159 char **each_addr = NULL;
1160 MPI_Win win = MPI_WIN_NULL;
1162 MPI_Comm comm = *(MPI_Comm *)nodes->
comm;
1165 _XMP_fatal(
"single window mode does not support coarray regmem");
1168 if(coarray_size == 0){
1169 _XMP_fatal(
"_XMP_mpi_coarray_regmem: zero size is not allowed");
1173 MPI_Win_lock_all(MPI_MODE_NOCHECK, win);
1175 XACC_DEBUG(
"addr=%p, size=%zd, is_acc=%d", real_addr, coarray_size, is_acc);
1179 coarray_desc->addr_dev = each_addr;
1180 coarray_desc->real_addr_dev = real_addr;
1181 coarray_desc->win_acc = win;
1182 coarray_desc->nodes = nodes;
1185 coarray_desc->
addr = each_addr;
1187 coarray_desc->win = win;
1188 coarray_desc->win_acc = MPI_WIN_NULL;
1189 coarray_desc->nodes = nodes;
◆ _XMP_mpi_contiguous_get()
void _XMP_mpi_contiguous_get |
( |
const int |
org_target_rank, |
|
|
const _XMP_coarray_t * |
dst_desc, |
|
|
const _XMP_coarray_t * |
src_desc, |
|
|
const size_t |
dst_offset, |
|
|
const size_t |
src_offset, |
|
|
const size_t |
dst_elmts, |
|
|
const size_t |
src_elmts, |
|
|
const size_t |
elmt_size, |
|
|
const bool |
is_dst_on_acc, |
|
|
const bool |
is_src_on_acc |
|
) |
| |
381 const int target_rank = _XMP_mpi_trans_rank(src_desc, org_target_rank);
383 size_t transfer_size = elmt_size * dst_elmts;
384 char *dst = get_local_addr(dst_desc, is_dst_on_acc);
385 if(dst_elmts == src_elmts){
389 src_offset, dst_offset,
390 transfer_size, is_src_on_acc);
391 }
else if(src_elmts == 1){
393 dst_info.
start = dst_offset / elmt_size;
394 dst_info.
length = dst_elmts;
398 _mpi_scalar_mget(target_rank,
400 dst_offset, src_offset,
405 _XMP_fatal(
"Coarray Error ! transfer size is wrong.\n");
◆ _XMP_mpi_contiguous_put()
void _XMP_mpi_contiguous_put |
( |
const int |
org_target_rank, |
|
|
const _XMP_coarray_t * |
dst_desc, |
|
|
const _XMP_coarray_t * |
src_desc, |
|
|
const size_t |
dst_offset, |
|
|
const size_t |
src_offset, |
|
|
const size_t |
dst_elmts, |
|
|
const size_t |
src_elmts, |
|
|
const size_t |
elmt_size, |
|
|
const bool |
is_dst_on_acc, |
|
|
const bool |
is_src_on_acc |
|
) |
| |
331 const int target_rank = _XMP_mpi_trans_rank(dst_desc, org_target_rank);
333 size_t transfer_size = elmt_size * dst_elmts;
334 char *src = get_local_addr(src_desc, is_src_on_acc);
335 if(dst_elmts == src_elmts){
339 dst_offset, src_offset,
340 transfer_size, is_dst_on_acc);
341 }
else if(src_elmts == 1){
343 dst_info.
start = dst_offset / elmt_size;
344 dst_info.
length = dst_elmts;
349 _mpi_scalar_mput(target_rank,
351 dst_offset, src_offset,
356 _XMP_fatal(
"Coarray Error ! transfer size is wrong.\n");
◆ _XMP_mpi_destroy_shift_queue()
void _XMP_mpi_destroy_shift_queue |
( |
bool |
is_acc | ) |
|
Destroy shift queue.
168 struct _shift_queue_t *shift_queue = is_acc? &_shift_queue_acc : &_shift_queue;
171 shift_queue->
shifts = NULL;
◆ _XMP_mpi_get()
void _XMP_mpi_get |
( |
const int |
src_contiguous, |
|
|
const int |
dst_contiguous, |
|
|
const int |
org_target_rank, |
|
|
const int |
src_dims, |
|
|
const int |
dst_dims, |
|
|
const _XMP_array_section_t * |
src_info, |
|
|
const _XMP_array_section_t * |
dst_info, |
|
|
const _XMP_coarray_t * |
src_desc, |
|
|
void * |
dst, |
|
|
const int |
src_elmts, |
|
|
const int |
dst_elmts, |
|
|
const int |
is_src_on_acc |
|
) |
| |
491 size_t transfer_size = src_desc->
elmt_size * src_elmts;
493 const int target_rank = _XMP_mpi_trans_rank(src_desc, org_target_rank);
495 XACC_DEBUG(
"_XMP_mpi_get, dst_elmts = %d, src_elmts = %d\n", src_elmts, dst_elmts);
497 if(src_elmts == dst_elmts){
502 src_offset, dst_offset,
503 transfer_size, is_src_on_acc);
507 src_offset, dst_offset,
510 src_elmts, is_src_on_acc);
512 }
else if(src_elmts == 1){
513 _mpi_scalar_mget(target_rank,
515 dst_offset, src_offset,
◆ _XMP_mpi_put()
void _XMP_mpi_put |
( |
const int |
dst_contiguous, |
|
|
const int |
src_contiguous, |
|
|
const int |
org_target_rank, |
|
|
const int |
dst_dims, |
|
|
const int |
src_dims, |
|
|
const _XMP_array_section_t * |
dst_info, |
|
|
const _XMP_array_section_t * |
src_info, |
|
|
const _XMP_coarray_t * |
dst_desc, |
|
|
const void * |
src, |
|
|
const int |
dst_elmts, |
|
|
const int |
src_elmts, |
|
|
const int |
is_dst_on_acc |
|
) |
| |
432 size_t transfer_size = dst_desc->
elmt_size * dst_elmts;
434 const int target_rank = _XMP_mpi_trans_rank(dst_desc, org_target_rank);
436 if(dst_elmts == src_elmts){
441 dst_offset, src_offset,
442 transfer_size, is_dst_on_acc);
447 dst_offset, src_offset,
450 dst_elmts, is_dst_on_acc);
455 _mpi_scalar_mput(target_rank,
457 dst_offset, src_offset,
◆ _XMP_mpi_sync_all()
void _XMP_mpi_sync_all |
( |
| ) |
|
◆ _XMP_mpi_sync_images()
void _XMP_mpi_sync_images |
( |
const int |
num, |
|
|
const int * |
image_set, |
|
|
int * |
status |
|
) |
| |
Execute sync images.
- Parameters
-
[in] | num | number of nodes |
[in] | *image_set | image set |
[out] | status | status |
1088 fprintf(stderr,
"Invalid value is used in xmp_sync_memory. The first argument is %d\n",
num);
1092 _notify_sync_images(
num, image_set);
1093 _wait_sync_images(
num, image_set);
◆ _XMP_mpi_sync_memory()
void _XMP_mpi_sync_memory |
( |
| ) |
|
Execute sync_memory.
547 for(
int i = 0; i <
num; i++){
548 MPI_Win win = coarrays[i]->win;
549 if(win != MPI_WIN_NULL){
550 XACC_DEBUG(
"flush_all for host a coarray (%ld)", (
long)win);
551 MPI_Win_flush_all(win);
552 XACC_DEBUG(
"sync for host a coarray (%ld)", (
long)win);
556 MPI_Win win_acc = coarrays[i]->win_acc;
557 if(win_acc != MPI_WIN_NULL){
558 XACC_DEBUG(
"flush_all for acc a coarray (%ld)", (
long)win_acc);
559 MPI_Win_flush_all(win_acc);
560 XACC_DEBUG(
"sync for acc a coarray (%ld)", (
long)win_acc);
561 MPI_Win_sync(win_acc);
566 if(! _is_coarray_win_flushed){
570 _is_coarray_win_flushed =
true;
573 if(! _is_distarray_win_flushed){
577 _is_distarray_win_flushed =
true;
581 if(! _is_coarray_win_acc_flushed){
585 _is_coarray_win_acc_flushed =
true;
588 if(! _is_distarray_win_acc_flushed){
592 _is_distarray_win_acc_flushed =
true;
◆ _XMP_sync_images_COMM()
void _XMP_sync_images_COMM |
( |
MPI_Comm * |
comm, |
|
|
int * |
status |
|
) |
| |
◆ _XMP_sync_images_EXEC()
void _XMP_sync_images_EXEC |
( |
int * |
status | ) |
|
◆ _XMP_flag_get_nb
◆ _XMP_flag_multi_win
◆ _XMP_flag_put_nb
These variables are temporral.
void _XMP_mpi_onesided_destroy_win(MPI_Win *win)
Definition: xmp_onesided_mpi.c:124
MPI_Win _xmp_mpi_onesided_win
Definition: xmp_onesided_mpi.c:12
void _XMP_barrier_EXEC(void)
Definition: xmp_barrier.c:16
void _XMP_fatal_nomsg()
Definition: xmp_util.c:48
int comm_size
Definition: xmp_data_struct.h:48
MPI_Win _xmp_mpi_onesided_win_acc
Definition: xmp_onesided_mpi.c:17
char ** addr
Definition: xmp_data_struct.h:329
MPI_Win _xmp_mpi_distarray_win_acc
Definition: xmp_onesided_mpi.c:18
void * _XMP_alloc(size_t size)
Definition: xmp_util.c:21
long length
Definition: xmp_data_struct.h:377
char * _xmp_mpi_onesided_buf_acc
Definition: xmp_onesided_mpi.c:16
char * real_addr
Definition: xmp_data_struct.h:336
int _XMP_world_size
Definition: xmp_world.c:8
void _XMP_mpi_onesided_create_win(MPI_Win *win, void *addr, size_t size, MPI_Comm comm)
Definition: xmp_onesided_mpi.c:89
size_t elmt_size
Definition: xmp_data_struct.h:339
size_t * shifts
shifts array
Definition: xmp_coarray_gasnet.c:11
void _XMP_mpi_sync_memory()
Execute sync_memory.
Definition: xmp_coarray_mpi.c:542
int num
How many shifts are in this queue.
Definition: xmp_coarray_gasnet.c:10
int _XMP_flag_multi_win
Definition: xmp_onesided_mpi.c:23
int _XMP_world_rank
Definition: xmp_world.c:9
Definition: xmp_coarray_gasnet.c:8
size_t max_size
Max size of queue.
Definition: xmp_coarray_gasnet.c:9
_XMP_coarray_t ** _XMP_coarray_get_list(int *num)
Definition: xmp_coarray.c:1774
size_t total_shift
all amount of shifts
Definition: xmp_coarray_mpi.c:14
long start
Definition: xmp_data_struct.h:376
char * _xmp_mpi_onesided_buf
Definition: xmp_onesided_mpi.c:11
void _XMP_mpi_onesided_dealloc_win(MPI_Win *win, void **addr, bool is_acc)
Definition: xmp_onesided_mpi.c:129
#define _XMP_N_COARRAY_PUT
Definition: xmp_constant.h:112
size_t _xmp_mpi_onesided_heap_size
Definition: xmp_onesided_mpi.c:10
size_t _XMP_get_offset(const _XMP_array_section_t *array_info, const int dims)
Definition: xmp_coarray_utils.c:22
Definition: xmp_data_struct.h:328
void _XMP_free(void *p)
Definition: xmp_util.c:37
#define XACC_DEBUG(...)
Definition: xmp_internal.h:768
MPI_Win _xmp_mpi_distarray_win
Definition: xmp_onesided_mpi.c:13
_XMP_comm_t * comm
Definition: xmp_data_struct.h:53
void _XMP_fatal(char *msg)
Definition: xmp_util.c:42
long stride
Definition: xmp_data_struct.h:378
#define _XMP_N_COARRAY_GET
Definition: xmp_constant.h:111
long distance
Definition: xmp_data_struct.h:380
Definition: xmp_data_struct.h:375
Definition: xmp_data_struct.h:40
void _XMP_mpi_onesided_alloc_win(MPI_Win *win, void **addr, size_t size, MPI_Comm comm, bool is_acc)
Definition: xmp_onesided_mpi.c:99
long elmts
Definition: xmp_data_struct.h:379
#define _XMP_N_INT_TRUE
Definition: xmp_constant.h:4
void * _XMP_get_execution_nodes(void)
Definition: xmp_nodes_stack.c:46