int
MPIDO_Reduce_binom(void * sendbuf,
		   void * recvbuf,
		   int count,
		   DCMF_Dt dcmf_dt,
		   DCMF_Op dcmf_op,
		   MPI_Datatype data_type,
		   int root,
		   MPID_Comm * comm)
{
  int rc, hw_root = comm->vcr[root];
  DCMF_CollectiveRequest_t request;
  volatile unsigned active = 1;
  DCMF_Callback_t callback = { reduce_cb_done, (void *) &active };
  DCMF_Geometry_t * geometry = &(comm->dcmf.geometry);

  rc = DCMF_Reduce(&MPIDI_CollectiveProtocols.binomial_reduce,
                   &request,
                   callback,
                   DCMF_MATCH_CONSISTENCY,
                   geometry,
                   hw_root,
                   sendbuf,
                   recvbuf,
                   count,
                   dcmf_dt,
                   dcmf_op);

  MPID_PROGRESS_WAIT_WHILE(active);
  return rc;
}
Exemple #2
0
int main()
{

    int i, rank, nranks, msgsize, status, expected;
    long bufsize;
    int *src_buffer;
    int *trg_buffer;
    unsigned *ranks;
    DCMF_CollectiveProtocol_t barrier_protocol, lbarrier_protocol;
    DCMF_CollectiveProtocol_t reduce_protocol;
    DCMF_Barrier_Configuration_t barrier_conf;
    DCMF_Reduce_Configuration_t reduce_conf;
    DCMF_CollectiveRequest_t crequest, crequest1, crequest2;
    DCMF_Callback_t done_callback;
    volatile unsigned reduce_active = 0;

    DCMF_Messager_initialize();

    DCMF_Collective_initialize();

    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;
    status = DCMF_Barrier_register(&barrier_protocol, &barrier_conf);

    barrier_conf.protocol = DCMF_LOCKBOX_BARRIER_PROTOCOL;
    barrier_conf.cb_geometry = getGeometry;
    status = DCMF_Barrier_register(&lbarrier_protocol, &barrier_conf);

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

    reduce_conf.protocol = DCMF_TREE_REDUCE_PROTOCOL;
    reduce_conf.cb_geometry = getGeometry;
    reduce_conf.reuse_storage = 1;
    status = DCMF_Reduce_register(&reduce_protocol, &reduce_conf);
    if (status != DCMF_SUCCESS)
    {
        printf("DCMF_Reduce_register returned with error %d \n", status);
        exit(-1);
    }

    if (!DCMF_Geometry_analyze(&geometry, &reduce_protocol))
    {
        printf("Not a supported geometry!! \n");
        fflush(stdout);
        return -1;
    }

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

    if (rank == 0)
    {
        printf("DCMF_Reduce 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;
        }

        reduce_active += 1;

        /*sum reduce operation*/
        status = DCMF_Reduce(&reduce_protocol,
                             &crequest1,
                             done_callback,
                             DCMF_SEQUENTIAL_CONSISTENCY,
                             &geometry,
                             0,
                             (char *) src_buffer,
                             (char *) trg_buffer,
                             msgsize / sizeof(int),
                             DCMF_SIGNED_INT,
                             DCMF_SUM);

        while (reduce_active > 0)
            DCMF_Messager_advance();

        if (rank == 0)
        {
            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 reduce successful \n", rank, msgsize);
        fflush(stdout);

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

        reduce_active += 1;

        /*sum reduce operation*/
        status = DCMF_Reduce(&reduce_protocol,
                             &crequest2,
                             done_callback,
                             DCMF_SEQUENTIAL_CONSISTENCY,
                             &geometry,
                             0,
                             (char *) src_buffer,
                             (char *) trg_buffer,
                             msgsize / sizeof(int),
                             DCMF_SIGNED_INT,
                             DCMF_SUM);

        while (reduce_active > 0)
            DCMF_Messager_advance();

        if (rank == 0)
        {
            expected = 4;
            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 (2) reduce successful\n", rank, msgsize);
        fflush(stdout);

    }

    free(src_buffer);
    free(trg_buffer);
    DCMF_Messager_finalize();

    return 0;
}