MPI_Rsend не вызывает ошибку, когда это должно

Страница man для реализации MPI_Rsend в Open MPI гласит, что

Готовая отправка может быть вызвана, только если пользователь может гарантировать, что получение уже опубликовано. Будет ошибкой, если получатель не будет отправлен до вызова готовой отправки.

Я пытаюсь написать небольшую программу, чтобы увидеть, как эта ошибка проявится (я думал, что это будет ошибка во время выполнения с последующим прерыванием), но эта программа работает отлично:

#include <assert.h>
#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>  /* malloc */
#include <unistd.h>  /* sleep */

int main(int argc, char** argv) {
  MPI_Init(NULL, NULL);

  int my_rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  const int ARRAY_SIZE = 100000;

  int* array = (int*)malloc(sizeof(int) * ARRAY_SIZE);
  assert(array != NULL);

  if (my_rank == 0) {
    // Populate array with something.
    for (int i = 0; i < ARRAY_SIZE; ++i) { array[i] = i; }

    int error_val;
    printf("[%d] Called Rsend\n", my_rank);
    error_val = MPI_Rsend(array, ARRAY_SIZE, MPI_INT, 1, 0, MPI_COMM_WORLD);
    printf("[%d] Done with success? %d\n", my_rank, error_val == MPI_SUCCESS);
  }
  else {
    sleep(5);
    MPI_Recv(array, ARRAY_SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    printf("[%d] Last element of array is: %d\n", my_rank,
           array[ARRAY_SIZE -1 ]);
  }

  MPI_Finalize();
  return 0;
}

Выход:

$ mpicc -o mpi_rsend_example mpi_rsend_example.c
$ mpiexec -n 2 ./mpi_rsend_example
[0] Called Rsend
[0] Done with success? 1
[1] Last element of array is: 99999

Не должно быть ошибки, так как MPI_Recv звонок, конечно, происходит после MPI_Rsend вызов? (Я запускаю программу локально, поэтому оба ранга запускаются на моем компьютере).

0 ответов

Другие вопросы по тегам