1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
/* $Source: bitbucket.org:berkeleylab/gasnet.git/tests/testhello.c $
* Description: GASNet "Hello, World" test/example
* Copyright 2010, The Regents of the University of California
* Terms of use are as specified in license.txt
*/
#include <gasnetex.h>
#include <stdio.h>
/* Macro to check return codes and terminate with useful message. */
#define GASNET_SAFE(fncall) do { \
int _retval; \
if ((_retval = fncall) != GASNET_OK) { \
fprintf(stderr, "ERROR calling: %s\n" \
" at: %s:%i\n" \
" error: %s (%s)\n", \
#fncall, __FILE__, __LINE__, \
gasnet_ErrorName(_retval), gasnet_ErrorDesc(_retval)); \
fflush(stderr); \
gasnet_exit(_retval); \
} \
} while(0)
int main(int argc, char **argv)
{
gex_Rank_t rank, size;
size_t segsz = GASNET_PAGESIZE;
int argi;
gex_Client_t myclient;
gex_EP_t myep;
gex_TM_t myteam;
gex_Segment_t mysegment;
GASNET_SAFE(gex_Client_Init(&myclient, &myep, &myteam, "testhello", &argc, &argv, 0));
rank = gex_TM_QueryRank(myteam);
size = gex_TM_QuerySize(myteam);
argi = 1;
if (argi < argc) {
if (!strcmp(argv[argi], "-m")) {
segsz = gasnet_getMaxLocalSegmentSize();
} else {
size_t tmp = atol(argv[argi]);
if (tmp) segsz = tmp;
}
++argi;
}
GASNET_SAFE(gex_Segment_Attach(&mysegment, myteam, segsz));
/* Only first and last print here, to keep managable I/O volume at scale */
if (!rank || (rank == size-1))
printf("Hello from node %d of %d\n", (int)rank, (int)size);
/* Spec says client should include a barrier before gasnet_exit() */
gasnet_barrier_notify(0,GASNET_BARRIERFLAG_ANONYMOUS);
gasnet_barrier_wait(0,GASNET_BARRIERFLAG_ANONYMOUS);
gasnet_exit(0);
/* Not reached in most implementations */
return 0;
}
|