Я пытаюсь использовать MPI_Sendrecv
для обмена данными между процессами, но попадаю в логику отправки и получения.
Предположим, что у нас есть четыре процесса, и у каждого из них есть 2 одномерных массива размером 4: Params
и Params_
. Записи Params
будут инициализированы как rank * 4 + i
(например, в ранге процесса 0, Params = {0,1,2,3}
), тогда как Params_
используется для хранения Params
, отправленного другими процессами. Каждый процесс собирается отправить свой params
другим и получить params
от других. Код выглядит следующим образом.
#include<mpi.h>
#include<stdio.h>
int main(int argc, char **argv){
int my_rank, ncpus;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &ncpus);
double *params;
double *params_;
int Nparams = 4;
params = new double[Nparams];
params_ = new double[Nparams];
// Initialize params and print it
printf("ID %d: ", my_rank);
for (int i = 0; i < Nparams; i++) {
params[i] = my_rank * ncpus + i;
printf("%g ", params[i]);
}
printf("\n");
// Receive params from the other processes, store it in params_, and print it
for (int i = 0; i < ncpus; i++) {
MPI_Sendrecv(params, Nparams, MPI_DOUBLE, i, 0, params_, Nparams, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &status);
printf("Receive params from %d: ", i);
for (int i = 0; i < Nparams; i++)
printf("%g ", params_[i]);
printf("\n");
}
delete[] params;
delete[] params_;
MPI_Finalize();
return 0;
}
Вывод кода ничего не показывает (даже не может распечатать Params
), и есть много предупреждений, таких как WARNING: There was an error initializing an OpenFabrics device
. Не могли бы вы помочь мне понять, почему это не работает и что я должен делать. Большое спасибо!