- 
                Notifications
    
You must be signed in to change notification settings  - Fork 929
 
Open
Description
This issue was initially reported on Stack Overflow at https://stackoverflow.com/questions/79258925/openmpi5-partitioned-communication-with-multiple-neighbors
With the main branch, the following program running on 3 MPI tasks hang:
#include <mpi.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[]) {
  MPI_Init(&argc, &argv);
  int rank, size;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  if (size != 3) {
    if (rank == 0)
      printf("Need 3 workers, you have %d\n", size);
    return -1;
  }
/*
 *   Topology
 *     0 <-> 1 <-> 2
 *     */
  const int partitions = 1;
  const int count = 16;
  int buffer[partitions * count];
  MPI_Request request[2];
  memset(buffer, 0, sizeof(int) * partitions * count);
  if (rank == 1) {
    for (int i = 0; i < partitions * count; i++) {
      buffer[i] = i;
    }
  }
  int nor = 0;
  if (rank == 0) {
    MPI_Precv_init(buffer, partitions, count, MPI_INT, 1, 0, MPI_COMM_WORLD, MPI_INFO_NULL, &request[nor++]);
  } else if (rank == 1) {
    MPI_Psend_init(buffer, partitions, count, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_INFO_NULL, &request[nor++]);
    MPI_Psend_init(buffer, partitions, count, MPI_INT, 2, 0, MPI_COMM_WORLD, MPI_INFO_NULL, &request[nor++]);
  } else if (rank == 2) {
    MPI_Precv_init(buffer, partitions, count, MPI_INT, 1, 0, MPI_COMM_WORLD, MPI_INFO_NULL, &request[nor++]);
  }
  MPI_Startall(nor, request);
  if (rank == 1) {
    MPI_Pready(0, request[0]);
    MPI_Pready(0, request[1]);
  }
  MPI_Waitall(nor, request, MPI_STATUS_IGNORE);
  MPI_Barrier(MPI_COMM_WORLD);
  for (int i = 0; i < nor; i++) {
    MPI_Request_free(request + i);
  }
  MPI_Finalize();
  return 0;
}Metadata
Metadata
Assignees
Labels
No labels