【发布时间】:2021-02-27 14:15:38
【问题描述】:
我不太了解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)
【问题讨论】:
标签: c++ c parallel-processing mpi reduction