Esempio n. 1
0
int gasnete_coll_bcast_set_proto(gasnet_team_handle_t team,
                                 gasnete_dcmf_bcast_kind_t kind)
{
    gasnete_coll_team_dcmf_t *dcmf_tp;

    gasneti_assert(team != NULL);
    dcmf_tp = (gasnete_coll_team_dcmf_t *)team->dcmf_tp;
    gasneti_assert(dcmf_tp != NULL);

    if (kind < G_DCMF_BCAST_PROTO_NUM
            && DCMF_Geometry_analyze(&dcmf_tp->geometry, &gasnete_dcmf_bcast_proto[kind])
            && gasnete_dcmf_bcast_enabled[kind])
    {
        dcmf_tp->bcast_proto = &gasnete_dcmf_bcast_proto[kind];
        return 0; /* SUCCESS */
    }
    return 1; /* FAILED */
}
Esempio n. 2
0
int main()
{

    int i, rank, nranks, msgsize, status, expected;
    long bufsize;
    int *src_buffer;
    int *trg_buffer;
    unsigned *ranks;
    DCMF_Result dcmf_result;
    DCMF_CollectiveProtocol_t barrier_protocol, lbarrier_protocol;
    DCMF_CollectiveProtocol_t allreduce_protocol, allreduce_notree_protocol;
    DCMF_Barrier_Configuration_t barrier_conf;
    DCMF_Allreduce_Configuration_t allreduce_conf;
    DCMF_CollectiveRequest_t crequest, crequest1, crequest2;
    DCMF_Callback_t done_callback;
    volatile unsigned allreduce_active = 0;

    DCMF_Messager_initialize();

    dcmf_result = DCMF_Collective_initialize();
    assert(dcmf_result == DCMF_SUCCESS);

    rank = DCMF_Messager_rank();
    nranks = DCMF_Messager_size();

    ranks = (unsigned *) malloc(nranks * sizeof(int));
    for(i=0; i<nranks; i++) ranks[i] = i;

    bufsize = MAX_MSG_SIZE;
    src_buffer = (int *) malloc(bufsize);
    trg_buffer = (int *) malloc(bufsize);

    barrier_conf.protocol = DCMF_GI_BARRIER_PROTOCOL;
    barrier_conf.cb_geometry = getGeometry; 
    dcmf_result = DCMF_Barrier_register(&barrier_protocol, &barrier_conf);
    assert(dcmf_result == DCMF_SUCCESS);

    barrier_conf.protocol = DCMF_LOCKBOX_BARRIER_PROTOCOL;
    barrier_conf.cb_geometry = getGeometry;
    dcmf_result = DCMF_Barrier_register(&lbarrier_protocol, &barrier_conf);
    assert(dcmf_result == DCMF_SUCCESS);

    DCMF_CollectiveProtocol_t  *barrier_ptr, *lbarrier_ptr;
    barrier_ptr = &barrier_protocol;
    lbarrier_ptr  = &lbarrier_protocol;
    dcmf_result = DCMF_Geometry_initialize(&geometry,
                                           0,
                                           ranks,
                                           nranks,
                                           &barrier_ptr,
                                           1,
                                           &lbarrier_ptr,
                                           1,
                                           &crequest,
                                           0,
                                           1);
    assert(dcmf_result == DCMF_SUCCESS);

    allreduce_conf.protocol = DCMF_TREE_ALLREDUCE_PROTOCOL;
    allreduce_conf.cb_geometry = getGeometry;
    allreduce_conf.reuse_storage = 1;
    dcmf_result = DCMF_Allreduce_register(&allreduce_protocol, &allreduce_conf);
    assert(dcmf_result == DCMF_SUCCESS);

    allreduce_conf.protocol = DCMF_TORUS_BINOMIAL_ALLREDUCE_PROTOCOL;
    allreduce_conf.cb_geometry = getGeometry;
    allreduce_conf.reuse_storage = 1;
    dcmf_result = DCMF_Allreduce_register(&allreduce_notree_protocol, &allreduce_conf);
    assert(dcmf_result == DCMF_SUCCESS);

    status = DCMF_Geometry_analyze(&geometry, &allreduce_protocol);
    assert(status == 1);

    status = DCMF_Geometry_analyze(&geometry, &allreduce_notree_protocol);
    assert(status == 1);

    done_callback.function = done;
    done_callback.clientdata = (void *) &allreduce_active;

    if (rank == 0)
    {
        printf("DCMF_Allreduce Test\n");
        fflush(stdout);
    }

    for (msgsize = sizeof(int); msgsize < MAX_MSG_SIZE; msgsize *= 2)
    {
        /*initializing buffer*/
        for (i = 0; i < bufsize/sizeof(int); i++)
        {
            src_buffer[i] = rank;
            trg_buffer[i] = 0;
        }

        allreduce_active += 1;

        /*sum reduce operation*/
        dcmf_result = DCMF_Allreduce(&allreduce_protocol,
                                     &crequest1,
                                     done_callback,
                                     DCMF_SEQUENTIAL_CONSISTENCY,
                                     &geometry,
                                     (char *) src_buffer,
                                     (char *) trg_buffer,
                                     msgsize/sizeof(int),
                                     DCMF_SIGNED_INT,
                                     DCMF_SUM);
        assert(dcmf_result == DCMF_SUCCESS);

        while(allreduce_active > 0) DCMF_Messager_advance();

        expected = (nranks-1)*(nranks)/2;
        for (i = 0; i < msgsize/sizeof(int); i++)
        {
            if(trg_buffer[i] - expected != 0)
            {
                printf("[%d] Validation has failed Expected: %d, Actual: %d, i: %d \n",
                       rank, expected, trg_buffer[i], i);
                fflush(stdout);
                exit(-1);
            }
        }

        printf("[%d] %d message sum allreduce successful \n", rank, msgsize);
        fflush(stdout);

        for (i = 0; i < bufsize/sizeof(int); i++)
        {
            src_buffer[i] = 1;
            trg_buffer[i] = 0;
        }

        allreduce_active += 1;

        /*sum reduce operation*/
        dcmf_result = DCMF_Allreduce(&allreduce_notree_protocol,
                                     &crequest2,
                                     done_callback,
                                     DCMF_SEQUENTIAL_CONSISTENCY,
                                     &geometry,
                                     (char *) src_buffer,
                                     (char *) trg_buffer,
                                     msgsize/sizeof(int),
                                     DCMF_SIGNED_INT,
                                     DCMF_PROD);
        assert(dcmf_result == DCMF_SUCCESS);

        while(allreduce_active > 0) DCMF_Messager_advance();

        expected = 1;
        for (i = 0; i < msgsize/sizeof(int); i++)
        {
            if(trg_buffer[i] - expected != 0)
            {
                printf("[%d] Validation has failed Expected: %d, Actual: %d, i: %d \n",
                       rank, expected, trg_buffer[i], i);
                fflush(stdout);
                exit(-1);
            }
        }
        printf("[%d] %d message product allreduce successful\n", rank, msgsize);
        fflush(stdout);
    }

    free(src_buffer);
    free(trg_buffer);

    DCMF_Messager_finalize();

    return 0;
}