2015-05-27 4 views
0

Я пытаюсь выполнить параллелизацию некоторой части кода, которая вычисляет матрицы, но я получаю ошибку ошибки сегментации. Я уже отлаживаю код, но я не могу найти проблему.Ошибка сегментации MPI_Scatter (сигнал 11)

Вот фрагмент кода, где я объявляю Matrice:

double **A, **B, **C, *tmp1,*tmp2,*tmp3; 
int N; 
int myrank, P, from, to; 

N = 100; 

tmp1 = (double *) malloc (sizeof(double) * N * N); 
tmp2 = (double *) malloc (sizeof(double) * N * N); 
tmp3 = (double *) malloc (sizeof(double) * N * N); 
A = (double **) malloc (sizeof(double *) * N); 
B = (double **) malloc (sizeof(double *) * N); 
C = (double **) malloc (sizeof(double *) * N); 

from = myrank * N/P; 
to = (myrank+1) * N/P; 

Тогда здесь, где я inicialize МПИ

MPI_Init (&argc, &argv); 
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
MPI_Comm_size(MPI_COMM_WORLD, &P); 

Но так или иначе, я не могу разбрасывать ...

MPI_Bcast(B, N*N, MPI_INT, 0, MPI_COMM_WORLD); 

printf("Rank: %d\n", myrank); 

MPI_Scatter(A, N*N/P, MPI_INT, &A[from], N*N/P, MPI_INT, 0, MPI_COMM_WORLD); 

Я не могу написать весь код здесь, потому что мне не разрешено ... Но проблема в Scatter it self. Что я делаю неправильно?

+3

Рассмотрите возможность сделать это как можно проще для других, чтобы помочь вам. то есть не сбрасывать фрагменты, казалось бы, несвязанного кода. И не сбрасывайте всю свою программу здесь. Вместо этого попробуйте удалить блоки кода, которые не имеют отношения к проблеме, при этом повторяя ошибку. т. е. попытаться создать [короткий, самостоятельный, компилируемый пример] (http://sscce.org/). Затем вставьте это. То, что вы вставили здесь, так отключено, большинство людей даже не захочет читать его. – ArjunShankar

+0

Переменная 'P' используется без предварительной инициализации! –

ответ

1

Вы не можете напрямую отправить 2-мерную матрицу (double**). Вместо этого вам необходимо передать адрес фактических данных: &A[0][0]. Для получения вы также должны передать адрес, где данные фактически хранятся. В вашем случае это будет: &A[from][0] вместо &A[from].

Попробуйте это как разбросом:

MPI_Scatter(&A[0][0], N*N/P, MPI_INT, &A[from][0], N*N/P, MPI_INT, 0, MPI_COMM_WORLD); 

На другой ноте, о процессе получения всех значений в A, кроме тех, которые будут получены, остаются недействительными. Возможно, вам стоит подумать о создании отдельного буфера приема необходимого размера:

double* local_A = (double*)malloc(sizeof(double)*N*N/P); 
MPI_Scatter(&A[0][0], N*N/P, MPI_INT, local_A, N*N/P, MPI_INT, 0, MPI_COMM_WORLD); 
+0

спасибо за ответ. Я уже делаю это изменение, и теперь он работает, но только для 1 процессора. Когда я использую 2 или более процесса, у меня все еще есть ошибка сбоя сегментации – TCMSSS

Смежные вопросы