diff --git a/bitcoin-project/src/main.cpp b/bitcoin-project/src/main.cpp index dcc6355..cc58363 100644 --- a/bitcoin-project/src/main.cpp +++ b/bitcoin-project/src/main.cpp @@ -1,13 +1,74 @@ -#include #include +#include +#include +#include + #include "csv_loader.hpp" #include "utils.hpp" -#include "mpi_utils.hpp" +#include "record.hpp" + +// Функция: отобрать записи для конкретного ранга +std::vector select_records_for_rank( + const std::map>& days, + const std::vector& day_list) +{ + std::vector out; + for (auto d : day_list) { + auto it = days.find(d); + if (it != days.end()) { + const auto& vec = it->second; + out.insert(out.end(), vec.begin(), vec.end()); + } + } + return out; +} int main(int argc, char** argv) { MPI_Init(&argc, &argv); - mpi_test(); // просто тест, что всё работает + int rank, size; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + std::vector local_records; + + if (rank == 0) { + std::cout << "Rank 0 loading CSV..." << std::endl; + + auto records = load_csv("data/data.csv"); + + auto days = group_by_day(records); + auto parts = split_days(days, size); + + // Рассылаем данные + for (int r = 0; r < size; r++) { + auto vec = select_records_for_rank(days, parts[r]); + + if (r == 0) { + // себе не отправляем — сразу сохраняем + local_records = vec; + continue; + } + + int count = vec.size(); + MPI_Send(&count, 1, MPI_INT, r, 0, MPI_COMM_WORLD); + MPI_Send(vec.data(), count * sizeof(Record), MPI_BYTE, r, 1, MPI_COMM_WORLD); + } + } + else { + // Принимает данные + int count = 0; + MPI_Recv(&count, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + + local_records.resize(count); + MPI_Recv(local_records.data(), count * sizeof(Record), + MPI_BYTE, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE); + } + + MPI_Barrier(MPI_COMM_WORLD); + + std::cout << "Rank " << rank << " received " + << local_records.size() << " records" << std::endl; MPI_Finalize(); return 0; diff --git a/bitcoin-project/src/mpi_utils.cpp b/bitcoin-project/src/mpi_utils.cpp index 2bf2274..7fd29f4 100644 --- a/bitcoin-project/src/mpi_utils.cpp +++ b/bitcoin-project/src/mpi_utils.cpp @@ -1,9 +1,9 @@ +#include "mpi_utils.hpp" #include #include -void mpi_test() { +void mpi_print_basic() { int rank, size; - MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); diff --git a/bitcoin-project/src/mpi_utils.hpp b/bitcoin-project/src/mpi_utils.hpp index 5563bd9..d712c41 100644 --- a/bitcoin-project/src/mpi_utils.hpp +++ b/bitcoin-project/src/mpi_utils.hpp @@ -1,2 +1,2 @@ #pragma once -void mpi_test(); +void mpi_print_basic();