2012-10-03 227 views
1

我需要在我的Matrix Multiplication程序中使用MPI_Gather功能,但在過去的幾天裏面臨着麻煩。MPI_Gather似乎不工作

因此,我僅使用收集功能,並已試圖讓它跑......爲此,我提到這本書的前言由彼得·帕切科到並行編程「寫了一個簡單的MPI程序。

程序直接退出,給我絕對沒有任何結果或錯誤......我一直沒能找出錯誤至今。

/******************NOTE********************** 

     The program simply uses the MPI_Gather() function. 
     The program is exiting directly. 
     I have written it for only TWO processes. 
     (-np 2) 

    ******************************************/ 

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

    int main() 
    { 
    int i,j,proc,rank; 
    double d[4]; 
    double local_a[2]; 


    MPI_Init(NULL,NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &proc); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if(rank==0) 
    { 

     local_a[0]=1.0; 
     local_a[1]=2.0; 
    } 

    else 
    { 
     local_a[0]=3.0; 
     local_a[1]=4.0; 
    } 

    int local=2; 

    if(rank==0) 
    { 

     MPI_Gather(local_a,local,MPI_DOUBLE,d,local,MPI_DOUBLE,0,MPI_COMM_WORLD); 
    //MPI_Gather(&local_a,local,MPI_DOUBLE,&d,local,MPI_DOUBLE,0,MPI_COMM_WORLD); 
    //also tried the above line just to be certain. 


     printf("\n"); 
     for(j=0;j<4;j++) 
     printf("\t%f",d[j]); 
    } 
    else 
    { 
     MPI_Gather(local_a,local,MPI_DOUBLE,d,local,MPI_DOUBLE,0,MPI_COMM_WORLD); 
    //MPI_Gather(&local_a,local,MPI_DOUBLE,&d,local,MPI_DOUBLE,0,MPI_COMM_WORLD); 
    } 

    MPI_Finalize(); 

    return 0; 

    } 

任何人都可以幫我一把。

謝謝。

Anagha Madhusudanan

+0

你有什麼錯誤?如果我們不知道在我的系統上編譯並運行的代碼會出現什麼錯誤,我們可以提供幫助。 – pyCthon

回答

2

你的程序正常工作對我來說,給作爲輸出:

1.000000 2.000000 3.000000 4.000000 

你能分享你如何運行的詳細信息,並編譯可執行文件,所以我會嘗試重現錯誤,並在編輯答案的情況下?

只是爲了您的信息,你可以找到下面的程序稍加修改的版本,使得顯而易見的是,接收緩衝區只能在根被分配:

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

int main() { 

    int rank  = -1; 
    int commsize = -1; 
    double sendbuffer[2]; 

    MPI_Init(NULL,NULL); 
    MPI_Comm_size(MPI_COMM_WORLD, &commsize); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    sendbuffer[0]=2.0*rank; 
    sendbuffer[1]=2.0*rank + 1; 

    int count=2; 

    if(rank==0) { 

    // Recvbuffer is significant only at root 
    double * recvbuffer = malloc(2*commsize*sizeof(double)); 
    // Gather values at root 
    MPI_Gather(sendbuffer,count,MPI_DOUBLE,recvbuffer,count,MPI_DOUBLE,0,MPI_COMM_WORLD); 
    // Print to screen 
    printf("\n"); 
    for(int jj=0; jj<2*commsize ;jj++) 
     printf("%f\n",recvbuffer[jj]); 
    // Free recvbuffer 
    free(recvbuffer); 

    } else { 
    MPI_Gather(sendbuffer,count,MPI_DOUBLE,NULL,0,MPI_DOUBLE,0,MPI_COMM_WORLD); 
    } 

    MPI_Finalize(); 

    return 0; 

} 
+0

也可以使用就地收集,以便僅使用主控級別中的一個緩衝區。 –