From 07d25a83ff134f878a03752d4172d8e41c6a385d Mon Sep 17 00:00:00 2001 From: Timofei Ermak Date: Tue, 28 May 2019 16:05:24 +0300 Subject: [PATCH] Opt signal handling, LambdaGPUTask (#9) * Optional signal handling * The next level GPU tasks with lambda functions! * GPU calculations take a parameter --- CMakeLists.txt | 1 + include/cuq.h | 20 +++++++++++++++++++- src/cuq.cpp | 5 +++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0f496d..7ecef7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Werror cross-execution-space-call,reo set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_FLAGS "-O2 -Wall -Wextra -Wshadow -Wpedantic -Wnon-virtual-dtor -Wunused -Wdouble-promotion") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -rdynamic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") diff --git a/include/cuq.h b/include/cuq.h index 7138eb8..7273bc6 100644 --- a/include/cuq.h +++ b/include/cuq.h @@ -1,5 +1,6 @@ #include #include +#include #pragma once @@ -9,6 +10,23 @@ class GPUTask { virtual ~GPUTask(); }; +template +class LambdaGPUTask : public GPUTask { + public: + LambdaGPUTask(T _params, std::function _gpuCalculations) { + params = _params; + gpuCalculations = _gpuCalculations; + } + + void doWork() { + gpuCalculations(params); + } + + private: + T params; + std::function gpuCalculations; +}; + class GPUTasksQueue { public: bool resetDeviceAfterFinish; @@ -27,7 +45,7 @@ extern "C" void processTasks( GPUTask ** tasks, int taskCount, int requestedDevicesCount, - bool resetDeviceAfterFinish = false, bool deleteTasksAutomatically = true); + bool resetDeviceAfterFinish = false, bool deleteTasksAutomatically = true, bool handleSignals = true); extern "C" int occupyDevices(int requestedDevicesCount, int * occupiedDevicesIdxs, char * errorMsg); diff --git a/src/cuq.cpp b/src/cuq.cpp index 02469a6..72b4c68 100644 --- a/src/cuq.cpp +++ b/src/cuq.cpp @@ -104,9 +104,10 @@ extern "C" void processTasks( GPUTask ** tasks, int taskCount, int requestedDevicesCount, - bool resetDeviceAfterFinish, bool deleteTasksAutomatically) { + bool resetDeviceAfterFinish, bool deleteTasksAutomatically, bool handleSignals) { - signal(SIGSEGV, signalHandler); + if (handleSignals) + signal(SIGSEGV, signalHandler); char errorMsg[1000]; int devices[128];