我正在处理动态分配的矩阵,需要将它们从进程发送/回收到另一个进程。 我不确定我是否正确地做到了,但有时候,对于小矩阵,它有效;但是当我增加它们的尺寸时,会出现这个错误:
[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 :(得分:0)
您需要检查calloc
的返回值。很可能它会返回NULL
,然后您访问内存并导致seg错误。
答案 1 :(得分:0)
指向数组的指针对于Send是正确的,但对于Recv则没有。 Recv也应该是MPI_Recv(&(matriz[0][0]), ...
(或等效地,MPI_Recv(matriz[0], ...
)。
答案 2 :(得分:0)
听起来像MPI和数组数组的另一个实例。
分配N×M矩阵的一种方法是分配N * M * sizeof(type)
个字节。既然你分配了一个数组的列,那么为这些数组分配容器,你不必更加复杂地将这个内存描述为MPI吗?
我认为,就像你首先分配的方式一样,你必须建立一个MPI类型。