C openmpi问题

C openmpi问题,c,mpi,C,Mpi,要分布具有重叠元素的向量。例如,如果我有[1,2,3],我希望[1,2]被发送到一个节点,[2,3]被发送到另一个节点。我希望它用于open mpi…..请帮助我….一个好的起点是。 您应该能够修改hello world示例,以实现您的愿望 我不确定你的具体问题是什么。如果你能说明你已经做了多少,哪些对你不起作用,这将非常有帮助。无论是否适用于OpenMPI;OpenMPI只是该标准的一个实现,MPICH2也是。幸运的是,MPI就是MPI 因此,分配一个数据向量是通过调用完成的,调用会将大小相等

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

一个好的起点是。 您应该能够修改hello world示例,以实现您的愿望


我不确定你的具体问题是什么。如果你能说明你已经做了多少,哪些对你不起作用,这将非常有帮助。

无论是否适用于OpenMPI;OpenMPI只是该标准的一个实现,MPICH2也是。幸运的是,MPI就是MPI

因此,分配一个数据向量是通过调用完成的,调用会将大小相等的数据向量块发送到通信器中的每个进程。如果每个任务可能需要不同数量的元素,可以使用,其中您可以显式设置每个进程获取的元素数量,以及它在数组中的起始位置

但一旦使用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;
}
$ 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