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
вызов? (Я запускаю программу локально, поэтому оба ранга запускаются на моем компьютере).