Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在MPI中的所有节点之间同时传递消息_C_Algorithm_Mpi - Fatal编程技术网

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