#include "mpi.h" extern int MPE_MUTEX_KEYVAL; int MPE_Mutex_release(MPI_Win mutex_win, int num) { int mone = -1; int lrank, flag, size, *attrval; MPI_Aint lidx; /* Compute the location of the counter */ MPI_Win_get_attr(mutex_win, MPE_MUTEX_KEYVAL, &attrval, &flag); if (!flag) return -1; /* Error: counterWin setup */ size = (int)(MPI_Aint)attrval; /* We stored the integer as a pointer */ lrank = num % size; lidx = num / size; MPI_Win_lock(MPI_LOCK_SHARED, lrank, 0, mutex_win); MPI_Accumulate(&mone, 1, MPI_INT, lrank, lidx, 1, MPI_INT, MPI_SUM, mutex_win); MPI_Win_unlock(lrank, mutex_win); return 0; }