欢迎光临散文网 会员登陆 & 注册

2

2023-06-22 15:29 作者:释o怀灬  | 我要投稿

#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;

}


2的评论 (共 条)

分享到微博请遵守国家法律