MPI 并行计算 分段求数组最大值

 输入N个数的数组, 对数组里的数分给若干个进程进行分别计算, 要求用点对点通信, 不能用广播

我的做法是在rank =  0 的进程里输入N以及数组, 再将数组和N发送给其他进程, 其他进程收到之后进行计算,计算完成后再发给进程0, 进程0进行输出。

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
int main(int argc, char** argv)
{
    int rank , size;
    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Init(&argc,  &argv);
    MPI_Comm_size(comm, &size);
    MPI_Comm_rank(comm, &rank);
    MPI_Status status;
    int N,i,j;
    int pmax[size];

    if(rank == 0)
    {
        printf("N = ");
        scanf("%d", &N);
        int array[N];
        for(i = 0 ; i < N; i ++)
            scanf("%d", &array[i]);
        for(i = 1; i < size; i++)
        {
            MPI_Send(&N, 1, MPI_INT, i, 99, MPI_COMM_WORLD);
            MPI_Send(&array, N, MPI_INT, i, 98, MPI_COMM_WORLD);

        }
        
        
        for(i = 1; i <= size - 1; i++)
        {
            MPI_Recv(&pmax[i-1], 1, MPI_INT, i, 97, comm,&status);
        }
        int max = pmax[0];
        for(j = 1; j < size -1; j++)
        {
            if(max < pmax[j])
                max = pmax[j];
        }
        printf("max is %d\n", max);
    }
    else
    {

        MPI_Recv(&N, 1, MPI_INT, 0, 99, comm,&status);
        int array2[N];
        MPI_Recv(&array2, N, MPI_INT, 0, 98, comm,&status);

        int start, end;
        start = (rank - 1) * (N/(size - 1));
        end = rank * (N/(size - 1));
        int pmax[size];

        int max = 0;
        if(rank != size - 1)
        {
            for(i = start; i < end; i++)
            {
                if(max < array2[i])
                {
                    max = array2[i];
                }
            }
        }
        else
        {
            for(i = start; i < N; i++)
            {
                if(max < array2[i])
                {
                    max = array2[i];
                }
            }
        }
        printf("max in process %d is %d, start from %d\n", rank, max, start);
        MPI_Send(&max, 1, MPI_INT, 0, 97, MPI_COMM_WORLD);
    }
    MPI_Finalize();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值