Я ухожу. Это самая неприятная вещь, которую я когда-либо делал. Даже нединамический массив int вызывает segfault. Но если я объявляю его как массив float/char, он работает нормально.Ошибка сегментации при распределении второго массива
Update: Если я удалить строку MPI_Scatter(A[0], N, MPI_INT, A_row, N, MPI_INT, 0, MPI_COMM_WORLD);
она отлично работает. Проблема в том, что мне это нужно ...
Я работаю над программой, но у меня есть странная проблема.
Следующий код работает отлично (если предположить, что N кратно р):
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
void main(int argc, char** argv)
{
int my_rank, p, N, **A, *diagonals, *A_row;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
if (my_rank == 0) {
N = 4;
int *mem = malloc(N * N * sizeof(int));
A = malloc(N * sizeof(int*));
for(int i = 0; i < N; i++)
A[i] = mem + N*i;
}
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
A_row = malloc (N * sizeof(int));
MPI_Scatter(A[0], N, MPI_INT, A_row, N, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Finalize();
}
Однако мне нужно выделить еще один массив (диагоналей), как это:
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
void main(int argc, char** argv)
{
int my_rank, p, N, **A, *diagonals, *A_row;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
if (my_rank == 0) {
N = 4;
int *mem = malloc(N * N * sizeof(int));
A = malloc(N * sizeof(int*));
for(int i = 0; i < N; i++)
A[i] = mem + N*i;
diagonals = malloc (N * sizeof(int));
}
MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
A_row = malloc (N * sizeof(int));
MPI_Scatter(A[0], N, MPI_INT, A_row, N, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Finalize();
}
Я получаю эту ошибку сегментации (если это помогает на всех):
[teo-VirtualBox:02582] *** Process received signal ***
[teo-VirtualBox:02582] Signal: Segmentation fault (11)
[teo-VirtualBox:02582] Signal code: Address not mapped (1)
[teo-VirtualBox:02582] Failing at address: 0x1
[teo-VirtualBox:02582] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x113d0)[0x7faecc8d23d0]
[teo-VirtualBox:02582] [ 1] a[0x400c85]
[teo-VirtualBox:02582] [ 2] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7faecc511830]
[teo-VirtualBox:02582] [ 3] a[0x4009a9]
[teo-VirtualBox:02582] *** End of error message ***
Я пропустил что-то очевидное?
Кстати, я не использую free() или ничего не делаю, потому что это не полный код. Это просто файл, который я создал для тестирования.
Для будущего, загрузите программу с помощью GDB, и он расскажет вам, что линия сегментного неисправного, и вы можете проверить значение некоторых переменные. –
@SanchkeDellowar Я не знаком с gdb. Я попробовал 'mpiexec -np 4 a.out -gdb', но это не имеет никакого значения в сообщении об ошибке. –
@TeoAlivanoglou Не могли бы вы попытаться уничтожить свой код до минимального проверяемого примера, то есть вынуть все (в основном, материал mpi), который вам не нужен, чтобы мы могли попробовать запустить его самостоятельно? – gowrath