libxmp/libxmpf in Omni Compiler  1.3.4
xmp_onesided_mpi.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include "xmp_internal.h"
Include dependency graph for xmp_onesided_mpi.c:

Functions

void _XMP_mpi_onesided_initialize (const size_t heap_size)
 
void _XMP_mpi_onesided_finalize ()
 
void _XMP_mpi_onesided_create_win (MPI_Win *win, void *addr, size_t size, MPI_Comm comm)
 
void _XMP_mpi_onesided_alloc_win (MPI_Win *win, void **addr, size_t size, MPI_Comm comm, bool is_acc)
 
void _XMP_mpi_onesided_destroy_win (MPI_Win *win)
 
void _XMP_mpi_onesided_dealloc_win (MPI_Win *win, void **addr, bool is_acc)
 

Variables

size_t _xmp_mpi_onesided_heap_size
 
char * _xmp_mpi_onesided_buf
 
MPI_Win _xmp_mpi_onesided_win
 
MPI_Win _xmp_mpi_distarray_win
 
char * _xmp_mpi_onesided_buf_acc
 
MPI_Win _xmp_mpi_onesided_win_acc
 
MPI_Win _xmp_mpi_distarray_win_acc
 
int _XMP_flag_multi_win = 0
 

Function Documentation

◆ _XMP_mpi_onesided_alloc_win()

void _XMP_mpi_onesided_alloc_win ( MPI_Win *  win,
void **  addr,
size_t  size,
MPI_Comm  comm,
bool  is_acc 
)
100 {
101  MPI_Barrier(comm);
102  if(is_acc){
103 #ifdef _XMP_XACC
104 #if defined(_XMP_XACC_CUDA)
105  _XACC_memory_alloc(addr, size);
106  _XMP_mpi_onesided_create_win(win, *addr, size, comm);
107 #elif defined(_XMP_XACC_OPENCL)
108  _XMP_fatal("_XMP_mpi_onesided_alloc_win: XACC/OpenCL does not support onesided communication");
109 #endif
110 #else
111  _XMP_fatal("_XMP_mpi_onesided_alloc_win: XACC is not enabled");
112 #endif
113  }else{
114  MPI_Win_allocate(size, //window size
115  1, //gap size
116  MPI_INFO_NULL,
117  comm,
118  addr, //window address
119  win);
120  }
121  MPI_Barrier(comm);
122 }
Here is the caller graph for this function:

◆ _XMP_mpi_onesided_create_win()

void _XMP_mpi_onesided_create_win ( MPI_Win *  win,
void *  addr,
size_t  size,
MPI_Comm  comm 
)
90 {
91  MPI_Win_create(addr, //window address
92  size, //window size
93  1, //gap size
94  MPI_INFO_NULL,
95  comm,
96  win);
97 }

◆ _XMP_mpi_onesided_dealloc_win()

void _XMP_mpi_onesided_dealloc_win ( MPI_Win *  win,
void **  addr,
bool  is_acc 
)
130 {
131  void *win_base = NULL;
132  if(is_acc){
133  int flag;
134  MPI_Win_get_attr(*win, MPI_WIN_BASE, &win_base, &flag);
135  if(! flag){
136  _XMP_fatal("cannot get win_base");
137  }
138  if(*addr != win_base){
139  _XMP_fatal("addr differ from win_base");
140  }
141  }
142 
144 
145  if(is_acc){
146 #ifdef _XMP_XACC
147 #if defined(_XMP_XACC_CUDA)
148  _XACC_memory_free(addr);
149 #elif defined(_XMP_XACC_OPENCL)
150  _XMP_fatal("_XMP_mpi_onesided_dealloc_win: XACC/OpenCL does not support onesided communication");
151 #endif
152 #else
153  _XMP_fatal("_XMP_mpi_onesided_dealloc_win: XACC is not enabled");
154 #endif
155  }
156 
157  *addr = NULL;
158 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _XMP_mpi_onesided_destroy_win()

void _XMP_mpi_onesided_destroy_win ( MPI_Win *  win)
125 {
126  MPI_Win_free(win);
127 }
Here is the caller graph for this function:

◆ _XMP_mpi_onesided_finalize()

void _XMP_mpi_onesided_finalize ( )
64  {
65  XACC_DEBUG("_XMP_mpi_onesided_finalize()");
66 
67  if(_XMP_flag_multi_win) return;
68 
69  MPI_Win_unlock_all(_xmp_mpi_onesided_win);
71  MPI_Win_unlock_all(_xmp_mpi_distarray_win);
72 
73  MPI_Barrier(MPI_COMM_WORLD);
75  XACC_DEBUG("free _xmp_mpi_onesided_buf(%p)\n", _xmp_mpi_onesided_buf);
76  MPI_Win_free(&_xmp_mpi_distarray_win);
77 
78 #if defined(_XMP_XACC) && defined(_XMP_XACC_CUDA)
79  MPI_Win_unlock_all(_xmp_mpi_onesided_win_acc);
81  MPI_Win_unlock_all(_xmp_mpi_distarray_win_acc);
82 
83  MPI_Barrier(MPI_COMM_WORLD);
85  MPI_Win_free(&_xmp_mpi_distarray_win_acc);
86 #endif
87 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ _XMP_mpi_onesided_initialize()

void _XMP_mpi_onesided_initialize ( const size_t  heap_size)
26 {
27  XACC_DEBUG("_XMP_mpi_onesided_initialize start");
28  {
29  char *p = getenv("XMP_ONESIDED_MPI_MULTI_WIN");
30  if(p != NULL){
31  _XMP_flag_multi_win = atoi(p);
32  }
33  }
34 
35  if(_XMP_flag_multi_win) return;
36 
37  _xmp_mpi_onesided_heap_size = heap_size;
38 
39  XACC_DEBUG("alloc memory size=%zd\n", heap_size);
40  XACC_DEBUG("alloced _xmp_mpi_onesided_buf(%p)\n", _xmp_mpi_onesided_buf);
41  int a = 0;
42  MPI_Initialized(&a);
43  _XMP_mpi_onesided_alloc_win(&_xmp_mpi_onesided_win, (void**)&_xmp_mpi_onesided_buf, heap_size, MPI_COMM_WORLD, false);
44 
46  MPI_Win_lock_all(MPI_MODE_NOCHECK, _xmp_mpi_onesided_win);
47  //MPI_Win_fence(MPI_MODE_NOPRECEDE, _xmp_mpi_onesided_win);
48 
49  MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &_xmp_mpi_distarray_win);
50  MPI_Win_lock_all(MPI_MODE_NOCHECK, _xmp_mpi_distarray_win);
51 
52 #if defined(_XMP_XACC) && defined(_XMP_XACC_CUDA)
53  _XMP_mpi_onesided_alloc_win(&_xmp_mpi_onesided_win_acc, (void**)&_xmp_mpi_onesided_buf_acc, heap_size, MPI_COMM_WORLD, true);
54 
56  MPI_Win_lock_all(MPI_MODE_NOCHECK, _xmp_mpi_onesided_win_acc);
57  //MPI_Win_fence(MPI_MODE_NOPRECEDE, _xmp_mpi_onesided_win_acc);
58 
59  MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &_xmp_mpi_distarray_win_acc);
60  MPI_Win_lock_all(MPI_MODE_NOCHECK, _xmp_mpi_distarray_win_acc);
61 #endif
62 }
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ _XMP_flag_multi_win

int _XMP_flag_multi_win = 0

◆ _xmp_mpi_distarray_win

MPI_Win _xmp_mpi_distarray_win

◆ _xmp_mpi_distarray_win_acc

MPI_Win _xmp_mpi_distarray_win_acc

◆ _xmp_mpi_onesided_buf

char* _xmp_mpi_onesided_buf

◆ _xmp_mpi_onesided_buf_acc

char* _xmp_mpi_onesided_buf_acc

◆ _xmp_mpi_onesided_heap_size

size_t _xmp_mpi_onesided_heap_size

◆ _xmp_mpi_onesided_win

MPI_Win _xmp_mpi_onesided_win

◆ _xmp_mpi_onesided_win_acc

MPI_Win _xmp_mpi_onesided_win_acc
_XMP_mpi_onesided_destroy_win
void _XMP_mpi_onesided_destroy_win(MPI_Win *win)
Definition: xmp_onesided_mpi.c:124
_xmp_mpi_onesided_win
MPI_Win _xmp_mpi_onesided_win
Definition: xmp_onesided_mpi.c:12
_xmp_mpi_onesided_win_acc
MPI_Win _xmp_mpi_onesided_win_acc
Definition: xmp_onesided_mpi.c:17
_xmp_mpi_distarray_win_acc
MPI_Win _xmp_mpi_distarray_win_acc
Definition: xmp_onesided_mpi.c:18
_XACC_memory_alloc
void _XACC_memory_alloc(_XACC_memory_t *memory, size_t size)
Definition: xacc_util_cl.c:52
_xmp_mpi_onesided_buf_acc
char * _xmp_mpi_onesided_buf_acc
Definition: xmp_onesided_mpi.c:16
_XMP_mpi_destroy_shift_queue
void _XMP_mpi_destroy_shift_queue(bool is_acc)
Destroy shift queue.
Definition: xmp_coarray_mpi.c:166
_XMP_mpi_onesided_create_win
void _XMP_mpi_onesided_create_win(MPI_Win *win, void *addr, size_t size, MPI_Comm comm)
Definition: xmp_onesided_mpi.c:89
_XMP_mpi_build_shift_queue
void _XMP_mpi_build_shift_queue(bool is_acc)
Set initial value to the shift queue.
Definition: xmp_coarray_mpi.c:153
_xmp_mpi_onesided_buf
char * _xmp_mpi_onesided_buf
Definition: xmp_onesided_mpi.c:11
_XMP_mpi_onesided_dealloc_win
void _XMP_mpi_onesided_dealloc_win(MPI_Win *win, void **addr, bool is_acc)
Definition: xmp_onesided_mpi.c:129
_xmp_mpi_onesided_heap_size
size_t _xmp_mpi_onesided_heap_size
Definition: xmp_onesided_mpi.c:10
XACC_DEBUG
#define XACC_DEBUG(...)
Definition: xmp_internal.h:768
_xmp_mpi_distarray_win
MPI_Win _xmp_mpi_distarray_win
Definition: xmp_onesided_mpi.c:13
_XMP_flag_multi_win
int _XMP_flag_multi_win
Definition: xmp_onesided_mpi.c:23
_XMP_fatal
void _XMP_fatal(char *msg)
Definition: xmp_util.c:42
_XMP_mpi_onesided_alloc_win
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
_XACC_memory_free
void _XACC_memory_free(_XACC_memory_t *memory)
Definition: xacc_util_cl.c:64