2011-12-02 68 views
2

我正在處理動態分配的矩陣,並且需要將它們從一個進程發送/ recv到另一個進程。 我不知道我是否正確地做了,但有時,使用小矩陣,它可以工作;但是當我增加它們的尺寸,它得到這個錯誤:MPI Seg。使用動態分配使用send/recv時的錯誤

[caio-A790GXM-AD3:03111] *** Process received signal *** 
[caio-A790GXM-AD3:03111] Signal: Segmentation fault (11) 
[caio-A790GXM-AD3:03111] Signal code: Address not mapped (1) 
[caio-A790GXM-AD3:03111] Failing at address: (nil) 

這裏就是我認爲錯誤可能是基本部分:

float **alocarMatriz(int linhas, int colunas) { 
    int i; 
    float *dado = (float *)calloc(linhas*colunas,sizeof(float)); 
    float **array = (float **)calloc(linhas,sizeof(float*)); 
    for(i = 0; i < linhas; i++) 
     array[i] = &(dado[colunas*i]); 
    return array; 
}; 

if(taskid == MASTER) { 
    float **matriz; 
    matriz = alocarMatriz(numLin,numCol); 
    MPI_Send(&matriz[0][0], colunasAVT*colunasDAT, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD); 
} 
if(taskid > MASTER) { 
    float **matriz; 
    matriz = alocarMatriz(numLin,numCol); 
    MPI_Recv(&matriz[0][0], colunasAVT*colunasDAT, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status); 
} 

誰能告訴我什麼是錯?


編輯:

固定的Recv的索引,還試圖運行相同的程序,但是具有固定大小的陣列,而不是calloc'd。無論如何沒有成功,它仍然指向分段故障。

回答

0

您的指針指向的數組正確發送,但不適用於Recv。 Recv也應該是MPI_Recv(&(matriz[0][0]), ...(或等同於MPI_Recv(matriz[0], ...)。

+0

不錯!但仍然沒有成功。我可以直接與您聯繫並向您發送代碼嗎?我看到你回答了另一條線索,然後想到了它,但我不想打擾。現在你回答了我的問題,我感覺更舒服。 – caiotakeshi

+0

SO的一個很好的功能是其他人以後也可以搜索,找到這個問題並找到解決方案。所以讓我們繼續討論這個頁面。你可以在你的問題中發佈代碼的相關部分,或在其他地方發佈鏈接? –

+0

我認爲現在已經解決了,我測試了很多東西,我不知道到底發生了什麼。但一個人幫助我,現在它工作!他指出我正在發送Float並使用MPI_DOUBLE作爲參數...謝謝! :) – caiotakeshi

0

您需要檢查calloc的返回值。很有可能它返回NULL,然後您訪問內存並導致seg錯誤。

+0

什麼是正確的方法來檢查? 我試過 \t if(array == NULL)printf(「error!\ n」); 這樣就沒有錯誤... – caiotakeshi

0

聽起來像另一個MPI和陣列數組的實例。

一種分配N乘M矩陣的方法是分配N * M * sizeof(type)字節。既然你分配了一個數組的列,然後爲這些數組分配容器,那麼在你如何描述這個MPI內存時你不必更加複雜嗎?

我想,很像你如何分配,你將不得不建立一個MPI類型。