JNIEXPORT void JNICALL Java_mpi_Win_detach( JNIEnv *env, jobject jthis, jlong win, jobject jBase) { void *base = (*env)->GetDirectBufferAddress(env, jBase); int rc = MPI_Win_detach((MPI_Win)win, base); ompi_java_exceptionCheck(env, rc); }
int main(int argc, char **argv) { int i, rank, nproc; int errors = 0, all_errors = 0; int val = 0, one = 1; int iter; MPI_Aint *val_ptrs; MPI_Win dyn_win; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nproc); iter = ITER_PER_RANK * nproc; val_ptrs = malloc(nproc * sizeof(MPI_Aint)); MPI_Get_address(&val, &val_ptrs[rank]); MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, val_ptrs, 1, MPI_AINT, MPI_COMM_WORLD); MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &dyn_win); MPI_Win_attach(dyn_win, &val, sizeof(int)); for (i = 0; i < iter; i++) { MPI_Win_fence(MPI_MODE_NOPRECEDE, dyn_win); MPI_Accumulate(&one, 1, MPI_INT, i % nproc, val_ptrs[i % nproc], 1, MPI_INT, MPI_SUM, dyn_win); MPI_Win_fence(MPI_MODE_NOSUCCEED, dyn_win); } MPI_Barrier(MPI_COMM_WORLD); /* Read and verify my data */ if (val != iter) { errors++; printf("%d -- Got %d, expected %d\n", rank, val, iter); } MPI_Win_detach(dyn_win, &val); MPI_Win_free(&dyn_win); MPI_Reduce(&errors, &all_errors, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (rank == 0 && all_errors == 0) printf(" No Errors\n"); free(val_ptrs); MPI_Finalize(); return 0; }
void _XMP_mpi_coarray_detach(_XMP_coarray_t *coarray_desc, const bool is_acc) { if(_XMP_flag_multi_win){ MPI_Win win = is_acc? coarray_desc->win_acc : coarray_desc->win; MPI_Win_unlock_all(win); _XMP_barrier_EXEC(); _XMP_mpi_onesided_destroy_win(&win); }else{ MPI_Win win = _xmp_mpi_distarray_win; void *real_addr = coarray_desc->real_addr; #ifdef _XMP_XACC if(is_acc){ win = _xmp_mpi_distarray_win_acc; real_addr = coarray_desc->real_addr_dev; } #endif MPI_Win_detach(win, real_addr); } if(is_acc){ #ifdef _XMP_XACC _XMP_free(coarray_desc->addr_dev); //FIXME may be wrong coarray_desc->addr_dev = NULL; coarray_desc->real_addr_dev = NULL; coarray_desc->win_acc = MPI_WIN_NULL; coarray_desc->nodes = NULL; #endif }else{ _XMP_free(coarray_desc->addr); coarray_desc->addr = NULL; coarray_desc->real_addr = NULL; coarray_desc->win = MPI_WIN_NULL; coarray_desc->nodes = NULL; } }
int main(int argc, char **argv) { int rank, nproc; int errs = 0; int array[1024]; int val = 0; int target_rank; MPI_Aint bases[2]; MPI_Aint disp, offset; MPI_Win win; MTest_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &nproc); if (rank == 0 && nproc != 2) { MTestError("Must run with 2 ranks\n"); } /* Get the base address in the middle of the array */ if (rank == 0) { target_rank = 1; array[0] = 1234; MPI_Get_address(&array[512], &bases[0]); } else if (rank == 1) { target_rank = 0; array[1023] = 1234; MPI_Get_address(&array[512], &bases[1]); } /* Exchange bases */ MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, bases, 1, MPI_AINT, MPI_COMM_WORLD); MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &win); MPI_Win_attach(win, array, sizeof(int)*1024); /* Do MPI_Aint addressing arithmetic */ if (rank == 0) { disp = sizeof(int)*511; offset = MPIX_Aint_add(bases[1], disp); /* offset points to array[1023]*/ } else if (rank == 1) { disp = sizeof(int)*512; offset = MPIX_Aint_diff(bases[0], disp); /* offset points to array[0] */ } /* Get val and verify it */ MPI_Win_fence(MPI_MODE_NOPRECEDE, win); MPI_Get(&val, 1, MPI_INT, target_rank, offset, 1, MPI_INT, win); MPI_Win_fence(MPI_MODE_NOSUCCEED, win); if (val != 1234) { errs++; printf("%d -- Got %d, expected 1234\n", rank, val); } MPI_Win_detach(win, array); MPI_Win_free(&win); MTest_Finalize(errs); MPI_Finalize(); return 0; }