我正在處理動態分配的矩陣,並且需要將它們從一個進程發送/ 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。無論如何沒有成功,它仍然指向分段故障。
不錯!但仍然沒有成功。我可以直接與您聯繫並向您發送代碼嗎?我看到你回答了另一條線索,然後想到了它,但我不想打擾。現在你回答了我的問題,我感覺更舒服。 – caiotakeshi
SO的一個很好的功能是其他人以後也可以搜索,找到這個問題並找到解決方案。所以讓我們繼續討論這個頁面。你可以在你的問題中發佈代碼的相關部分,或在其他地方發佈鏈接? –
我認爲現在已經解決了,我測試了很多東西,我不知道到底發生了什麼。但一個人幫助我,現在它工作!他指出我正在發送Float並使用MPI_DOUBLE作爲參數...謝謝! :) – caiotakeshi