Чтобы получить минимальный пример, компилировать, я добавил недостающий аргумент MPI_Recv()
:
MPI_Status status;
MPI_Recv(recvdata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,&status);
Я также доработанную senddata[0] = dizi[];
к senddata[0] = dizi[i];
- Как я пытался скомпилировать код при условии, я получил предупреждение:
формат «% d» ожидает аргумент типа «Int», но аргумент 2 имеет тип «INT *
Функция scanf()
нужен указатель на данные, чтобы изменить его, так int a;scanf("%d",&a);
правильно. Но printf()
просто нужны данные, так как он не будет изменять его: int a;printf("%d",a);
- это правильный путь.
- Если вы хотите, чтобы массив, который будет заполнен, используйте
scanf("%d", &dizi[i]);
, не scanf("%d", &dizi[n]);
. n
- длина массива dizi
. Следовательно, индекс n
вышел из массива, так как индексы массивов начинаются с 0. Это может вызвать неопределенное поведение (странные значения, ошибка сегментации или даже правильный результат!).
- С
MPI_Send()
вызывается в for(i=0; i<n; i++)
, процесс 0 пытается отправить n
сообщений для обработки 1. Но процесс 1 получает только один. Следовательно, процесс 0 будет заблокирован при i = 1, ожидая, что процесс 1 получит второе сообщение. Это тупик.
Я предполагаю, что вы пытаетесь отправить массив из процесса 0 в процесс 1. Следующий код, основанный на вашем, должен делать трюк. Фактическая длина массива n_arr
:
#include <stdio.h>
#include <mpi.h>
#include <stdlib.h>
#define n 100
int main(int argc, char *argv[]){
int my_rank, size_cm;
int n_arr;
int i;
int dizi[n];
// double senddata[n];
// double recvdata[n];
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &size_cm);
if(my_rank == 0){
// fflush(stdout); because the standard output is buffered...
printf("[%d]: Enter the size of array: ",my_rank);fflush(stdout);
if(scanf("%d",&n_arr)!=1){fprintf(stderr,"input error\n");exit(1);}
if(n_arr>100){
fprintf(stderr,"The size of the array is too large\n");exit(1);
}
printf("[%d]: Enter the elements of array",my_rank);fflush(stdout);
for(i=0; i<n_arr; i++){
if(scanf("%d", &dizi[i])!=1){fprintf(stderr,"input error\n");exit(1);}
}
//sending the length of the array
MPI_Send(&n_arr, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
//senfing the array
MPI_Send(dizi, n_arr, MPI_INT, 1, 0, MPI_COMM_WORLD);
}
if(my_rank == 1){
// receiving the length of the array
MPI_Recv(&n_arr, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,&status);
//receiving the array
MPI_Recv(dizi, n_arr, MPI_INT, 0, 0, MPI_COMM_WORLD,&status);
printf("[%d]: The array of size %d is: ",my_rank,n_arr);
for(i=0; i<n_arr; i++){
printf("%d ",dizi[i]);
}
printf("\n");
}
MPI_Finalize();
return 0;
}
Она составлена, запустив mpicc main.c -o main
и побежал mpirun -np 2 main
Я добавил некоторые вещи, чтобы проверить, если вход правильно (всегда хорошая вещь) и обрабатывать случай n_arr
больше n = 100. Последнее можно было бы избежать, используя malloc()
для выделения памяти для массива: эта часть оставлена вам!
Что вы просите? Из того, что вы опубликовали, все выглядит так, как будто оно работает правильно. Пожалуйста, отредактируйте свой пост. –
Я попытался правильно отложить свой код, '' 'отсутствует до' if (my_rank == 1) '. И аргумент отсутствует для 'MPI_Recv' –