代码之家  ›  专栏  ›  技术社区  ›  Niteya Shah

仅对一个列工作的数组接收的MPI和

  •  0
  • Niteya Shah  · 技术社区  · 6 年前

    我尝试使用MPI查找长度为100个元素的数组的总和,在仅使用MPI\ U Send和MPI\ U receive的限制下,我编写的代码查找每个处理器的总和,但在重新发送到主处理器(rank=0)的过程中,我的代码仅从一个处理器接收

    我的代码

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    #include "mpi.h"
    #include "math.h"
    
    int val = 1;
    int main(int argc, char* argv[]) {
    
        int my_rank;
        int p;
        int ierr;
        int i;
        int a[100];
        int q=0;
        for (i = 0; i <100; i++)
        {
            a[i] = i+1;
        }
        int send,recv;
        MPI_Status status;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
        MPI_Comm_size(MPI_COMM_WORLD, &p);
        int part = 100 /(p-1);
        if (my_rank == 0)
        {
            for (i = 1; i < p; i++)
            {
                send = part * (i-1);
                MPI_Send(&send, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
            }
    
        }
        else
        {
            MPI_Recv(&recv, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
            for (i = recv; i < recv + part; i++)
            {
                val = val+a[i];
    
            }
            printf("%d\n", val);
            MPI_Send(&val, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
        }
        if (my_rank == 0)
        {
            MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
            printf("%d", val);
            q = q + val;
    
        }
        MPI_Finalize();
        if (my_rank == 0)
        {
            printf("The output is %d\n", q);
        }
        return 0;
    }
    

    我的输出 enter image description here

    1 回复  |  直到 6 年前
        1
  •  5
  •   MatúÅ¡ Bako    6 年前

    if (my_rank == 0)
    {
        for (rank = 1; rank < proc_cnt; rank++)
        {
            MPI_Recv(&val, 1, MPI_INT, rank, 0, MPI_COMM_WORLD, &status);
            printf("value of rank %d is %d", rank, val);
            q = q + val;
        }
    
    }
    

    mpi_gather() 如果允许的话。