2016-10-22 61 views
1

:)嘗試使用Mpi recv時發生錯誤:信號分段錯誤

我對mpi程序有一個令人困擾的問題。這個想法是:每個進程(從)發送數據給主,以計算mandelbrot分形。

首先,每個奴隸發送點和它的工人。然後,他們發送線路,它的工作!

但現在,我試着讓他們發送一行代碼塊(讓我們假設5行,所以一個子矩陣)。

我的想法是將這五行寫成一行。主人收到第一個「新」線,但不爲其他人O_o。我感到不安。

我收到了別人(> 1): 信號分割故障 信號代碼:ADRESS沒有映射 在您的地址

沒有,請幫助我!因爲它是一個很長一段時間,i'have一直在尋找:(

PS:我是法國人(這就是爲什麼我的英語不好)

//the whole table to be used in a master //int table[NX*NY]; //int count =0; if (rank == 0) { int res; int line[MAXY+MAXY+1]; int block[5*(MAXY+MAXY+1)]; int count = 0; /* Begin User Program - the master */ //MPI_Recv(&line, MAXY+MAXY+1, MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); MPI_Recv(&block, 5*(MAXY+MAXY+1), MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); printf("sizeof of datablock received is = %d \n",sizeof(block)/sizeof(block[0])); recvd = status.MPI_SOURCE; printf("i have received blockdata from %d \n",recvd); /* remplissage du case */ for(i = -MAXX; i <= MAXX; i++) { for(j = -MAXY; j <= MAXY; j++) { cases[i + MAXX][j + MAXY] = block[count%(MAXY+MAXY+1)]; //printf("j'ai fait un bloc[count], pas credible\n"); count++; } } dump_ppm("mandel.ppm", cases); printf("Fini.\n"); } else { /* On est l'un des fils */ /* for the block;let's suppose each son send 5 rows*/ double x, y; int i, j, res, rc, rank,count; //int line[MAXY + MAXY + 1]; int block[5*(MAXY+MAXY+1)]; count = 0; MPI_Comm_rank(MPI_COMM_WORLD, &rank); for(i = -MAXX; i <= MAXX; i++) { for(j = -MAXY; j <= MAXY; j++) { x = 2 * i/(double)MAXX; y = 1.5 * j/(double)MAXY; res = mandel(x, y); //line[j+MAXY] = res; block[count] =res; if (count % (5*(MAXY+MAXY+1)) == 0){ //we send each five rows MPI_Send(&block,5*(MAXY+MAXY+1), MPI_INT, 0, DATATAG, MPI_COMM_WORLD); printf("me slave %d, have sent datablock to master\n",rank); printf("sizeof of datablock sent is = %d\n",sizeof(block)/sizeof(block[0])); } count++; } //MPI_Send(&line, MAXY+MAXY+1 , MPI_INT, 0, DATATAG, MPI_COMM_WORLD); } } MPI_Finalize(); return 0; }

回答

0

MPI_Recv()需要的功能數據將被接收的緩衝區的地址MPI_Send()由於int block[5*(MAXY+MAXY+1)]是一個數組,因此block指向數組的第一項block[0]:這是需要的地址另一方面,&block指向block:它類似於指向int的指針。但&block的值不是數組中第一項的地址!

因此,你可以嘗試:

int block[5*(MAXY+MAXY+1)] 
... 
MPI_Send(block,5*(MAXY+MAXY+1), MPI_INT, 0, DATATAG, MPI_COMM_WORLD); 
... 
MPI_Recv(block, 5*(MAXY+MAXY+1), MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); 

即相當於:

int block[5*(MAXY+MAXY+1)] 
... 
MPI_Send(&block[0],5*(MAXY+MAXY+1), MPI_INT, 0, DATATAG, MPI_COMM_WORLD); 
... 
MPI_Recv(&block[0], 5*(MAXY+MAXY+1), MPI_INT,MPI_ANY_SOURCE, DATATAG, MPI_COMM_WORLD, &status); 

如果你送什麼一個整數int a?的a&a)地址可以被提供給MPI_Send(),如專門MPI_Send()很多例子進行:

int a=42; 
MPI_Send(&a,1, MPI_INT, 0, DATATAG, MPI_COMM_WORLD); 

最後,確保MPI_Send()被稱爲多次MPI_Recv()。事實上,在您發佈的代碼中,MPI_Recv()僅由根進程調用一次,而每個非根進程將向根發送消息。因此,該程序將適用於2個進程,並且如果使用更多進程或使用單個進程,該程序可能會失敗。

相關問題