2
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <mpi.h>
const int ROWS = 2002;
const int COLS = 2002;
int arr[4][ROWS-1];
int t[ROWS][COLS];
void split(const std::string& str, const char delimiter, std::string* tokens, int size) {
std::stringstream ss(str);
std::string token;
int index = 0;
while (getline(ss, token, delimiter) && index < size) {
tokens[index++] = token;
}
}
int main(int argc, char* argv[]) {
int num_procs, rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if (rank == 0) {
std::ifstream file("data.csv");
std::string line;
int row = 0;
while (getline(file, line) && row < ROWS) {
std::string tokens[4];
split(line, ',', tokens, 4);
for (int col = 0; col < 4; col++) {
arr[col][row] = stoi(tokens[col]);
}
row++;
}
file.close();
// 使用arr数组将t数组初始化
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (i == 0 && j != 0 && j != (COLS - 1)) { // 上方
t[i][j] = arr[0][j-1];
}
else if (i == (ROWS - 1) && j != 0 && j != (COLS - 1)) { // 下方
t[i][j] = arr[1][j-1];
}
else if (j == 0 && i != 0 && i != (ROWS - 1)) { // 左方
t[i][j] = arr[2][i-1];
}
else if (j == (COLS - 1) && i != 0 && i != (ROWS - 1)) { // 右方
t[i][j] = arr[3][i-1];
}
else {
t[i][j] = 0;
}
}
}
}
// 使用MPI广播将arr数组发送给其他进程
MPI_Bcast(arr, 4 * (ROWS - 1), MPI_INT, 0, MPI_COMM_WORLD);
// 每个进程负责计算一部分数据
int start_row = rank * (ROWS - 2) / num_procs + 1;
int end_row = (rank + 1) * (ROWS - 2) / num_procs + 1;
for (int i = start_row; i < end_row; i++) {
for (int j = 1; j < COLS - 1; j++) {
// 进程间通信,将边界数据发送和接收
if (i == start_row) {
MPI_Send(&t[i - 1][j], 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD);
MPI_Recv(&t[i][j], 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
else if (i == end_row - 1) {
MPI_Recv(&t[i][j], 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Send(&t[i + 1][j], 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD);
}
t[i][j] = (t[i - 1][j] + t[i + 1][j] + t[i][j - 1] + t[i][j + 1]) / 4;
}
}
// 合并每个进程计算的结果
MPI_Gather(&t[start_row][0], (end_row - start_row) * COLS, MPI_INT, &t[start_row][0], (end_row - start_row) * COLS, MPI_INT, 0, MPI_COMM_WORLD);
if (rank == 0) {
// 打印最终结果
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
std::cout << t[i][j] << " ";
}
std::cout << std::endl;
}
}
MPI_Finalize();
return 0;
}