На GPU вычисления

This commit is contained in:
2025-12-02 12:39:09 +00:00
parent 78bdb1ddb7
commit 73c9e580e4
5 changed files with 344 additions and 17 deletions

View File

@@ -34,6 +34,18 @@ int main(int argc, char** argv) {
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// ====== ЗАГРУЗКА GPU ФУНКЦИЙ ======
auto gpu_is_available = load_gpu_is_available();
auto gpu_aggregate = load_gpu_aggregate_days();
bool have_gpu = false;
if (gpu_is_available && gpu_is_available()) {
have_gpu = true;
std::cout << "Rank " << rank << ": GPU available" << std::endl;
} else {
std::cout << "Rank " << rank << ": GPU not available, using CPU" << std::endl;
}
std::vector<Record> local_records;
if (rank == 0) {
@@ -75,10 +87,26 @@ int main(int argc, char** argv) {
std::cout << "Rank " << rank << " received "
<< local_records.size() << " records" << std::endl;
// ====== АГРЕГАЦИЯ НА КАЖДОМ УЗЛЕ ======
auto local_stats = aggregate_days(local_records);
std::cout << "Rank " << rank << " aggregated "
<< local_stats.size() << " days" << std::endl;
// ====== АГРЕГАЦИЯ НА КАЖДОМ УЗЛЕ (GPU или CPU) ======
std::vector<DayStats> local_stats;
if (have_gpu && gpu_aggregate) {
bool gpu_success = aggregate_days_gpu(local_records, local_stats, gpu_aggregate);
if (gpu_success) {
std::cout << "Rank " << rank << " aggregated "
<< local_stats.size() << " days (GPU)" << std::endl;
} else {
// Fallback на CPU при ошибке GPU
std::cout << "Rank " << rank << ": GPU aggregation failed, falling back to CPU" << std::endl;
local_stats = aggregate_days(local_records);
std::cout << "Rank " << rank << " aggregated "
<< local_stats.size() << " days (CPU)" << std::endl;
}
} else {
local_stats = aggregate_days(local_records);
std::cout << "Rank " << rank << " aggregated "
<< local_stats.size() << " days (CPU)" << std::endl;
}
// ====== СБОР АГРЕГИРОВАННЫХ ДАННЫХ НА RANK 0 ======
std::vector<DayStats> all_stats;
@@ -134,15 +162,6 @@ int main(int argc, char** argv) {
}
}
// Проверка GPU (оставляем как есть)
auto gpu_is_available = load_gpu_is_available();
int have_gpu = 0;
if (gpu_is_available) {
std::cout << "Rank " << rank << " dll loaded" << std::endl;
have_gpu = gpu_is_available();
}
std::cout << "Rank " << rank << ": gpu_available=" << have_gpu << "\n";
MPI_Finalize();
return 0;
}