MPI:分布式3D矩阵和联合2D矩阵

问题描述

我必须解决以下练习:

编写一个创建3维矩阵(xyz)的MPI程序 在节点0上矩阵平均分配到所有节点。每个节点 确定每个xy坐标的最大z值并将其存储 在二维矩阵中。个别的部分解决方案应 最终可以在节点0处加入

我正在处理3个流程。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <mpi.h>

#define N 3

 

int maxValue(int* array,int _size);

int main(int argc,char** argv)
{   
    int rank;
    int size;
    
    MPI_Init (&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    
    int matrix2D[N][N];
    int xy[N][N];
    int c[N][N];
    
    int matrix3D[N][N][N] =   {
                    {
                        {1,1,1},{2,2,2},{3,3,3}
                    },{
                        {4,4,4},{5,5,5},{6,6,6}
                    },{
                        {7,7,7},{8,8,8},{9,16,9}
                    }
                };
                

    

    

    MPI_Scatter(matrix3D,N*N*N/size,MPI_INT,xy,MPI_COMM_WORLD);

    for (int x = 0; x < N; x++)
    {
        for (int y = 0; y < N; y++)
        {

            matrix2D[x][y] = maxValue(xy[x],N);

            
        }
        printf("\n");
    }

    MPI_Gather(matrix2D,N*N,c,MPI_COMM_WORLD);
    

    

    if (rank == 0)
    {
        for (int x = 0; x < N; x++)
        {
            for (int y = 0; y < N; y++)
            {

                    printf("%d,",matrix2D[x][y]);
            
            }
            printf("\n");
        }
    }
    
    MPI_Finalize();
    

}


int maxValue(int* array,int _size)
{
    int v = 0;
    
    for (int i = 0; i < _size; i++)
    {
        if (array[i] >= v)
        {
            v = array[i];
        }   
    }
    
    return v;
} 

如您所见,矩阵具有一些最大值。我对结果不满意,因为我的输出是:

1,

,我感觉自己的锻炼不完整。 如果我在if(rank == 0)子句中创建矩阵,则值将被破坏。 我不知道,对于发送和接收大小,我必须赋予分散和收集功能。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)