Cleanup: remove task pool stop() and finished()

This commit is contained in:
Brecht Van Lommel 2020-06-05 14:36:31 +02:00
parent b10b7cdb43
commit 54e3487c9e
7 changed files with 22 additions and 39 deletions

@ -243,7 +243,7 @@ CUDADevice::CUDADevice(DeviceInfo &info, Stats &stats, Profiler &profiler, bool
CUDADevice::~CUDADevice() CUDADevice::~CUDADevice()
{ {
task_pool.stop(); task_pool.cancel();
delete split_kernel; delete split_kernel;

@ -333,7 +333,7 @@ class CPUDevice : public Device {
~CPUDevice() ~CPUDevice()
{ {
task_pool.stop(); task_pool.cancel();
texture_info.free(); texture_info.free();
} }

@ -246,7 +246,7 @@ class OptiXDevice : public CUDADevice {
~OptiXDevice() ~OptiXDevice()
{ {
// Stop processing any more tasks // Stop processing any more tasks
task_pool.stop(); task_pool.cancel();
// Make CUDA context current // Make CUDA context current
const CUDAContextScope scope(cuContext); const CUDAContextScope scope(cuContext);

@ -259,6 +259,8 @@ class OpenCLDevice : public Device {
TaskPool load_required_kernel_task_pool; TaskPool load_required_kernel_task_pool;
/* Task pool for optional kernels (feature kernels during foreground rendering) */ /* Task pool for optional kernels (feature kernels during foreground rendering) */
TaskPool load_kernel_task_pool; TaskPool load_kernel_task_pool;
std::atomic<int> load_kernel_num_compiling;
cl_context cxContext; cl_context cxContext;
cl_command_queue cqCommandQueue; cl_command_queue cqCommandQueue;
cl_platform_id cpPlatform; cl_platform_id cpPlatform;

@ -610,6 +610,7 @@ void OpenCLDevice::opencl_assert_err(cl_int err, const char *where)
OpenCLDevice::OpenCLDevice(DeviceInfo &info, Stats &stats, Profiler &profiler, bool background) OpenCLDevice::OpenCLDevice(DeviceInfo &info, Stats &stats, Profiler &profiler, bool background)
: Device(info, stats, profiler, background), : Device(info, stats, profiler, background),
load_kernel_num_compiling(0),
kernel_programs(this), kernel_programs(this),
preview_programs(this), preview_programs(this),
memory_manager(this), memory_manager(this),
@ -684,9 +685,9 @@ OpenCLDevice::OpenCLDevice(DeviceInfo &info, Stats &stats, Profiler &profiler, b
OpenCLDevice::~OpenCLDevice() OpenCLDevice::~OpenCLDevice()
{ {
task_pool.stop(); task_pool.cancel();
load_required_kernel_task_pool.stop(); load_required_kernel_task_pool.cancel();
load_kernel_task_pool.stop(); load_kernel_task_pool.cancel();
memory_manager.free(); memory_manager.free();
@ -798,7 +799,11 @@ bool OpenCLDevice::load_kernels(const DeviceRequestedFeatures &requested_feature
* internally within a single process. */ * internally within a single process. */
foreach (OpenCLProgram *program, programs) { foreach (OpenCLProgram *program, programs) {
if (!program->load()) { if (!program->load()) {
load_kernel_task_pool.push(function_bind(&OpenCLProgram::compile, program)); load_kernel_num_compiling++;
load_kernel_task_pool.push([&] {
program->compile();
load_kernel_num_compiling--;
});
} }
} }
return true; return true;
@ -868,7 +873,7 @@ bool OpenCLDevice::wait_for_availability(const DeviceRequestedFeatures &requeste
* Better to check on device level than per kernel as mixing preview and * Better to check on device level than per kernel as mixing preview and
* non-preview kernels does not work due to different data types */ * non-preview kernels does not work due to different data types */
if (use_preview_kernels) { if (use_preview_kernels) {
use_preview_kernels = !load_kernel_task_pool.finished(); use_preview_kernels = load_kernel_num_compiling.load() > 0;
} }
} }
return split_kernel->load_kernels(requested_features); return split_kernel->load_kernels(requested_features);
@ -895,7 +900,7 @@ DeviceKernelStatus OpenCLDevice::get_active_kernel_switch_state()
return DEVICE_KERNEL_USING_FEATURE_KERNEL; return DEVICE_KERNEL_USING_FEATURE_KERNEL;
} }
bool other_kernels_finished = load_kernel_task_pool.finished(); bool other_kernels_finished = load_kernel_num_compiling.load() == 0;
if (use_preview_kernels) { if (use_preview_kernels) {
if (other_kernels_finished) { if (other_kernels_finished) {
return DEVICE_KERNEL_FEATURE_KERNEL_AVAILABLE; return DEVICE_KERNEL_FEATURE_KERNEL_AVAILABLE;

@ -46,7 +46,7 @@ TaskPool::TaskPool()
TaskPool::~TaskPool() TaskPool::~TaskPool()
{ {
stop(); cancel();
} }
void TaskPool::push(TaskRunFunction &&task, bool front) void TaskPool::push(TaskRunFunction &&task, bool front)
@ -135,24 +135,11 @@ void TaskPool::cancel()
do_cancel = false; do_cancel = false;
} }
void TaskPool::stop()
{
TaskScheduler::clear(this);
assert(num == 0);
}
bool TaskPool::canceled() bool TaskPool::canceled()
{ {
return do_cancel; return do_cancel;
} }
bool TaskPool::finished()
{
thread_scoped_lock num_lock(num_mutex);
return num == 0;
}
void TaskPool::num_decrease(int done) void TaskPool::num_decrease(int done)
{ {
num_mutex.lock(); num_mutex.lock();
@ -453,7 +440,11 @@ DedicatedTaskPool::DedicatedTaskPool()
DedicatedTaskPool::~DedicatedTaskPool() DedicatedTaskPool::~DedicatedTaskPool()
{ {
stop(); wait();
do_exit = true;
queue_cond.notify_all();
worker_thread->join(); worker_thread->join();
delete worker_thread; delete worker_thread;
} }
@ -491,18 +482,6 @@ void DedicatedTaskPool::cancel()
do_cancel = false; do_cancel = false;
} }
void DedicatedTaskPool::stop()
{
clear();
do_exit = true;
queue_cond.notify_all();
wait();
assert(num == 0);
}
bool DedicatedTaskPool::canceled() bool DedicatedTaskPool::canceled()
{ {
return do_cancel; return do_cancel;

@ -66,8 +66,6 @@ class TaskPool {
void wait_work(Summary *stats = NULL); /* work and wait until all tasks are done */ void wait_work(Summary *stats = NULL); /* work and wait until all tasks are done */
void cancel(); /* cancel all tasks, keep worker threads running */ void cancel(); /* cancel all tasks, keep worker threads running */
void stop(); /* stop all worker threads */
bool finished(); /* check if all work has been completed */
bool canceled(); /* for worker threads, test if canceled */ bool canceled(); /* for worker threads, test if canceled */
@ -155,7 +153,6 @@ class DedicatedTaskPool {
void wait(); /* wait until all tasks are done */ void wait(); /* wait until all tasks are done */
void cancel(); /* cancel all tasks, keep worker thread running */ void cancel(); /* cancel all tasks, keep worker thread running */
void stop(); /* stop worker thread */
bool canceled(); /* for worker thread, test if canceled */ bool canceled(); /* for worker thread, test if canceled */