我正在尝试学习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");
}
答案 0 :(得分:1)
第一步是停止考虑如何使用MPI_Send()
。基本解决方案是使用MPI_Bcast()
将A
传输到所有MPI进程。
然后划分工作(不需要为此进行通信,在每个过程中可以运行相同的划分逻辑)。计算每个MPI流程中的总和,并使用MPI_Gather()
在主流程中收集它们。选择最大的,你就完成了。
它实际上只需要两个MPI操作:Bcast将输入数据分发到所有进程,并收集以集中结果。
请注意,所有MPI进程都需要以锁步方式一起执行集合操作。您只需要if (rank == 0)
知道哪个进程应该加载矩阵并分析收集的结果。