diff --git a/src/adp/adp.c b/src/adp/adp.c index 13f1c47675f2e6e521ea32123cc7e0f5158a5a90..962aaba50bb8150f0727f647748463fc849f66ab 100644 --- a/src/adp/adp.c +++ b/src/adp/adp.c @@ -737,9 +737,12 @@ clusters_t Heuristic1(global_context_t *ctx) MPI_Win_create(to_remove_mask, n * sizeof(heap_node), 1, MPI_INFO_NULL, ctx -> mpi_communicator, &win_to_remove_mask); MPI_Win_fence(0, win_to_remove_mask); - MPI_Win win_locks; - MPI_Win_create(lock_array, n * sizeof(lock_t), sizeof(lock_t), MPI_INFO_NULL, ctx -> mpi_communicator, &win_locks); - MPI_Win_fence(0, win_locks); + //MPI_Win win_locks; + //MPI_Win_create(lock_array, n * sizeof(lock_t), sizeof(lock_t), MPI_INFO_NULL, ctx -> mpi_communicator, &win_locks); + //MPI_Win_fence(0, win_locks); + + //MPI_Win_lock_all(MPI_LOCK_SHARED, win_to_remove_mask); + //MPI_Win_lock_all(MPI_LOCK_SHARED, win_locks); @@ -765,33 +768,39 @@ clusters_t Heuristic1(global_context_t *ctx) * use an array of locks, and compare and swap to actually gain control of the thing * * */ - int owner = foreign_owner(ctx, jidx); - idx_t jpos = jidx - ctx -> rank_idx_start[owner]; + /* + #pragma omp critical + { - lock_t state = LOCK_FREE; + int owner = foreign_owner(ctx, jidx); + idx_t jpos = jidx - ctx -> rank_idx_start[owner]; - state = h1_lock_acquire(ctx, win_locks, owner, jpos, state); + lock_t state = LOCK_FREE; - heap_node mask_element; - MPI_Request request; - MPI_Rget(&mask_element, sizeof(heap_node), MPI_BYTE, - owner, jpos * sizeof(heap_node), sizeof(heap_node), MPI_BYTE, win_to_remove_mask, &request); - MPI_Wait(&request, MPI_STATUS_IGNORE); + //state = h1_lock_acquire(ctx, win_locks, owner, jpos, state); - int flag = mask_element.array_idx == MY_SIZE_MAX; - if(flag || i_point.g > mask_element.value ) - { - heap_node tmp_mask_element = {.array_idx = i_point.array_idx, .value = i_point.g}; + heap_node mask_element; MPI_Request request; - MPI_Rput(&tmp_mask_element, sizeof(heap_node), MPI_BYTE, owner, - jpos*sizeof(heap_node), sizeof(heap_node), MPI_BYTE, win_to_remove_mask, &request); + + MPI_Rget(&mask_element, sizeof(heap_node), MPI_BYTE, + owner, jpos * sizeof(heap_node), sizeof(heap_node), MPI_BYTE, win_to_remove_mask, &request); MPI_Wait(&request, MPI_STATUS_IGNORE); - } + int flag = mask_element.array_idx == MY_SIZE_MAX; + if(flag || i_point.g > mask_element.value ) + { + heap_node tmp_mask_element = {.array_idx = i_point.array_idx, .value = i_point.g}; + MPI_Request request; + MPI_Rput(&tmp_mask_element, sizeof(heap_node), MPI_BYTE, owner, + jpos*sizeof(heap_node), sizeof(heap_node), MPI_BYTE, win_to_remove_mask, &request); + MPI_Wait(&request, MPI_STATUS_IGNORE); - state = h1_lock_free(ctx, win_locks, owner, jpos, state); + } + + //state = h1_lock_free(ctx, win_locks, owner, jpos, state); + } + */ - /* #pragma omp critical (h1_centers_elimination) { int owner = foreign_owner(ctx, jidx); @@ -817,13 +826,12 @@ clusters_t Heuristic1(global_context_t *ctx) MPI_Win_unlock(owner, win_to_remove_mask); } - */ } } } MPI_Win_fence(0, win_to_remove_mask); - MPI_Win_fence(0, win_locks); + //MPI_Win_fence(0, win_locks); MPI_Barrier(ctx -> mpi_communicator); /* populate the usual arrays */ @@ -873,7 +881,7 @@ clusters_t Heuristic1(global_context_t *ctx) MPI_Win_free(&win_to_remove_mask); free(to_remove_mask); - MPI_Win_free(&win_locks); + //MPI_Win_free(&win_locks); free(lock_array); int n_centers = (int)actual_centers.count;