1
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <mpi.h>
using namespace std;
// 讀取 CSV 文件,并返回一個二維數(shù)組
vector<vector<double>> read_csv(string filename) {
? ? vector<vector<double>> data;
? ? ifstream file(filename);
? ? if (file.is_open()) {
? ? ? ? string line;
? ? ? ? while (getline(file, line)) {
? ? ? ? ? ? vector<double> row;
? ? ? ? ? ? size_t pos = 0;
? ? ? ? ? ? string token;
? ? ? ? ? ? while ((pos = line.find(",")) != string::npos) {
? ? ? ? ? ? ? ? token = line.substr(0, pos);
? ? ? ? ? ? ? ? row.push_back(stod(token));
? ? ? ? ? ? ? ? line.erase(0, pos + 1);
? ? ? ? ? ? }
? ? ? ? ? ? row.push_back(stod(line));
? ? ? ? ? ? data.push_back(row);
? ? ? ? }
? ? ? ? file.close();
? ? }
? ? return data;
}
// 計算一行數(shù)據(jù)的平均數(shù)
double mean(vector<double> row) {
? ? double sum = 0.0;
? ? for (double i : row) {
? ? ? ? sum += i;
? ? }
? ? return sum / double(row.size());
}
int main(int argc, char** argv) {
? ? // 初始化 MPI 環(huán)境
? ? int rank;
? ? int size;
? ? double start_time, end_time;
? ? start_time = MPI_Wtime();
? ? MPI_Init(&argc, &argv);
? ? MPI_Comm_size(MPI_COMM_WORLD, &size);
? ? MPI_Comm_rank(MPI_COMM_WORLD, &rank);
? ? // 讀取 CSV 文件
? ? vector<vector<double>> data = read_csv("data.csv");
? ? vector<double> local_means;
? ? // 計算每個進(jìn)程分配到的行數(shù)據(jù)的平均數(shù)
? ? int num_rows_per_proc = data.size() / size;
? ? for (int i = rank * num_rows_per_proc; i < (rank + 1) * num_rows_per_proc; i++) {
? ? ? ? double m = mean(data[i]);
? ? ? ? local_means.push_back(m);
? ? }
? ? // 等待所有進(jìn)程計算完成
? ? MPI_Barrier(MPI_COMM_WORLD);
? ? // 匯總所有進(jìn)程的結(jié)果
? ? int num_local_means = local_means.size();
? ? vector<double> all_means(num_local_means * size);
? ? MPI_Gather(&local_means[0], num_local_means, MPI_DOUBLE,
? ? ? ? ? ? ? ?&all_means[0], num_local_means, MPI_DOUBLE,
? ? ? ? ? ? ? ?0, MPI_COMM_WORLD);
? ? // 將結(jié)果輸出到新的 CSV 文件
? ? if (rank == 0) {
? ? ? ?
? ? ? ? ofstream file("result.csv");
? ? ? ? for (double m : all_means) {
? ? ? ? ? ? file << m << endl;
? ? ? ? }
? ? ? ? file.close();
? ? ? ? end_time = MPI_Wtime();
? ? ? ? printf("時間:%f秒\n", end_time - start_time);
? ? }
? ? // 結(jié)束 MPI 環(huán)境
? ? MPI_Finalize();
? ? return 0;
}