Я плохо понимаю, как MPI_Reduce
работает с массивом. Мне нужно сделать поэлементную сумму.
Чтобы протестировать функцию MPI_Reduce
, я написал этот простой код, и он работает:
double a[4] = {0,1,2,(double)process_id};
double b[4];
MPI_Reduce(&a, &b, 4, MPI_DOUBLE, MPI_SUM, p-1, MPI_COMM_WORLD);
if(id == p-1) {
for(int i = 0; i < 4; i++){
printf("%f, ", b[i]);
}
}
он печатает это:
0.00000, 4.00000, 8.00000, 6.00000
когда я запускаю этот код с 4 процессами. Оно работает!
Теперь реализую свою задачу. Предполагая, что я использую процесс p
, мне нужно уменьшить p
матриц размеров m * n
, поэтому я переписываю каждую матрицу в виде массива
double *a;
double **A;
A = new double*[n];
//code that compute matrix A
a = (double *) malloc(m * n * sizeof(double));
int k = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++){
a[k] = A[i][j];
k++;
}
}
Таким образом, у меня есть матрицы, которые мне нужно уменьшить в виде массива. Теперь я выполняю это сокращение:
if(id == p-1){
reduce_storage = (double *) malloc(m * n * sizeof(double));
}
MPI_Reduce(&a, &reduce_storage, m * n, MPI_DOUBLE, MPI_SUM, p-1, MPI_COMM_WORLD);
Массивы a и reduce_storage распределяются одинаково, поэтому они имеют одинаковую размерность m * n, значение аргумента count MPI_Reduce. Я не понимаю, почему я пытаюсь запустить его, возвращая эту ошибку:
*** stack smashing detected ***: <unknown> terminated
[EdoardoPC:01104] *** Process received signal ***
[EdoardoPC:01104] Signal: Aborted (6)
[EdoardoPC:01104] Signal code: (-6)
[EdoardoPC:01104] *** Process received signal ***
[EdoardoPC:01104] Signal: Segmentation fault (11)
[EdoardoPC:01104] Signal code: (128)
[EdoardoPC:01104] Failing at address: (nil)