2015-10-24 65 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開始。這可能觸發未定義的行爲(奇怪的值,分段錯誤或者甚至是正確的結果!)。
  • 由於在for(i=0; i<n; i++)中調用了MPI_Send(),因此進程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()來爲陣列分配內存來避免:這部分留給你!