2011-03-26 36 views
1

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

回答

1

不管它是否适用于OpenMPI;与MPICH2一样,OpenMPI只是该标准的一个实现。幸运的是,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 
1

好的一点是MPI wiki page。 你应该可以修改hello world的例子来做你想做的事情。

我不太确定你的具体问题是什么。如果你陈述了你已经做了多少事情,并且哪些不适合你,那真的很有帮助。