【问题标题】:openmpi questionopenmpi 问题
【发布时间】:2011-03-26 23:28:19
【问题描述】:

想要分配具有重叠元素的向量。例如,如果我有 [1,2,3],我希望 [1,2] 被发送到一个节点,而 [2,3] 被发送到另一个节点。我希望它用于打开 mpi.. ...请帮助我.....

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    是否为 OpenMPI 无关紧要; OpenMPI 只是该标准的一种实现,MPICH2 也是如此。幸运的是,MPI 是 MPI。

    因此,通过MPI_Scatter 调用来分发数据向量,该调用将相同大小的数据向量块发送到通信器中的每个进程。如果每个任务可能需要不同数量的元素,则使用MPI_Scatterv,您可以在其中明确设置每个进程获得多少元素,以及它在数组中的起始位置。

    但是,一旦您使用 MPI_Scatterv 并指定计数和位移,您就可以使用计数和位移来指定重叠的数据片段。计数将总计为数组中的元素数加上重叠位;位移将指向进程看到的数组的第一个重叠部分。因此,例如,这会分配整数数组的重叠段:

    #include <stdio.h>
    #include <stdlib.h>
    #include <mpi.h>
    
    int main(int argc, char **argv) {
        const int NELEM=15;
        int globvec[NELEM];
        int *locvec;
        int *counts, *disps;
        int size, rank, ierr;
        int start, end;
    
    
        ierr  = MPI_Init(&argc, &argv);
        ierr |= MPI_Comm_size(MPI_COMM_WORLD, &size);
        ierr |= MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    
        if (rank==0)
            for (int i=0;i<NELEM;i++) globvec[i] = i;
    
        /* figure out the counts and displacements into the array. 
         * All the tasks from 1..size-1 get one extra element
         * at the end overlapping with their neighbour; the tasks
         * size-1 gets all remaining data.
         */
    
        counts = (int *)malloc(size*sizeof(int));
        disps  = (int *)malloc(size*sizeof(int));
        for (int i=0; i<size; i++) {
            start = (NELEM/size)*i;
    
            end = (start + (NELEM/size)-1)+1;
            if (i == size-1) end = NELEM-1;
    
            counts[i] = (end-start+1);
            disps[i] = start;
        }
    
        locvec = (int *)malloc(counts[rank]*sizeof(int));
        MPI_Scatterv (globvec, counts, disps, MPI_INT,
                      locvec, counts[rank], MPI_INT, 0, MPI_COMM_WORLD);
    
    
        for (int i=0; i<counts[rank]; i++)
            printf("%d: %d\n", rank, locvec[i]);
    
        free(locvec);
        free(counts);
        free(disps);
        MPI_Finalize();
    
        return 0;
    }
    

    有 15 个元素,0..14。所以如果你用三个任务运行它,并且有 1 个重叠,你会期望数组被分解 [0,1,2,3,4,5],[5,6,7,8,9, 10],[10,11,12,13,14,15],这就是你得到的:

    $ mpirun -np 3 ./vector1
    0: 0
    0: 1
    0: 2
    0: 3
    0: 4
    0: 5
    1: 5
    1: 6
    1: 7
    1: 8
    1: 9
    1: 10
    2: 10
    2: 11
    2: 12
    2: 13
    2: 14
    

    【讨论】:

      【解决方案2】:

      一个好的起点是MPI wiki page。 您应该能够修改 hello world 示例来做您想做的事情。

      我不太确定您的具体问题是什么。如果你说明你已经做了多少,什么对你不起作用,那真的很有帮助。

      【讨论】:

        猜你喜欢
        • 2011-07-08
        • 2013-05-21
        • 2015-04-25
        • 2013-03-12
        • 1970-01-01
        • 2021-11-08
        • 2020-09-16
        • 2011-10-04
        • 2021-04-03
        相关资源
        最近更新 更多