我正在处理动态分配的矩阵,并且需要将它们从一个进程发送/ 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