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; }
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; }