MPI Seg.ошибка при использовании send / recv с динамическим распределением - PullRequest
2 голосов
/ 02 декабря 2011

Я имею дело с динамически распределенными матрицами, и мне нужно отправлять / извлекать их из одного процесса в другой. Я не уверен, правильно ли я это делаю, но иногда, с небольшими матрицами, это работает; но когда я увеличиваю их размеры, он получает эту ошибку:

[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);
}

Может кто-нибудь сказать мне, что не так?


EDIT:

Исправлен индекс Recv, также пытался запустить ту же программу, но с массивами фиксированного размера вместо calloc'd. В любом случае, безуспешно, это все еще указывает на ошибку сегментации.

Ответы [ 3 ]

0 голосов
/ 02 декабря 2011

У вас есть правильный указатель на массив для Send, но не для Recv. Recv тоже должен быть MPI_Recv(&(matriz[0][0]), ... (или, что эквивалентно, MPI_Recv(matriz[0], ...).

0 голосов
/ 02 декабря 2011

Похоже на другой экземпляр MPI и массивов массивов.

Одним из способов выделения матрицы N на M является выделение N * M * sizeof(type) байтов.Поскольку вы выделяете столбцы массива, а затем выделяете контейнер для этих массивов, разве вам не нужно быть более изощренным в том, как вы описываете эту память в MPI?

Я думаю, очень похоже на то, как вы распределили вВо-первых, вам придется создать тип MPI.

0 голосов
/ 02 декабря 2011

Вам необходимо проверить возвращаемые значения calloc. Скорее всего, он возвращает NULL, а затем вы получаете доступ к памяти и вызывает ошибку сегмента.

...