2015-10-24 2 views
0

Я хочу написать код, который: Процессор P0 получает массив с клавиатуры и отправляет этот массив в процессор P1. Процессор P1 выводит все значения на экран. Например:Связь между двумя процессорами (параллельное программирование)

[P0]: Enter the size of array: 1 
[P0]: Enter the elements of array: 3 
[P1]: The array is: 3 
[P0]: Enter the size of array: 3 
[P0]: Enter the elements of array: 5 7 5 
[P1]: The array is: 5 7 5 
. 
. 
. 

и вот моя первая работа. Думаю, слишком много ошибок. Но я новичок. Хотите узнать, как кодировать.

#include <stdio.h> 
#include <mpi.h> 

#define n 100 

int main(int argc, char *argv[]){ 
    int my_rank, size_cm; 
    int value, i; 
    int dizi[n]; 
    double senddata[n]; 
    double recvdata[n]; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size_cm); 

    value=0; 

    if(my_rank == 0){ 
     printf("[%d]: Enter the size of array: ",&my_rank); 
     scanf("%d",value); 
     printf("[%d]: Enter the elements of array",&my_rank); 
     for(i=0; i<n; i++){ 
      scanf("%d", &dizi[n]); 
      senddata[0] = dizi[]; 
      MPI_Send(senddata, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 
     } 
    } 
    if(my_rank == 1){ 
     MPI_Recv(recvdata, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,  
     printf("[%d]: The array is: %d ",&my_rank, dizi[n]); 
    } 
    MPI_Finalize(); 
    return 0; 
} 
+1

Что вы просите? Из того, что вы опубликовали, все выглядит так, как будто оно работает правильно. Пожалуйста, отредактируйте свой пост. –

+1

Я попытался правильно отложить свой код, '' 'отсутствует до' if (my_rank == 1) '. И аргумент отсутствует для 'MPI_Recv' –

ответ

0

Чтобы получить минимальный пример, компилировать, я добавил недостающий аргумент 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() для выделения памяти для массива: эта часть оставлена ​​вам!

Смежные вопросы