예제 #1
0
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;
}
예제 #2
0
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;
}