将子矩阵从主设备传递给从设备MPI

时间:2018-01-21 12:27:05

标签: c matrix mpi

我正在尝试学习MPI,我在其中一门课程中遇到了以下问题:

考虑尺寸为n * n的矩阵A,其中每个元素都是整数。给定2对索引(i1,j1)和(i2,j2)在矩阵A中找到这样的维度的子矩阵,其元素和是最大的。

我想要一些关于如何将子矩阵传递给进程的帮助。我应该首先计算矩阵中有多少个子矩阵并发送到每个进程N / s?我如何发送子矩阵?

我写的一些骨架代码:

#include<mpi.h>
#include<stdio.h>
#include<math.h>
#include<assert.h>
#include<iostream>

using namespace std;

#pragma comment (lib, "msmpi.lib")

enum CommunicationTag
{
    COMM_TAG_MASTER_SEND_TASK,
    COMM_TAG_MASTER_SEND_TERMINATE,
    COMM_TAG_SLAVE_SEND_RESULT,
};

void print_matrix(int mat[10][10], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }
}

int main(int argc, char *argv[]) {
    //0. Init part, finding rank and number of processes

    int numprocs, rank, rc;
    rc = MPI_Init(&argc, &argv);
    if (rc != MPI_SUCCESS) {
        printf("Error starting MPI program. Terminating \n");
        MPI_Abort(MPI_COMM_WORLD, rc);
    }

    MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    printf("I'm rank %d. Num procs %d\n", rank, numprocs); fflush(stdout);


//1. different machine code
    if (rank == 0)
    {
        int n;
        scanf("%d", &n);

        int i1, i2, j1, j2;
        scanf("%d%d%d%d", &i1, &i2, &j1, &j2);

        int mat[10][10];

        //init data
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++) {
                mat[i][j] = (rand() % 100) - 50; //init random between -50 and 49
            }

        print_matrix(mat, n);

//here; how do I pass the submatrices to the processes?
        for (int i = 1; i < numprocs; i++) {
            MPI_Send(&i1, 1, MPI_INT, i, COMM_TAG_MASTER_SEND_TASK, MPI_COMM_WORLD);
            MPI_Send(&i2, 1, MPI_INT, i, COMM_TAG_MASTER_SEND_TASK, MPI_COMM_WORLD);
            MPI_Send(&j1, 1, MPI_INT, i, COMM_TAG_MASTER_SEND_TASK, MPI_COMM_WORLD);
            MPI_Send(&j2, 1, MPI_INT, i, COMM_TAG_MASTER_SEND_TASK, MPI_COMM_WORLD);

//here; how do I pass the submatrices to the processes?
        }
    }
    else {
        //if slave ...

    }
    system("Pause");
}

1 个答案:

答案 0 :(得分:1)

第一步是停止考虑如何使用MPI_Send()。基本解决方案是使用MPI_Bcast()A传输到所有MPI进程。

然后划分工作(不需要为此进行通信,在每个过程中可以运行相同的划分逻辑)。计算每个MPI流程中的总和,并使用MPI_Gather()在主流程中收集它们。选择最大的,你就完成了。

它实际上只需要两个MPI操作:Bcast将输入数据分发到所有进程,并收集以集中结果。

请注意,所有MPI进程都需要以锁步方式一起执行集合操作。您只需要if (rank == 0)知道哪个进程应该加载矩阵并分析收集的结果。