想要分佈具有重疊元素的向量。例如,如果我有[1,2,3],我希望[1,2]發送到一個節點,[2,3]發送到另一個。我希望它打開mpi .. ...請幫助我......openmpi問題
1
A
回答
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的例子來做你想做的事情。
我不太確定你的具體問題是什麼。如果你陳述了你已經做了多少事情,並且哪些不適合你,那真的很有幫助。
相關問題
- 1. OpenMPI通信問題
- 2. MPI_Comm_split和openmpi 1.4.3的問題
- 3. 使openmpi-2.0.2工作的問題。 (MacOS Sierra)
- 4. 我具有使用該實施的openmpi的MPI_Barrier一些同步問題的openmpi MPI_Barrier問題
- 5. C++ OpenMPI linked-lists
- 6. ZeroMQ vs OpenMPI
- 7. 的openmpi和vargrind
- 8. OpenMP與OpenMPI
- 9. OpenMPI CUDA和CUDPP
- 10. DCOM和OpenMPI
- 11. OpenMPI容錯
- 12. OpenMPI突破循環
- 13. openmpi和intel icc icpc
- 14. 分段錯誤OpenMPI
- 15. 在openmpi openmpi中的奇怪任務行爲
- 16. Hybrid:羣集上的OpenMPI + OpenMP
- 17. 原地mpi_reduce與OpenMPI崩潰
- 18. 集羣上的openMPI命令
- 19. 的openmpi矩陣乘法
- 20. 讓OpenMPI在Mac上工作:
- 21. 使用openMPI發送對象
- 22. 如何爲xcode安裝Openmpi?
- 23. openMPI中缺少gethostname()函數
- 24. LAM MPI和OpenMPI的區別
- 25. OpenMPI使用MINLOC減少
- 26. OpenMPI中的動態節點
- 27. OpenMPI mpirun宇宙大小
- 28. 如何從Sierra上的Macports安裝openmpi和/或檢查openmpi是否已安裝
- 29. 的openmpi並行讀取文本文件
- 30. 可用內核與中的openmpi