forked from bartvdbraak/blender
Cycles: Add artificial memory limit debug option for OpenCL
This commit is contained in:
parent
95b345b2fe
commit
9c3f1ad003
@ -703,6 +703,9 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
||||
|
||||
cls.debug_use_opencl_debug = BoolProperty(name="Debug OpenCL", default=False)
|
||||
|
||||
cls.debug_opencl_mem_limit = IntProperty(name="Memory limit", default=0,
|
||||
description="Artificial limit on OpenCL memory usage in MB (0 to disable limit)")
|
||||
|
||||
@classmethod
|
||||
def unregister(cls):
|
||||
del bpy.types.Scene.cycles
|
||||
|
@ -1608,6 +1608,7 @@ class CyclesRender_PT_debug(CyclesButtonsPanel, Panel):
|
||||
col.prop(cscene, "debug_opencl_device_type", text="Device")
|
||||
col.prop(cscene, "debug_opencl_kernel_single_program", text="Single Program")
|
||||
col.prop(cscene, "debug_use_opencl_debug", text="Debug")
|
||||
col.prop(cscene, "debug_opencl_mem_limit")
|
||||
|
||||
|
||||
class CyclesParticle_PT_CurveSettings(CyclesButtonsPanel, Panel):
|
||||
|
@ -106,6 +106,7 @@ bool debug_flags_sync_from_scene(BL::Scene b_scene)
|
||||
}
|
||||
/* Synchronize other OpenCL flags. */
|
||||
flags.opencl.debug = get_boolean(cscene, "debug_use_opencl_debug");
|
||||
flags.opencl.mem_limit = ((size_t)get_int(cscene, "debug_opencl_mem_limit"))*1024*1024;
|
||||
flags.opencl.single_program = get_boolean(cscene, "debug_opencl_kernel_single_program");
|
||||
return flags.opencl.device_type != opencl_device_type ||
|
||||
flags.opencl.kernel_type != opencl_kernel_type;
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include "kernel/kernel_types.h"
|
||||
|
||||
#include "util/util_algorithm.h"
|
||||
#include "util/util_foreach.h"
|
||||
#include "util/util_logging.h"
|
||||
#include "util/util_md5.h"
|
||||
@ -280,6 +281,10 @@ void OpenCLDeviceBase::mem_alloc(const char *name, device_memory& mem, MemoryTyp
|
||||
cl_ulong max_alloc_size = 0;
|
||||
clGetDeviceInfo(cdDevice, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(cl_ulong), &max_alloc_size, NULL);
|
||||
|
||||
if(DebugFlags().opencl.mem_limit) {
|
||||
max_alloc_size = min(max_alloc_size, DebugFlags().opencl.mem_limit - stats.mem_used);
|
||||
}
|
||||
|
||||
if(size > max_alloc_size) {
|
||||
string error = "Scene too complex to fit in available memory.";
|
||||
if(name != NULL) {
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
#include "device/device_split_kernel.h"
|
||||
|
||||
#include "util/util_algorithm.h"
|
||||
#include "util/util_logging.h"
|
||||
#include "util/util_md5.h"
|
||||
#include "util/util_path.h"
|
||||
@ -423,6 +424,11 @@ public:
|
||||
|
||||
cl_ulong max_buffer_size;
|
||||
clGetDeviceInfo(device->cdDevice, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(cl_ulong), &max_buffer_size, NULL);
|
||||
|
||||
if(DebugFlags().opencl.mem_limit) {
|
||||
max_buffer_size = min(max_buffer_size, DebugFlags().opencl.mem_limit - device->stats.mem_used);
|
||||
}
|
||||
|
||||
VLOG(1) << "Maximum device allocation size: "
|
||||
<< string_human_readable_number(max_buffer_size) << " bytes. ("
|
||||
<< string_human_readable_size(max_buffer_size) << ").";
|
||||
|
@ -184,8 +184,8 @@ std::ostream& operator <<(std::ostream &os,
|
||||
<< " Device type : " << opencl_device_type << "\n"
|
||||
<< " Kernel type : " << opencl_kernel_type << "\n"
|
||||
<< " Debug : " << string_from_bool(debug_flags.opencl.debug) << "\n"
|
||||
<< " Single program : " << string_from_bool(debug_flags.opencl.single_program)
|
||||
<< "\n";
|
||||
<< " Single program : " << string_from_bool(debug_flags.opencl.single_program) << "\n"
|
||||
<< " Memory limit : " << string_human_readable_size(debug_flags.opencl.mem_limit) << "\n";
|
||||
return os;
|
||||
}
|
||||
|
||||
|
@ -115,6 +115,10 @@ public:
|
||||
|
||||
/* Use single program */
|
||||
bool single_program;
|
||||
|
||||
/* TODO(mai): Currently this is only for OpenCL, but we should have it implemented for all devices. */
|
||||
/* Artificial memory limit in bytes (0 if disabled). */
|
||||
size_t mem_limit;
|
||||
};
|
||||
|
||||
/* Get instance of debug flags registry. */
|
||||
|
Loading…
Reference in New Issue
Block a user