Это может быть тривиальной вещи, но:размер буфера больше, чем рассчитывать на MPI_SEND
Может размер нижележащего массива будет больше, чем количество аргументов отправить вместе с указателем буфера в (...) вызов MPI_SEND ?
Что касается MPI_Recv (...) Я нашел источники, в которых четко указано, что это законно (то есть буфер больше сообщения).
Плюс, это, кажется, в порядке, когда я скомпилировать и запустить программу ниже
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mpi.h>
int main(int argc, char **argv){
int i;
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
if(world_size != 2) {
printf("You're supposed to use exactly 2 processes, dude!\n");
MPI_Abort(MPI_COMM_WORLD, 0);
}
int *ids = (int*)(malloc(10*sizeof(int)));
if(world_rank == 0) {
for(i=0; i<10; i++)
ids[i]=i+1;
MPI_Send(ids, 5, MPI_INT, 1, 0, MPI_COMM_WORLD);
}else{
for(i=0; i<10; i++)
ids[i]=20-i;
MPI_Recv(ids, 5, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
for(i=0; i<10; i++)
printf("me %d %d %d\n",world_rank,i,ids[i]);
free(ids);
MPI_Finalize();
return 0;
}
, потому что я получаю следующий выход без сообщений об ошибке:
me 0 0 1
me 0 1 2
me 0 2 3
me 0 3 4
me 0 4 5
me 0 5 6
me 0 6 7
me 0 7 8
me 0 8 9
me 0 9 10
me 1 0 1
me 1 1 2
me 1 2 3
me 1 3 4
me 1 4 5
me 1 5 15
me 1 6 14
me 1 7 13
me 1 8 12
me 1 9 11
Но я хотел бы иметь заверение, потому что я все еще новичок ...
Это не только безопасно: это то, что принято делать все время. Например, когда вам нужно отправлять/возвращать данные призраков на границу массива. Или вы отправляете строку 2D-массива. Кроме того, MPI поддерживает отправку/recv разреженных буферов с использованием типов данных MPI - например, отправку столбца 2D-массива. Так что не волнуйтесь - ваш код в порядке. – Sigismondo