gpu_is_available
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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 (*)();
|
||||||
|
|
||||||
|
|||||||
13
src/main.cpp
13
src/main.cpp
@@ -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]);
|
||||||
|
|||||||
Reference in New Issue
Block a user