MPI Seg。使用动态分配的send / recv时出错

时间:2011-12-02 01:23:21

标签: c dynamic matrix mpi allocation

我正在处理动态分配的矩阵,需要将它们从进程发送/回收到另一个进程。 我不确定我是否正确地做到了,但有时候,对于小矩阵,它有效;但是当我增加它们的尺寸时,会出现这个错误:

[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。无论如何都没有成功,它仍然指向分段错误。

3 个答案:

答案 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类型。