欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MPI编程----矩阵乘法

程序员文章站 2022-06-22 16:20:41
...

原理:

MPI编程----矩阵乘法
如图所示,将一个矩阵每一列分配给各个子进程,然后在进程内部将一列与另一个矩阵相乘,最后将根进程收集结果并进行输出。

代码如下:

#include <stdio.h>
#include "mpi.h"
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

//生成随机矩阵
int **generate_matrix(int size)
{
    int num = 0,m;
    int **matrix;
    matrix = (int **)malloc(sizeof(int *) * size);
    for(m = 0; m < size; m++)
        matrix[m] = (int *)malloc(sizeof(int) * size);
    int i,j;
    srand(time(NULL) + rand());
    for(i = 0; i < size; i++)
    {
        for(j = 0; j < size; j++)
        {
            matrix[i][j]= rand() % 20;
        }
    }
    return matrix;
}
//输出矩阵
void print_matrx(int **a,int size)
{
    int i,j;
    for(i = 0; i < size; i++)
    {
        for(j = 0; j < size; j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
//矩阵相乘
int * Multiplication(int **a,int b[],int size)
{
    int *result;
    result = (int *)malloc(sizeof(int) * size);
    int i,m,n,sum = 0;
    for(m = 0; m < size; m++)
    {
        for(n = 0; n < size; n++)
        {
            sum += a[n][m] * b[n];
        }
        result[m] = sum;
        sum = 0;
    }
    return result;
}
int main(int argc,char **argv)
{
    int size,rank,dest;
    MPI_Comm comm = MPI_COMM_WORLD;
    MPI_Status status;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(comm,&size);
    MPI_Comm_rank(comm,&rank);


    int **matrix1;
    int **matrix2;
    int send_buff[size*size];
    matrix1 = generate_matrix(size);
    matrix2 = generate_matrix(size);
    if(rank == 0)
    {
        printf("matrix1 is :\n");
        print_matrx((int **)matrix1,size);

        printf("matrix2 is :\n");
        print_matrx((int **)matrix2,size);

        int j,k,tmp = 0;
        for(j = 0; j < size; j++)
            for(k = 0; k < size; k++)
            {
                send_buff[tmp] = matrix1[j][k];
                tmp++;
            }
    }


    int rbuf[size];
    int final_buff[size];

    int *result;

    result = (int *)malloc(sizeof(int) * size);

    //Multiplication((int**)matrix,)
    //分发列
    MPI_Scatter(send_buff,size,MPI_INT,rbuf,size,MPI_INT,0,comm);
//    if(rank == 1)
//    {
//        printf("rank 1 colounm\n");
//        int m;
//        for(m = 0; m < size; m++)
//        {
//            printf("%d ",rbuf[m]);
//        }
//    }
    result = Multiplication((int **)matrix2,rbuf,size);
    MPI_Barrier(comm);//等待所有进程计算结束


    int *recv_buff;
    if(rank == 0)
        recv_buff = (int*)malloc(sizeof(int)*size*size); 
    MPI_Barrier(comm);
//    if(rank == 0)
//    {
//        printf("result is  :\n");
//        int m;
//        for(m = 0; m < size; m++)
//        {
//            printf("%d ",result[m]);
//        }
//        printf("\n");
//    }
//    if(rank == 1)
//    {
//        int m;
//        for(m = 0; m < size; m++)
//        {
//            printf("%d ",result[m]);
//        }
//        printf("\n");
//    }
//    if(rank == 2)
//    {
//        int m;
//        for(m = 0; m < size; m++)
//        {
//            printf("%d ",result[m]);
//        }
//        printf("\n");
//    }
//    printf("size is %d\n",size);
    MPI_Gather(result,size,MPI_INT,recv_buff,size,MPI_INT,0,comm);//收集各列数据
    //根进程进行输出
    if(rank == 0)
    {
        printf("\nresult is :\n");
        int m,n,tmp = 0;
        for(m = 0; m < size; m++)
        {
            for(n = 0;n < size;n++)
            {
                printf("%d ",recv_buff[tmp]);
                tmp++;
            }
            printf("\n");

        }
        printf("\n");
    }


    //MPI_Alltoall(result,size,MPI_INT,final_buff,size,MPI_INT,comm);
//
//    if(rank == 0)
//    {
//        int m;
//        for(m = 0; m < size; m++)
//        {
//            printf("%d ",final_buff[m]);
//        }
//    }

    MPI_Finalize();
    return 0;
}

运行结果:

如图所示,根据进程数,随机生成两个数组,得到相应的结果:
MPI编程----矩阵乘法