【问题标题】:MPI_Gatherv: Garbage values received in root's arrayMPI_Gatherv:根数组中接收到的垃圾值
【发布时间】:2017-07-16 11:54:48
【问题描述】:

我正在尝试在 C 中实现 MPI_Gatherv 函数。

根据我的程序,包括 root 在内的每个进程都应该创建一个大小等于 (process' rank + 1) 的本地数组,该数组将在所有单元格中保持进程的排名。

这个本地数组然后被收集到根的 rcv_array 中。

不知何故,我得到了垃圾值。 有人可以告诉我我做错了什么吗? 另外,我是 MPI 新手,很难理解 MPI_Gatherv 的 disprcv_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;
}

【问题讨论】:

    标签: c arrays mpi


    【解决方案1】:

    三个小问题:

    1. 你说你想创建一个大小等于(进程等级+1)的本地数组,但你只做localdata = malloc(proc_rank * sizeof(int)); 只需malloc((proc_rank + 1) * sizeof(int));

    2. 作为MPI_Gatherv 的第一个参数,您使用&amp;localdata。这是指针的地址,用指针本身localdata代替。

    3. sum(proc_count)+1(用于打印和分配),其实是太多了。

    否则你很高兴。特别是棘手的位移/偏移计算看起来很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-30
      • 2012-01-18
      • 2013-05-07
      • 1970-01-01
      • 2012-01-10
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多