【发布时间】:2017-07-16 11:54:48
【问题描述】:
我正在尝试在 C 中实现 MPI_Gatherv 函数。
根据我的程序,包括 root 在内的每个进程都应该创建一个大小等于 (process' rank + 1) 的本地数组,该数组将在所有单元格中保持进程的排名。
这个本地数组然后被收集到根的 rcv_array 中。
不知何故,我得到了垃圾值。 有人可以告诉我我做错了什么吗? 另外,我是 MPI 新手,很难理解 MPI_Gatherv 的 disp 和 rcv_count。
我的代码:
#include<stdio.h>
#include<mpi.h>
#include<stdlib.h>
int sum(int);
int main(int argc, char **argv){
int proc_count, proc_rank, root = 0;
int *localdata = NULL;
int *rcv_array = NULL;
int *disp = NULL;
int *rcv_count = NULL;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &proc_count);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_rank);
if(proc_rank == root){
rcv_array = malloc((sum(proc_count)+1) * sizeof(int));
rcv_count = malloc(proc_count * sizeof(int));
disp = malloc(proc_count * sizeof(int));
rcv_count[0] = 1;
disp[0] = 0;
for(int i=1; i<proc_count; i++){
rcv_count[i] = i+1;
disp[i] = rcv_count[i-1] + disp[i-1];
}
}
localdata = malloc(proc_rank * sizeof(int));
for(int i=0; i<=proc_rank; i++)
localdata[i]=proc_rank;
MPI_Gatherv(&localdata, proc_rank+1, MPI_INT, rcv_array, rcv_count, disp, MPI_INT, root, MPI_COMM_WORLD);
if(proc_rank == root){
printf("Elements gathered from each process rank wise:\n\n");
for(int i=0; i<sum(proc_count)+1; i++){
printf("-%d-", rcv_array[i]);
}
printf("\n");
}
MPI_Finalize();
return 0;
}
int sum(int n){
int total = 0;
for(int i=1; i<=n; i++)
total+=i;
return total;
}
【问题讨论】: