int personality (kap_config_t *kc, kap_personality_t *p) { char bn[KAP_MAX_STR]; if ( !p || !kc ) return -1; p->rank = kap_commfab_rank (); p->size = kap_commfab_size (); p->iter_count = 0; p->role = k_none; p->handle = _hndl; kap_conf_postinit (kc, p->size); /* * Assume the rank distribution is cyclic * e.g., distributes rank processes to * all of the nodes first before starting to * use the core on the first node again. */ if ( p->rank < kc->nproducers ) { p->role = k_producer; } if ( ((p->size-1) - p->rank) < kc->nconsumers ) { p->role = (p->role != k_producer) ? k_consumer : k_both; } if (kc->sync_type == s_causal) { if ( IS_CONSUMER(p->role) ) { if (flux_event_subscribe (p->handle, KAP_CAUSAL_CONS_EV) < 0) { fprintf (stderr, "Failed: event sub.\n"); goto error; } } } if (kc->iter_consumer > kc->iter_producer) { kc->iter_consumer = kc->iter_producer; fprintf (stderr, "Warning: iter-consumer > than iter-producer.\n"); fprintf (stderr, "Warning: iter-consumer set to iter-producer.\n"); } snprintf (bn, KAP_MAX_STR, "init-hb-%d", (int) kc->instance_num); /* to establish a clean happens-before relationship */ if (flux_barrier (p->handle, bn, kc->total_num_proc ) < 0) { fprintf (stderr, "Initial barrier failed.\n"); goto error; } return 0; error: return -1; }
int main (int argc, char *argv[]) { flux_t h; int ch; struct timespec t0; char *name = NULL; int quiet = 0; int nprocs = 1; int iter = 1; int i; log_init ("tbarrier"); while ((ch = getopt_long (argc, argv, OPTIONS, longopts, NULL)) != -1) { switch (ch) { case 'h': /* --help */ usage (); break; case 'q': /* --quiet */ quiet = 1; break; case 'n': /* --nprocs N */ nprocs = strtoul (optarg, NULL, 10); break; case 't': /* --test-iterations N */ iter = strtoul (optarg, NULL, 10); break; default: usage (); break; } } if (optind < argc - 1) usage (); if (optind < argc) name = argv[optind++]; if (!(h = flux_open (NULL, 0))) err_exit ("flux_open"); for (i = 0; i < iter; i++) { char *tname = NULL; monotime (&t0); if (name) tname = xasprintf ("%s.%d", name, i); if (flux_barrier (h, tname, nprocs) < 0) { if (errno == EINVAL && tname == NULL) msg_exit ("%s", "provide barrier name if not running as LWJ"); else err_exit ("flux_barrier"); } if (!quiet) printf ("barrier name=%s nprocs=%d time=%0.3f ms\n", tname ? tname : "NULL", nprocs, monotime_since (t0)); if (tname) free (tname); } flux_close (h); log_fini (); return 0; }