1
/* ARMCI header file */
8
#if defined(__cplusplus) || defined(c_plusplus)
13
extern int armci_sameclusnode(int proc);
21
typedef long armci_size_t;
22
extern int armci_notify(int proc);
23
extern int armci_notify_wait(int proc,int *pval);
24
extern int ARMCI_Init(void); /* initialize ARMCI */
25
extern int ARMCI_Init_args(int *argc, char ***argv); /* initialize ARMCI */
26
extern int ARMCI_Initialized();
27
extern void ARMCI_Barrier(void); /* ARMCI Barrier*/
29
extern int ARMCI_Put(void *src, void* dst, int bytes, int proc);
30
extern int ARMCI_Put_flag(void *src, void* dst,int bytes,int *f,int v,int proc);
32
/* On path for deprecation */
33
#define ARMCI_Put1(_s,_d,_b,_p) memcpy(_d,_s,_b), 0
35
extern int ARMCI_PutS( /* strided put */
36
void *src_ptr, /* pointer to 1st segment at source*/
37
int src_stride_arr[], /* array of strides at source */
38
void* dst_ptr, /* pointer to 1st segment at destination*/
39
int dst_stride_arr[], /* array of strides at destination */
40
int count[], /* number of units at each stride level count[0]=bytes */
41
int stride_levels, /* number of stride levels */
42
int proc /* remote process(or) ID */
45
extern int ARMCI_PutS_flag_dir( /* put with flag that uses direct put */
46
void *src_ptr, /* pointer to 1st segment at source*/
47
int src_stride_arr[], /* array of strides at source */
48
void* dst_ptr, /* pointer to 1st segment at destination*/
49
int dst_stride_arr[], /* array of strides at destination */
50
int count[], /* number of segments at each stride
51
levels: count[0]=bytes*/
52
int stride_levels, /* number of stride levels */
53
int *flag, /* pointer to remote flag */
54
int val, /* value to set flag upon completion of
56
int proc /* remote process(or) ID */
59
extern int ARMCI_PutS_flag(
60
void *src_ptr, /* pointer to 1st segment at source*/
61
int src_stride_arr[], /* array of strides at source */
62
void* dst_ptr, /* pointer to 1st segment at destination*/
63
int dst_stride_arr[], /* array of strides at destination */
64
int count[], /* number of segments at each stride
65
levels: count[0]=bytes*/
66
int stride_levels, /* number of stride levels */
67
int *flag, /* pointer to remote flag */
68
int val, /* value to set flag upon completion of
70
int proc /* remote process(or) ID */
73
extern int ARMCI_Acc(int optype, void *scale, void *src, void* dst, int bytes, int proc);
75
extern int ARMCI_AccS( /* strided accumulate */
76
int optype, /* operation */
77
void *scale, /* scale factor x += scale*y */
78
void *src_ptr, /* pointer to 1st segment at source*/
79
int src_stride_arr[], /* array of strides at source */
80
void* dst_ptr, /* pointer to 1st segment at destination*/
81
int dst_stride_arr[], /* array of strides at destination */
82
int count[], /* number of units at each stride level count[0]=bytes */
83
int stride_levels, /* number of stride levels */
84
int proc /* remote process(or) ID */
88
extern int ARMCI_Get(void *src, void* dst, int bytes, int proc);
90
extern int ARMCI_GetS( /* strided get */
91
void *src_ptr, /* pointer to 1st segment at source*/
92
int src_stride_arr[], /* array of strides at source */
93
void* dst_ptr, /* pointer to 1st segment at destination*/
94
int dst_stride_arr[], /* array of strides at destination */
95
int count[], /* number of units at each stride level count[0]=bytes */
96
int stride_levels, /* number of stride levels */
97
int proc /* remote process(or) ID */
100
extern int ARMCI_GetV( armci_giov_t darr[], /* descriptor array */
101
int len, /* length of descriptor array */
102
int proc /* remote process(or) ID */
105
extern int ARMCI_PutV( armci_giov_t darr[], /* descriptor array */
106
int len, /* length of descriptor array */
107
int proc /* remote process(or) ID */
110
extern int ARMCI_AccV( int op, /* operation code */
111
void *scale, /* scaling factor for accumulate */
112
armci_giov_t darr[], /* descriptor array */
113
int len, /* length of descriptor array */
114
int proc /* remote process(or) ID */
117
extern int ARMCI_PutValueInt(int src, /* value in a register to put */
118
void *dst, /* dest starting addr to put data */
119
int proc /* remote process (or) ID */
122
extern int ARMCI_PutValueLong(long src, /* value in a register to put */
123
void *dst, /* dest starting addr to put data */
124
int proc /* remote process (or) ID */
127
extern int ARMCI_PutValueFloat(float src, /* value in a register to put */
128
void *dst, /* dest starting addr to put data */
129
int proc /* remote process (or) ID */
132
extern int ARMCI_PutValueDouble(double src,/* value in a register to put */
133
void *dst, /* dest starting addr to put data */
134
int proc /* remote process (or) ID */
137
extern int ARMCI_GetValueInt(void *src, int proc);
138
extern long ARMCI_GetValueLong(void *src, int proc);
139
extern float ARMCI_GetValueFloat(void *src, int proc);
140
extern double ARMCI_GetValueDouble(void *src, int proc);
143
extern int ARMCI_Malloc(void* ptr_arr[], armci_size_t bytes);
144
extern int ARMCI_Free(void *ptr);
145
extern void* ARMCI_Malloc_local(armci_size_t bytes);
146
extern int ARMCI_Free_local(void *ptr);
147
extern int ARMCI_Same_node(int proc);
149
extern void ARMCI_Finalize(); /* terminate ARMCI */
150
extern void ARMCI_Error(char *msg, int code);
151
extern void ARMCI_Fence(int proc);
152
extern void ARMCI_AllFence(void);
153
extern int ARMCI_Rmw(int op, void *ploc, void *prem, int extra, int proc);
154
extern void ARMCI_Cleanup(void);
155
extern int ARMCI_Create_mutexes(int num);
156
extern int ARMCI_Destroy_mutexes(void);
157
extern void ARMCI_Lock(int mutex, int proc);
158
extern void ARMCI_Unlock(int mutex, int proc);
159
extern void ARMCI_Set_shm_limit(unsigned long shmemlimit);
160
extern int ARMCI_Uses_shm();
161
extern void ARMCI_Copy(void *src, void *dst, int n);
172
#define ARMCI_SWAP 10
173
#define ARMCI_SWAP_LONG 11
174
#define ARMCI_FETCH_AND_ADD 12
175
#define ARMCI_FETCH_AND_ADD_LONG 13
177
#define ARMCI_ACC_OFF 36
178
#define ARMCI_ACC_INT (ARMCI_ACC_OFF + 1)
179
#define ARMCI_ACC_DBL (ARMCI_ACC_OFF + 2)
180
#define ARMCI_ACC_FLT (ARMCI_ACC_OFF + 3)
181
#define ARMCI_ACC_CPL (ARMCI_ACC_OFF + 4)
182
#define ARMCI_ACC_DCP (ARMCI_ACC_OFF + 5)
183
#define ARMCI_ACC_LNG (ARMCI_ACC_OFF + 6)
185
#define ARMCI_MAX_STRIDE_LEVEL 8
187
/****************Error/termination macros************************/
188
/**Debug assert macro. To be used instead of assert for more user
189
* informative and cleaner death. Also allows individualized
190
* enabling/disabling of assert statements.
191
* @param _enable Ignore this assertion if _enable==0
192
* @param _cond Condition to be evaluated (assert that it is true)
193
* @param _plist Information to be printed using printf, should be
194
* within parenthesis (eg., dassert(1,0,("%d:test n=%d\n",me,0));
195
* ). This is fed directly to printf.
197
int dassertp_fail(const char *cond_string, const char *file,
198
const char *func, unsigned int line, int code);
199
void derr_printf(const char *format, ...);
201
#define dassertp(_enable,_cond,_plist) do { \
202
if((_enable) && !(_cond)) { \
203
derr_printf _plist; \
204
dassertp_fail(#_cond,__FILE__,FUNCTION_NAME,__LINE__,1); \
208
#define dassertc(_enable,_cond,_plist,_code) do { \
209
if((_enable) && !(_cond)) { \
210
derr_printf _plist; \
211
dassertp_fail(#_cond,__FILE__,FUNCTION_NAME,__LINE__,_code); \
215
#define dassert(_enable,_cond) dassertp((_enable),(_cond),(""))
218
#define dassert1(_enable,_cond,_ival) \
219
dassertp((_enable),(_cond),("%d: error ival=%d\n", \
220
armci_msg_me(),(int)(_ival)))
222
#define armci_die(_msg,_code) dassertc(1,0, \
223
("%d:%s: %d\n", armci_msg_me(),(_msg),(_code)),_code)
225
#define armci_die2(_msg,_code1,_code2) dassertc(1,0, \
226
("%d:%s: (%d,%d)\n",armci_me,(_msg),(_code1),(_code2)),_code1)
228
/************ locality information **********************************************/
229
typedef int armci_domain_t;
230
#define ARMCI_DOMAIN_SMP 0 /* SMP node domain for armci_domain_XXX calls */
231
extern int armci_domain_nprocs(armci_domain_t domain, int id);
232
extern int armci_domain_id(armci_domain_t domain, int glob_proc_id);
233
extern int armci_domain_glob_proc_id(armci_domain_t domain, int id, int loc_proc_id);
234
extern int armci_domain_my_id(armci_domain_t domain);
235
extern int armci_domain_count(armci_domain_t domain);
236
extern int armci_domain_same_id(armci_domain_t domain, int proc);
240
* On CrayT3E: the default group is the global group which is (char *)NULL
241
* It is the only working group.
242
* On Workstations: the default group is "mp_working_group". User can set
243
* the group name by calling the ARMCI_PVM_init (defined
244
* in message.c) and passing the group name to the library.
247
extern char *mp_group_name;
249
/*********************stuff for non-blocking API******************************/
250
/*\ the request structure for non-blocking api.
252
/*max of sizes for all platforms. Increase if any platform needs more*/
254
int data[4]; /* tag, bufid, agg_flag, op, proc */
258
#define armci_req_t armci_hdl_t
260
typedef int ARMCI_Group;
262
extern void ARMCI_Group_create(int n, int *pid_list, ARMCI_Group *group_out);
263
extern void ARMCI_Group_create_child(int n, int *pid_list,
264
ARMCI_Group *group_out, ARMCI_Group *group_parent);
265
extern void ARMCI_Group_free(ARMCI_Group *group);
266
extern int ARMCI_Group_rank(ARMCI_Group *group, int *rank);
267
extern void ARMCI_Group_size(ARMCI_Group *group, int *size);
268
extern void ARMCI_Group_set_default(ARMCI_Group *group);
269
extern void ARMCI_Group_get_default(ARMCI_Group *group_out);
270
extern void ARMCI_Group_get_world(ARMCI_Group *group_out);
272
extern int ARMCI_Absolute_id(ARMCI_Group *group, int group_rank);
273
extern int ARMCI_Uses_shm_grp(ARMCI_Group *group);
275
extern int ARMCI_Malloc_group(void *ptr_arr[], armci_size_t bytes,ARMCI_Group *group);
276
extern int ARMCI_Free_group(void *ptr, ARMCI_Group *group);
278
extern int ARMCI_NbPut(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle);
280
extern int ARMCI_NbPutS( /* strided put */
281
void *src_ptr, /* pointer to 1st segment at source*/
282
int src_stride_arr[], /* array of strides at source */
283
void* dst_ptr, /* pointer to 1st segment at destination*/
284
int dst_stride_arr[], /* array of strides at destination */
285
int count[], /* number of units at each stride level count[0]=bytes */
286
int stride_levels, /* number of stride levels */
287
int proc, /* remote process(or) ID */
288
armci_hdl_t* nb_handle /*armci_non-blocking request handle*/
291
extern int ARMCI_NbAccS( /* strided accumulate */
292
int optype, /* operation */
293
void *scale, /* scale factor x += scale*y */
294
void *src_ptr, /* pointer to 1st segment at source*/
295
int src_stride_arr[], /* array of strides at source */
296
void* dst_ptr, /* pointer to 1st segment at destination*/
297
int dst_stride_arr[], /* array of strides at destination */
298
int count[], /* number of units at each stride level count[0]=bytes */
299
int stride_levels, /* number of stride levels */
300
int proc, /* remote process(or) ID */
301
armci_hdl_t* nb_handle /*armci_non-blocking request handle*/
304
extern int ARMCI_NbGet(void *src, void* dst, int bytes, int proc,armci_hdl_t* nb_handle);
306
extern int ARMCI_NbGetS( /* strided get */
307
void *src_ptr, /* pointer to 1st segment at source*/
308
int src_stride_arr[], /* array of strides at source */
309
void* dst_ptr, /* pointer to 1st segment at destination*/
310
int dst_stride_arr[], /* array of strides at destination */
311
int count[], /* number of units at each stride level count[0]=bytes */
312
int stride_levels, /* number of stride levels */
313
int proc, /* remote process(or) ID */
314
armci_hdl_t* nb_handler/*armci_non-blocking request handle*/
317
extern int ARMCI_NbGetV( armci_giov_t darr[], /* descriptor array */
318
int len, /* length of descriptor array */
319
int proc, /* remote process(or) ID */
320
armci_hdl_t* nb_handle /*armci_non-blocking request handle*/
323
extern int ARMCI_NbPutV( armci_giov_t darr[], /* descriptor array */
324
int len, /* length of descriptor array */
325
int proc, /* remote process(or) ID */
326
armci_hdl_t* nb_handle /*armci_non-blocking request handle*/
329
extern int ARMCI_NbAccV( int op, /* operation code */
330
void *scale, /* scaling factor for accumulate */
331
armci_giov_t darr[], /* descriptor array */
332
int len, /* length of descriptor array */
333
int proc, /* remote process(or) ID */
334
armci_hdl_t* nb_handle /*armci_non-blocking request handle*/
337
extern int ARMCI_NbPutValueInt(int src, /* value in a register to put */
338
void *dst, /* dest starting addr to put data */
339
int proc, /* remote process (or) ID */
340
armci_hdl_t* nb_handle /*armci_non-blocking
344
extern int ARMCI_NbPutValueLong(long src, /* value in a register to put */
345
void *dst, /* dest starting addr to put data */
346
int proc, /* remote process (or) ID */
347
armci_hdl_t* nb_handle /*armci_non-blocking
351
extern int ARMCI_NbPutValueFloat(float src,/* value in a register to put */
352
void *dst,/* dest starting addr to put data */
353
int proc, /* remote process (or) ID */
354
armci_hdl_t* nb_handle /*armci_non-blocking
358
extern int ARMCI_NbPutValueDouble(double src,/* value in a register to put */
359
void *dst,/* dest starting addr to put data*/
360
int proc, /* remote process (or) ID */
361
armci_hdl_t* nb_handle /*armci_non-blocking
365
extern int ARMCI_Wait(armci_hdl_t* nb_handle); /*non-blocking request handle*/
367
extern int ARMCI_Test(armci_hdl_t* nb_handle); /*non-blocking request handle*/
369
extern int ARMCI_WaitAll (void);
371
extern int ARMCI_WaitProc (int proc);
373
extern void ARMCI_SET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle);
375
extern void ARMCI_UNSET_AGGREGATE_HANDLE(armci_hdl_t* nb_handle);
377
#define ARMCI_INIT_HANDLE(hdl) do {((double *)((hdl)->data))[0]=0; \
378
((double *)((hdl)->data))[1]=0; }while(0)
380
/* -------------- ARMCI Non-collective memory allocator ------------- */
381
typedef struct armci_meminfo_ds {
382
char * armci_addr; /* remote address of the creator which can be
383
used in ARMCI communication */
384
char *addr; /* local address of creator which can be used in
385
to set SMP memoffset, armci_set_mem_offset() */
386
size_t size; /* size of remote pid's segment (bytes) */
387
int cpid; /* armci pid of creator */
391
extern void ARMCI_Memget(size_t bytes, armci_meminfo_t *meminfo, int memflg);
393
extern void* ARMCI_Memat(armci_meminfo_t *meminfo, long offset);
395
extern void ARMCI_Memdt(armci_meminfo_t *meminfo, long offset);
397
extern void ARMCI_Memctl(armci_meminfo_t *meminfo);
399
/* ------------------------------------------------------------------ */
401
#if defined(__cplusplus) || defined(c_plusplus)
405
#endif /* _ARMCI_H */