2011-03-26 49 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的例子來做你想做的事情。

我不太確定你的具體問題是什麼。如果你陳述了你已經做了多少事情,並且哪些不適合你,那真的很有幫助。