gpu_is_available

This commit is contained in:
2025-12-13 11:07:31 +00:00
parent 10bd6db2b8
commit f90a641754
3 changed files with 17 additions and 8 deletions

View File

@@ -19,6 +19,16 @@ gpu_is_available_fn load_gpu_is_available() {
return fn; return fn;
} }
bool gpu_is_available() {
auto gpu_is_available_fn = load_gpu_is_available();
if (gpu_is_available_fn && gpu_is_available_fn()) {
return true;
}
return false;
}
gpu_aggregate_days_fn load_gpu_aggregate_days() { gpu_aggregate_days_fn load_gpu_aggregate_days() {
void* h = get_gpu_lib_handle(); void* h = get_gpu_lib_handle();
if (!h) return nullptr; if (!h) return nullptr;

View File

@@ -3,6 +3,8 @@
#include "record.hpp" #include "record.hpp"
#include <vector> #include <vector>
bool gpu_is_available();
// Типы функций из GPU плагина // Типы функций из GPU плагина
using gpu_is_available_fn = int (*)(); using gpu_is_available_fn = int (*)();

View File

@@ -66,13 +66,10 @@ int main(int argc, char** argv) {
} }
omp_set_num_threads(num_cpu_threads + 1); // +1 для GPU потока если есть omp_set_num_threads(num_cpu_threads + 1); // +1 для GPU потока если есть
// ====== ЗАГРУЗКА GPU ФУНКЦИЙ ====== // Проверка доступности GPU
auto gpu_is_available = load_gpu_is_available(); bool have_gpu = gpu_is_available();
auto gpu_aggregate = load_gpu_aggregate_days();
bool have_gpu = false; if (have_gpu) {
if (gpu_is_available && gpu_is_available()) {
have_gpu = true;
std::cout << "Rank " << rank << ": GPU available + " << num_cpu_threads << " CPU threads" << std::endl; std::cout << "Rank " << rank << ": GPU available + " << num_cpu_threads << " CPU threads" << std::endl;
} else { } else {
std::cout << "Rank " << rank << ": " << num_cpu_threads << " CPU threads only" << std::endl; std::cout << "Rank " << rank << ": " << num_cpu_threads << " CPU threads only" << std::endl;
@@ -151,7 +148,7 @@ int main(int argc, char** argv) {
// Время работы: [0] = GPU (если есть), [1..n] = CPU потоки // Время работы: [0] = GPU (если есть), [1..n] = CPU потоки
std::vector<double> worker_times(num_cpu_threads + 1, 0.0); std::vector<double> worker_times(num_cpu_threads + 1, 0.0);
if (have_gpu && gpu_aggregate) { if (have_gpu) {
// GPU узел: делим на (1 + num_cpu_threads) частей // GPU узел: делим на (1 + num_cpu_threads) частей
int n_workers = 1 + num_cpu_threads; int n_workers = 1 + num_cpu_threads;
auto parts = split_records(local_records, n_workers); auto parts = split_records(local_records, n_workers);
@@ -166,7 +163,7 @@ int main(int argc, char** argv) {
double t0 = omp_get_wtime(); double t0 = omp_get_wtime();
if (tid == 0) { if (tid == 0) {
// GPU поток // GPU поток
success[0] = aggregate_days_gpu(parts[0], results[0], gpu_aggregate); success[0] = aggregate_days_gpu_simple(parts[0], results[0]);
} else { } else {
// CPU потоки // CPU потоки
results[tid] = aggregate_days(parts[tid]); results[tid] = aggregate_days(parts[tid]);