C 在MPI中的所有节点之间同时传递消息
我似乎不知道如何在节点之间发送数据,而不是将数据发送到根节点,然后再发送到所有其他节点 如果我有C 在MPI中的所有节点之间同时传递消息,c,algorithm,mpi,C,Algorithm,Mpi,我似乎不知道如何在节点之间发送数据,而不是将数据发送到根节点,然后再发送到所有其他节点 如果我有N个节点,每个节点都有一个这样创建的数组,其中SIZE是节点的总数,目前假设它是一个预处理器常量(如果可能,避免像瘟疫一样malloc)。另外,不用说,rank是当前节点的排名 int dummy [SIZE][5]; int i, n; for (n = 0; n < SIZE; n++){ for (i = 0; i <5; i++){ if ( n == rank ){
N
个节点,每个节点都有一个这样创建的数组,其中SIZE
是节点的总数,目前假设它是一个预处理器常量(如果可能,避免像瘟疫一样malloc
)。另外,不用说,rank
是当前节点的排名
int dummy [SIZE][5];
int i, n;
for (n = 0; n < SIZE; n++){
for (i = 0; i <5; i++){
if ( n == rank ){
dummy [ n ][ i ] = 123;
有人可以提供一些伪代码给我,如何解决这个问题。Cheers这是一个“收集”操作,有一个MPI集合,如果您想将所有数据收集到一个处理器上,并将数据收集到所有处理器上,它将实现此操作
在本例中,我们希望在发送的同一个数组中进行“就地”收集。因此,这将起作用:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define SIZE 5
int main(int argc, char **argv) {
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size != SIZE) {
if (rank == 0) {
fprintf(stderr,"Must run with %d ranks\n", SIZE);
}
MPI_Finalize();
exit(1);
}
int dummy [SIZE][5];
for (int i = 0; i <5; i++){
dummy [ rank ][ i ] = 100 * rank;
}
MPI_Allgather(MPI_IN_PLACE, 5, MPI_INT,
dummy, 5, MPI_INT,
MPI_COMM_WORLD);
if (rank == SIZE-1) {
printf("Rank %d has dummy:\n", rank);
for (int i=0; i<size; i++) {
for (int j=0; j<5; j++) {
printf("%3d ", dummy[i][j]);
}
printf("\n");
}
}
MPI_Finalize();
return 0;
}
这是一个“收集”操作,并且有一个MPI集合,如果您想将所有数据收集到一个处理器上,并将数据收集到所有处理器上,它将实现该操作
在本例中,我们希望在发送的同一个数组中进行“就地”收集。因此,这将起作用:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#define SIZE 5
int main(int argc, char **argv) {
int size, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (size != SIZE) {
if (rank == 0) {
fprintf(stderr,"Must run with %d ranks\n", SIZE);
}
MPI_Finalize();
exit(1);
}
int dummy [SIZE][5];
for (int i = 0; i <5; i++){
dummy [ rank ][ i ] = 100 * rank;
}
MPI_Allgather(MPI_IN_PLACE, 5, MPI_INT,
dummy, 5, MPI_INT,
MPI_COMM_WORLD);
if (rank == SIZE-1) {
printf("Rank %d has dummy:\n", rank);
for (int i=0; i<size; i++) {
for (int j=0; j<5; j++) {
printf("%3d ", dummy[i][j]);
}
printf("\n");
}
}
MPI_Finalize();
return 0;
}
$ mpicc -o allgather allgather.c -std=c99
$ mpirun -np 5 ./allgather
Rank 4 has dummy:
0 0 0 0 0
100 100 100 100 100
200 200 200 200 200
300 300 300 300 300
400 400 400 400 400