2013-12-17 78 views
0

我希望有人能幫助我。我的代碼:MPI中意外的死鎖

void process(int myid, int numprocs) 
{ 
    int i,j, anzahl, rest; 
    MPI_Status stat; 

    meta = (int *)malloc(3 * sizeof(int)); 
    if(myid == 0) 
    { 
     meta[0] = ASpalten; 
     meta[1] = AZeilen; 
     meta[2] = BSpalten; 

     for (i = 0; i < numprocs; i++) //masternode distributes matrix A to every single core 
     {  
      MPI_Send(&meta[0], 3, MPI_INT, i, TAG, MPI_COMM_WORLD); 
      printf("%d: debug04\n", myid); 
      MPI_Send(&MA[0], ASpalten*AZeilen, MPI_DOUBLE, i, TAG, MPI_COMM_WORLD); 
      printf("%d: debug05\n", myid); 
      MPI_Send(&MB[0], ASpalten*BSpalten, MPI_DOUBLE, i, TAG, MPI_COMM_WORLD); 
      printf("%d: debug06\n", myid); 
     } 
    } 
    else 
    { 
     MPI_Recv(meta, 3, MPI_INT, 0, TAG, MPI_COMM_WORLD, &stat); 
     printf("%d: debug01\n", myid); 
     ASpalten = meta[0]; 
     AZeilen = meta[1]; 
     BSpalten=meta[2]; 
     printf("%d: debug02\n", myid); 
     MA = (double*)malloc(ASpalten*AZeilen*sizeof(double)); 
     MB = (double*)malloc(ASpalten*BSpalten*sizeof(double)); 
     MR = (double*)malloc(AZeilen*BSpalten*sizeof(double)); 
     MPI_Recv(MA, ASpalten*AZeilen, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &stat); 
     MPI_Recv(MB, ASpalten*BSpalten, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &stat); 
     printf("%d: debug03\n", myid); 
     // printf("%d: %f\n", myid, *(MA + _index(1, 1, ASpalten))); //funktioniert 
    } 

的數據類型:

int ASpalten; 
int AZeilen; 
int BSpalten; 
int *meta; //used to transfer meta data in 1 send 
double *MA; //Matrix A 
double *MB; //Matrix B 

程序應該乘使用MPI 2點矩陣。我的樣本矩陣證明代碼可能是有效的,我也可以運行這個代碼(最多可能更少),但無論如何,隨着數量的增加,我遇到了一個可能的死鎖:控制檯打印出來"debug4"就是這樣。我會非常感激,如果有人知道我的計劃中出了什麼問題。我已經嘗試使用MPI_INTEGER而不是MPI_INT,但沒有任何區別。任何幫助,將不勝感激。控制檯的使用非常小的矩陣時,輸出(PS,我已經嘗試執行我以不同的順序也測試用例和修改現有的):

Testcase1 MPI:
0:debug04
0:debug05
0:debug06
0:debug04
1:debug01
1:debug02
0:debug05
1:debug03
1:debugx1
0:debug06
0:debug04 ......

+0

難道這些定義的任何地方? 'int ASpalten,AZeilen,BSpalten;' –

+0

您是否考慮過使用'MPI_Bcast'? –

回答

1

看來,進程0發送消息給PROC 0和0 PROC接收做他們。

我修改

for(i=1;i<numprocs;i++) 

刪除僵局。

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


int ASpalten; 
int AZeilen; 
int BSpalten; 
int *meta; //used to transfer meta data in 1 send 
double *MA; //Matrix A 
double *MB; //Matrix B 
double *MR; //Matrix B 

void process(int myid, int numprocs){ 
    int i,j, anzahl, rest; 
    int TAG=0; 
    MPI_Status stat; 
    meta=(int*)malloc(3*sizeof(int)); 
    if(myid == 0) 
    {meta[0]=ASpalten; 
    meta[1]=AZeilen; 
    meta[2]=BSpalten; 
    for (i=1; i<numprocs; i++)//masternode distributes matrix A to every single core 
    {  
     MPI_Send(&meta[0], 3, MPI_INT, i, TAG, MPI_COMM_WORLD); 
     printf("%d: debug04\n", myid); 
     MPI_Send(&MA[0], ASpalten*AZeilen, MPI_DOUBLE, i, TAG, MPI_COMM_WORLD); 
     printf("%d: debug05\n", myid); 
     MPI_Send(&MB[0], ASpalten*BSpalten, MPI_DOUBLE, i, TAG, MPI_COMM_WORLD); 
     printf("%d: debug06\n", myid); 
    } 
    } 
    else 
    { 
     MPI_Recv(meta, 3, MPI_INT, 0, TAG, MPI_COMM_WORLD, &stat); 
     printf("%d: debug01\n", myid); 
     ASpalten=meta[0]; 
     AZeilen=meta[1]; 
     BSpalten=meta[2]; 
     printf("%d: debug02\n", myid); 
     MA = (double*)malloc(ASpalten*AZeilen*sizeof(double)); 
     MB = (double*)malloc(ASpalten*BSpalten*sizeof(double)); 
     MR = (double*)malloc(AZeilen*BSpalten*sizeof(double)); 
     MPI_Recv(MA, ASpalten*AZeilen, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &stat); 
     MPI_Recv(MB, ASpalten*BSpalten, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &stat); 
     printf("%d: debug03\n", myid); 
     // printf("%d: %f\n", myid, *(MA + _index(1, 1, ASpalten))); //funktioniert 
    } 
} 

int main(int argc,char *argv[]) 
{ 
    int rank, size; 


    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    ASpalten=130; 
    AZeilen=90; 
    BSpalten=200; 
    if(rank==0){ 

    } 

    MA = (double*)malloc(ASpalten*AZeilen*sizeof(double)); 
    MB = (double*)malloc(ASpalten*BSpalten*sizeof(double)); 
    MR = (double*)malloc(AZeilen*BSpalten*sizeof(double)); 
    process(rank,size); 
    MPI_Finalize(); 
    return 0; 
} 

再見,

弗朗西斯

+0

謝謝你的回答弗朗西斯。我會盡快測試它。但是,如果這是一個問題,程序不應該總是死鎖嗎?爲了防止死鎖,我在早期將其更改爲0,以防止在我的程序中存在很多錯誤時出現死鎖,但不知道爲什麼它將問題排除在外。希望它能在明天工作。 – user1497119

+0

@ user1497119:我不知道爲什麼我= 0在小尺寸上工作,爲什麼它在大尺寸上失敗。我能夠重現你的問題,並改變爲i = 1解決它。我認爲消息的處理方式不同,具體取決於它們的大小(MPI實現的內部特性?)。希望它會有所幫助! Bye,Francis – francis

+0

'MCA btl:parameter「btl_self_eager_limit」(當前值:<131072>,數據源:默認值)' - 這就是爲什麼它在較小的矩陣中「起作用」。 –