Cycles: Use special debug panel to fine-tune debug flags

This panel is only visible when debug_value is set to 256 and has no
affect in other cases. However, if debug value is not set to this
value, environment variables will be used to control which features
are enabled, so there's no visible changes to anyone in fact.

There are some changes needed to prevent devices re-enumeration on
every Cycles session create.

Reviewers: juicyfruit, lukasstockner97, dingto, brecht

Reviewed By: lukasstockner97, dingto

Differential Revision: https://developer.blender.org/D1720
This commit is contained in:
Sergey Sharybin
2016-01-12 16:00:48 +05:00
parent c6c223ade6
commit ac7aefd7c2
12 changed files with 561 additions and 89 deletions

View File

@@ -0,0 +1,164 @@
/*
* Copyright 2011-2016 Blender Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "util_debug.h"
#include <stdlib.h>
#include "util_logging.h"
#include "util_string.h"
CCL_NAMESPACE_BEGIN
DebugFlags::CPU::CPU()
: avx2(true),
avx(true),
sse41(true),
sse3(true),
sse2(true)
{
reset();
}
void DebugFlags::CPU::reset()
{
#define STRINGIFY(x) #x
#define CHECK_CPU_FLAGS(flag, env) \
do { \
flag = (getenv(env) == NULL); \
if(!flag) { \
VLOG(1) << "Disabling " << STRINGIFY(flag) << " instruction set."; \
} \
} while(0)
CHECK_CPU_FLAGS(avx2, "CYCLES_CPU_NO_AVX2");
CHECK_CPU_FLAGS(avx, "CYCLES_CPU_NO_AVX");
CHECK_CPU_FLAGS(sse41, "CYCLES_CPU_NO_SSE41");
CHECK_CPU_FLAGS(sse3, "CYCLES_CPU_NO_SSE3");
CHECK_CPU_FLAGS(sse2, "CYCLES_CPU_NO_SSE2");
#undef STRINGIFY
#undef CHECK_CPU_FLAGS
}
DebugFlags::OpenCL::OpenCL()
: device_type(DebugFlags::OpenCL::DEVICE_ALL),
kernel_type(DebugFlags::OpenCL::KERNEL_DEFAULT),
debug(false)
{
reset();
}
void DebugFlags::OpenCL::reset()
{
/* Initialize device type from environment variables. */
device_type = DebugFlags::OpenCL::DEVICE_ALL;
char *device = getenv("CYCLES_OPENCL_TEST");
if(device) {
if(strcmp(device, "NONE") == 0) {
device_type = DebugFlags::OpenCL::DEVICE_NONE;
}
else if(strcmp(device, "ALL") == 0) {
device_type = DebugFlags::OpenCL::DEVICE_ALL;
}
else if(strcmp(device, "DEFAULT") == 0) {
device_type = DebugFlags::OpenCL::DEVICE_DEFAULT;
}
else if(strcmp(device, "CPU") == 0) {
device_type = DebugFlags::OpenCL::DEVICE_CPU;
}
else if(strcmp(device, "GPU") == 0) {
device_type = DebugFlags::OpenCL::DEVICE_GPU;
}
else if(strcmp(device, "ACCELERATOR") == 0) {
device_type = DebugFlags::OpenCL::DEVICE_ACCELERATOR;
}
}
/* Initialize kernel type from environment variables. */
kernel_type = DebugFlags::OpenCL::KERNEL_DEFAULT;
if(getenv("CYCLES_OPENCL_MEGA_KERNEL_TEST") != NULL) {
kernel_type = DebugFlags::OpenCL::KERNEL_MEGA;
}
else if(getenv("CYCLES_OPENCL_MEGA_KERNEL_TEST") != NULL) {
kernel_type = DebugFlags::OpenCL::KERNEL_SPLIT;
}
/* Initialize other flags from environment variables. */
debug = (getenv("CYCLES_OPENCL_DEBUG") != NULL);
}
DebugFlags::DebugFlags()
{
/* Nothing for now. */
}
void DebugFlags::reset()
{
cpu.reset();
opencl.reset();
}
std::ostream& operator <<(std::ostream &os,
const DebugFlagsRef debug_flags)
{
os << "CPU flags:\n"
<< " AVX2 : " << string_from_bool(debug_flags.cpu.avx2) << "\n"
<< " AVX : " << string_from_bool(debug_flags.cpu.avx) << "\n"
<< " SSE4.1 : " << string_from_bool(debug_flags.cpu.sse41) << "\n"
<< " SSE3 : " << string_from_bool(debug_flags.cpu.sse3) << "\n"
<< " SSE2 : " << string_from_bool(debug_flags.cpu.sse2) << "\n";
const char *opencl_device_type,
*opencl_kernel_type;
switch(debug_flags.opencl.device_type) {
case DebugFlags::OpenCL::DEVICE_NONE:
opencl_device_type = "NONE";
break;
case DebugFlags::OpenCL::DEVICE_ALL:
opencl_device_type = "ALL";
break;
case DebugFlags::OpenCL::DEVICE_DEFAULT:
opencl_device_type = "DEFAULT";
break;
case DebugFlags::OpenCL::DEVICE_CPU:
opencl_device_type = "CPU";
break;
case DebugFlags::OpenCL::DEVICE_GPU:
opencl_device_type = "GPU";
break;
case DebugFlags::OpenCL::DEVICE_ACCELERATOR:
opencl_device_type = "ACCELERATOR";
break;
}
switch(debug_flags.opencl.kernel_type) {
case DebugFlags::OpenCL::KERNEL_DEFAULT:
opencl_kernel_type = "DEFAULT";
break;
case DebugFlags::OpenCL::KERNEL_MEGA:
opencl_kernel_type = "MEGA";
break;
case DebugFlags::OpenCL::KERNEL_SPLIT:
opencl_kernel_type = "SPLIT";
break;
}
os << "OpenCL flags:\n"
<< " Device type : " << opencl_device_type << "\n"
<< " Kernel type : " << opencl_kernel_type << "\n"
<< " Debug : " << string_from_bool(debug_flags.opencl.debug)
<< "\n";
return os;
}
CCL_NAMESPACE_END