2011-12-02 40 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类型。