gpt4 book ai didi

c - 将子矩阵从主 MPI 传递到从属 MPI

转载 作者:行者123 更新时间:2023-11-30 14:51:21 26 4
gpt4 key购买 nike

我正在尝试学习 MPI,但在我的一门类(class)中遇到了以下问题:

考虑一个维度为 n * n 的矩阵 A,其中每个元素都是整数。给定两对索引 (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");
}

最佳答案

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

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

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

请注意,所有 MPI 进程都需要同步执行集体操作。您只需要 if (rank == 0) 即可知道哪个进程应加载矩阵并分析收集的结果。

关于c - 将子矩阵从主 MPI 传递到从属 MPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48366736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com