void DDI_ARMCI_Memory_init(size_t size) { int code; const DDI_Comm *comm = (const DDI_Comm *) Comm_find(DDI_COMM_WORLD); // malloc ARMCI memory code = ARMCI_Malloc((void*)gv(armci_mem_addr),size); if (code > 0) { ARMCI_Error("ARMCI_Malloc failed",code); Fatal_error(911); } gv(dda_index) = (DDA_Index*)gv(armci_mem_addr)[comm->me]; // malloc ARMCI counter block and set addresses code = ARMCI_Malloc((void*)gv(armci_cnt_addr),sizeof(armci_counter_t)*2); if (code > 0) { ARMCI_Error("ARMCI_Malloc failed",code); Fatal_error(911); } ARMCI_PutValueLong(0, (void*)(gv(armci_cnt_addr)[comm->me]+0), comm->me); ARMCI_PutValueLong(0, (void*)(gv(armci_cnt_addr)[comm->me]+1), comm->me); DDI_ARMCI_DLB_addr(); DDI_ARMCI_GDLB_addr(); // create mutexes code = ARMCI_Create_mutexes(MAX_DD_ARRAYS+1); if (code > 0) { ARMCI_Error("ARMCI_Create_mutexes failed",code); Fatal_error(911); } gv(dlb_access) = MAX_DD_ARRAYS; }
int main(int argc, char ** argv) { int rank, nproc, val, i; void **base_ptrs; MPI_Init(&argc, &argv); ARMCI_Init(); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nproc); if (rank == 0) printf("Starting ARMCI mutex read-modify-write test with %d processes\n", nproc); base_ptrs = malloc(nproc*sizeof(void*)); ARMCI_Create_mutexes(rank == 0 ? 1 : 0); ARMCI_Malloc(base_ptrs, (rank == 0) ? sizeof(int) : 0); // Proc 0 has a shared int if (rank == 0) { val = 0; ARMCI_Put(&val, base_ptrs[0], sizeof(int), 0); } ARMCI_Barrier(); for (i = 0; i < NITER; i++) { ARMCI_Lock(0, 0); ARMCI_Get(base_ptrs[0], &val, sizeof(int), 0); val += ADDIN; ARMCI_Put(&val, base_ptrs[0], sizeof(int), 0); ARMCI_Unlock(0, 0); } printf(" + %3d done\n", rank); fflush(NULL); ARMCI_Barrier(); if (rank == 0) { ARMCI_Get(base_ptrs[0], &val, sizeof(int), 0); if (val == ADDIN*nproc*NITER) printf("Test complete: PASS.\n"); else printf("Test complete: FAIL. Got %d, expected %d.\n", val, ADDIN*nproc*NITER); } ARMCI_Free(base_ptrs[rank]); ARMCI_Destroy_mutexes(); free(base_ptrs); ARMCI_Finalize(); MPI_Finalize(); return 0; }
/** @see ddi_armci.h */ void DDI_ARMCI_Memory_init(size_t size) { int code; const DDI_Comm *comm = (const DDI_Comm *) Comm_find(DDI_COMM_WORLD); code = ARMCI_Malloc(gv(armci_mem_addr), size); if (code != 0) { fprintf(DDI_STDERR, "%s: ARMCI_Malloc(%p, %z) returned %i\n", DDI_Id(), gv(armci_mem_addr), size, code); DDI_Error(DDI_ARMCI_MEMORY_INIT_ERROR, DDI_ARMCI_MEMORY_INIT_ERROR_MESSAGE); } gv(dda_index) = (DDA_Index*)gv(armci_mem_addr)[comm->me]; code = ARMCI_Create_mutexes(MAX_DD_ARRAYS); if (code != 0) { fprintf(DDI_STDERR, "%s: ARMCI_Create_mutexes(%d) returned %i\n", DDI_Id(), MAX_DD_ARRAYS, code); DDI_Error(DDI_ARMCI_MEMORY_INIT_ERROR, DDI_ARMCI_MEMORY_INIT_ERROR_MESSAGE); } }