forked from bartvdbraak/blender
Cleanup: remove task pool stop() and finished()
This commit is contained in:
parent
b10b7cdb43
commit
54e3487c9e
@ -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 */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user