2012-04-29 65 views
0
void iso_diffusion_denoising(image *u, image *u_bar, float kappa, int iters) { 

    int my_rank,num_procs; 
    float *temp; 
    int i,j,k=0; 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &num_procs); 
    int m=u->m; 
    int n=u->n; 
    //temp= malloc(n*sizeof(float));//1*n array ? 

    float *ptr; 

    for(k=0;k<iters;k++) { 

for(i=1; i<m-1; i++) { 

    for(j=1; j<n-1; j++) { 

    /* temp[m-1]=u->image_data[m-1][0]; 
    temp[m-1]=u->image_data[m-1][n-1]; 
    temp[i]=u->image_data[m-1][j];*/ 


    u_bar->image_data[i][j]= u->image_data[i][j] + kappa*(u->image_data[i-1][j] + u->image_data[i][j-1] - 4*u->image_data[i][j] + u->image_data[i][j+1] + u->image_data[i+1][j]); 
    u->image_data[i][j]=u_bar->image_data[i][j]; 
    } 
} 

//temp[m-1][n-1] 
if(my_rank==0) { 
    ptr = u->image_data[m-1]; 
    MPI_Send(&ptr[0],n,MPI_FLOAT,1,1,MPI_COMM_WORLD); 
    MPI_Recv(&temp,n,MPI_FLOAT,1,2,MPI_COMM_WORLD,&status); 
    printf("my rank is : %d ", my_rank); 
    fflush(stdout); 
} else if(my_rank==1) { //if(my_rank!=num_procs) { 
    ptr = u->image_data[0]; 
    MPI_Send(&ptr[0],n,MPI_FLOAT,0,2,MPI_COMM_WORLD); 
    MPI_Recv(&temp,n,MPI_FLOAT,1,1,MPI_COMM_WORLD,&status); 
    printf("my rank is : %d ", my_rank); 
    fflush(stdout); 
} 

    } 

} 

mpirun -np 2 Oblig 0.1 20 noisy denoisedMPI發送Recv。在運行時打印出的過程和分割故障的不正確等級

my rank is : 1114636288 [safir:22140] *** Process received signal *** 
-------------------------------------------------------------------------- 
mpirun noticed that process rank 0 with PID 22140 on node safir.ifi.uio.no exited on signal 11 (Segmentation fault). 

爲什麼my_rank打印出來,非常大的價值嗎?此外,我收到了一個分段錯誤。

+1

在'main'函數開頭沒有'MPI_Init'也許? – osgx 2012-04-29 14:20:05

回答

3

該問題似乎與MPI_Recv的第一個參數有關。在這裏你發送一個指向temp的指針,它本身就是一個指針。 MPI_Recv正在嘗試複製n浮點數,這些浮點數從爲temp指針保留的內存位置開始。您需要爲temp分配內存(取消註釋調用malloc的)並更改MPI_RECV來電:

MPI_Recv(temp, ... 

這是最有可能在那裏my_rank越來越它的垃圾值。 MPI_Recv試圖寫入n * sizeof(float)字節的數據,其中temp被存儲並覆蓋到爲其他變量保留的存儲器中,即my_rank

當您完成任務後,請不要忘記釋放您爲temp分配的任何內存!

其他一些事情,我已經做了很少的MPI編程,但我認爲你的MPI_Recv調用my_rank == 1塊應該有一個來源0.我還認爲MPI_Send和MPI_Recv阻塞呼叫 - 換句話說,直到傳輸完成或失敗。由於你的隊伍都在先調用MPI_Send,所以我期望他們既能阻止你的程序,也能阻止你的程序死鎖。也許他們失敗了 - 你應該檢查MPI_Send的返回值是否成功。

0

除了段錯誤代碼也可能會阻止,因爲較大的n您的MPI實現可以使用同步語義和死鎖的兩列等待MPI_Send以發佈接收完成,但由於用於同步發送到返回將不會發生,必須發佈匹配的接收。

您應該換入的if箱子一個(例如,用於my_rank == 0)的MPI_SendMPI_Recv的順序或(備受備受更好的解決方案是)使用MPI_Sendrecv這是專門設計來從未發生死鎖。

要回答你爲什麼排名打印像堆棧腐敗的問題。通過傳遞緩衝區指針的地址,您實際上會收到堆棧中的消息,從而覆蓋其他本地變量。