我想分配一个元素重叠的向量。例如,如果我有1, 2,3,我希望1,2被发送到一个节点,2,3被发送到另一个节点。我希望它用于打开mpi.....please帮助我.....
发布于 2011-03-26 23:28:20
它是否用于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,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发布于 2011-03-26 21:15:57
MPI wiki page是一个很好的起点。您应该能够修改hello world示例以执行您想要的操作。
我不太确定你的具体问题是什么。如果你说出你已经做了多少,以及什么对你不起作用,这将真的很有帮助。
https://stackoverflow.com/questions/5441082
复制相似问题