forked from bartvdbraak/blender
Cycles: Add logging to detected OpenCL platforms and devices
Happens on verbosity level 2, should help looking into some of the bug reports in the tracker.
This commit is contained in:
parent
7ad9ca72dd
commit
a79d47b14e
@ -64,10 +64,20 @@ CCL_NAMESPACE_BEGIN
|
|||||||
|
|
||||||
struct OpenCLPlatformDevice {
|
struct OpenCLPlatformDevice {
|
||||||
OpenCLPlatformDevice(cl_platform_id platform_id,
|
OpenCLPlatformDevice(cl_platform_id platform_id,
|
||||||
cl_device_id device_id)
|
const string& platform_name,
|
||||||
: platform_id(platform_id), device_id(device_id) {}
|
cl_device_id device_id,
|
||||||
|
cl_device_type device_type,
|
||||||
|
const string& device_name)
|
||||||
|
: platform_id(platform_id),
|
||||||
|
platform_name(platform_name),
|
||||||
|
device_id(device_id),
|
||||||
|
device_type(device_type),
|
||||||
|
device_name(device_name) {}
|
||||||
cl_platform_id platform_id;
|
cl_platform_id platform_id;
|
||||||
|
string platform_name;
|
||||||
cl_device_id device_id;
|
cl_device_id device_id;
|
||||||
|
cl_device_type device_type;
|
||||||
|
string device_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@ -212,8 +222,14 @@ void opencl_get_usable_devices(vector<OpenCLPlatformDevice> *usable_devices)
|
|||||||
(getenv("CYCLES_OPENCL_TEST") != NULL) ||
|
(getenv("CYCLES_OPENCL_TEST") != NULL) ||
|
||||||
(getenv("CYCLES_OPENCL_SPLIT_KERNEL_TEST")) != NULL;
|
(getenv("CYCLES_OPENCL_SPLIT_KERNEL_TEST")) != NULL;
|
||||||
const cl_device_type device_type = opencl_device_type();
|
const cl_device_type device_type = opencl_device_type();
|
||||||
|
static bool first_time = true;
|
||||||
|
#define FIRST_VLOG(severity) if(first_time) VLOG(severity)
|
||||||
|
|
||||||
|
usable_devices->clear();
|
||||||
|
|
||||||
if(device_type == 0) {
|
if(device_type == 0) {
|
||||||
|
FIRST_VLOG(2) << "OpenCL devices are forced to be disabled.";
|
||||||
|
first_time = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,33 +238,50 @@ void opencl_get_usable_devices(vector<OpenCLPlatformDevice> *usable_devices)
|
|||||||
vector<cl_platform_id> platform_ids;
|
vector<cl_platform_id> platform_ids;
|
||||||
cl_uint num_platforms = 0;
|
cl_uint num_platforms = 0;
|
||||||
|
|
||||||
/* Number of the devices added to the device info list. */
|
|
||||||
cl_uint num_added_devices = 0;
|
|
||||||
|
|
||||||
/* Get devices. */
|
/* Get devices. */
|
||||||
if(clGetPlatformIDs(0, NULL, &num_platforms) != CL_SUCCESS ||
|
if(clGetPlatformIDs(0, NULL, &num_platforms) != CL_SUCCESS ||
|
||||||
num_platforms == 0)
|
num_platforms == 0)
|
||||||
{
|
{
|
||||||
|
FIRST_VLOG(2) << "No OpenCL platforms were found.";
|
||||||
|
first_time = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
platform_ids.resize(num_platforms);
|
platform_ids.resize(num_platforms);
|
||||||
if(clGetPlatformIDs(num_platforms, &platform_ids[0], NULL) != CL_SUCCESS) {
|
if(clGetPlatformIDs(num_platforms, &platform_ids[0], NULL) != CL_SUCCESS) {
|
||||||
|
FIRST_VLOG(2) << "Failed to fetch platform IDs from the driver..";
|
||||||
|
first_time = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* Devices are numbered consecutively across platforms. */
|
/* Devices are numbered consecutively across platforms. */
|
||||||
int num_base = 0;
|
for(int platform = 0; platform < num_platforms; platform++) {
|
||||||
for(int platform = 0;
|
|
||||||
platform < num_platforms;
|
|
||||||
platform++, num_base += num_added_devices)
|
|
||||||
{
|
|
||||||
cl_platform_id platform_id = platform_ids[platform];
|
cl_platform_id platform_id = platform_ids[platform];
|
||||||
num_devices = num_added_devices = 0;
|
char pname[256];
|
||||||
|
if(clGetPlatformInfo(platform_id,
|
||||||
|
CL_PLATFORM_NAME,
|
||||||
|
sizeof(pname),
|
||||||
|
&pname,
|
||||||
|
NULL) != CL_SUCCESS)
|
||||||
|
{
|
||||||
|
FIRST_VLOG(2) << "Failed to get platform name, ignoring.";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string platform_name = pname;
|
||||||
|
FIRST_VLOG(2) << "Enumerating devices for platform "
|
||||||
|
<< platform_name << ".";
|
||||||
|
if(!opencl_platform_version_check(platform_id)) {
|
||||||
|
FIRST_VLOG(2) << "Ignoring platform " << platform_name
|
||||||
|
<< " due to too old compiler version.";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
num_devices = 0;
|
||||||
if(clGetDeviceIDs(platform_id,
|
if(clGetDeviceIDs(platform_id,
|
||||||
device_type,
|
device_type,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
&num_devices) != CL_SUCCESS || num_devices == 0)
|
&num_devices) != CL_SUCCESS || num_devices == 0)
|
||||||
{
|
{
|
||||||
|
FIRST_VLOG(2) << "Ignoring platform " << platform_name
|
||||||
|
<< ", failed to fetch number of devices.";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
device_ids.resize(num_devices);
|
device_ids.resize(num_devices);
|
||||||
@ -258,31 +291,55 @@ void opencl_get_usable_devices(vector<OpenCLPlatformDevice> *usable_devices)
|
|||||||
&device_ids[0],
|
&device_ids[0],
|
||||||
NULL) != CL_SUCCESS)
|
NULL) != CL_SUCCESS)
|
||||||
{
|
{
|
||||||
|
FIRST_VLOG(2) << "Ignoring platform " << platform_name
|
||||||
|
<< ", failed to fetch devices list.";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(!opencl_platform_version_check(platform_ids[platform])) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
char pname[256];
|
|
||||||
clGetPlatformInfo(platform_id,
|
|
||||||
CL_PLATFORM_NAME,
|
|
||||||
sizeof(pname),
|
|
||||||
&pname,
|
|
||||||
NULL);
|
|
||||||
string platform_name = pname;
|
|
||||||
for(int num = 0; num < num_devices; num++) {
|
for(int num = 0; num < num_devices; num++) {
|
||||||
cl_device_id device_id = device_ids[num];
|
cl_device_id device_id = device_ids[num];
|
||||||
|
char device_name[1024] = "\0";
|
||||||
|
if(clGetDeviceInfo(device_id,
|
||||||
|
CL_DEVICE_NAME,
|
||||||
|
sizeof(device_name),
|
||||||
|
&device_name,
|
||||||
|
NULL) != CL_SUCCESS)
|
||||||
|
{
|
||||||
|
FIRST_VLOG(2) << "Failed to fetch device name, ignoring.";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if(!opencl_device_version_check(device_id)) {
|
if(!opencl_device_version_check(device_id)) {
|
||||||
|
FIRST_VLOG(2) << "Ignoting device " << device_name
|
||||||
|
<< " due to old compiler version.";
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(force_all_platforms ||
|
if(force_all_platforms ||
|
||||||
opencl_device_supported(platform_name, device_id))
|
opencl_device_supported(platform_name, device_id))
|
||||||
{
|
{
|
||||||
|
cl_device_type device_type;
|
||||||
|
if(clGetDeviceInfo(device_id,
|
||||||
|
CL_DEVICE_TYPE,
|
||||||
|
sizeof(cl_device_type),
|
||||||
|
&device_type,
|
||||||
|
NULL) != CL_SUCCESS)
|
||||||
|
{
|
||||||
|
FIRST_VLOG(2) << "Ignoting device " << device_name
|
||||||
|
<< ", faield to fetch device type.";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
FIRST_VLOG(2) << "Adding new device " << device_name << ".";
|
||||||
usable_devices->push_back(OpenCLPlatformDevice(platform_id,
|
usable_devices->push_back(OpenCLPlatformDevice(platform_id,
|
||||||
device_id));
|
platform_name,
|
||||||
|
device_id,
|
||||||
|
device_type,
|
||||||
|
device_name));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
FIRST_VLOG(2) << "Ignoting device " << device_name
|
||||||
|
<< ", not officially supported yet.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
first_time = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
} /* namespace */
|
} /* namespace */
|
||||||
@ -616,9 +673,10 @@ public:
|
|||||||
OpenCLPlatformDevice& platform_device = usable_devices[info.num];
|
OpenCLPlatformDevice& platform_device = usable_devices[info.num];
|
||||||
cpPlatform = platform_device.platform_id;
|
cpPlatform = platform_device.platform_id;
|
||||||
cdDevice = platform_device.device_id;
|
cdDevice = platform_device.device_id;
|
||||||
char name[256];
|
platform_name = platform_device.platform_name;
|
||||||
clGetPlatformInfo(cpPlatform, CL_PLATFORM_NAME, sizeof(name), &name, NULL);
|
VLOG(2) << "Creating new Cycles device for OpenCL platform "
|
||||||
platform_name = name;
|
<< platform_name << ", device "
|
||||||
|
<< platform_device.device_name << ".";
|
||||||
|
|
||||||
{
|
{
|
||||||
/* try to use cached context */
|
/* try to use cached context */
|
||||||
@ -3383,28 +3441,9 @@ Device *device_opencl_create(DeviceInfo& info, Stats &stats, bool background)
|
|||||||
vector<OpenCLPlatformDevice> usable_devices;
|
vector<OpenCLPlatformDevice> usable_devices;
|
||||||
opencl_get_usable_devices(&usable_devices);
|
opencl_get_usable_devices(&usable_devices);
|
||||||
assert(info.num < usable_devices.size());
|
assert(info.num < usable_devices.size());
|
||||||
OpenCLPlatformDevice& platform_device = usable_devices[info.num];
|
const OpenCLPlatformDevice& platform_device = usable_devices[info.num];
|
||||||
char name[256];
|
const string& platform_name = platform_device.platform_name;
|
||||||
if(clGetPlatformInfo(platform_device.platform_id,
|
const cl_device_type device_type = platform_device.device_type;
|
||||||
CL_PLATFORM_NAME,
|
|
||||||
sizeof(name),
|
|
||||||
&name,
|
|
||||||
NULL) != CL_SUCCESS)
|
|
||||||
{
|
|
||||||
VLOG(1) << "Failed to retrieve platform name, using mega kernel.";
|
|
||||||
return new OpenCLDeviceMegaKernel(info, stats, background);
|
|
||||||
}
|
|
||||||
string platform_name = name;
|
|
||||||
cl_device_type device_type;
|
|
||||||
if(clGetDeviceInfo(platform_device.device_id,
|
|
||||||
CL_DEVICE_TYPE,
|
|
||||||
sizeof(cl_device_type),
|
|
||||||
&device_type,
|
|
||||||
NULL) != CL_SUCCESS)
|
|
||||||
{
|
|
||||||
VLOG(1) << "Failed to retrieve device type, using mega kernel,";
|
|
||||||
return new OpenCLDeviceMegaKernel(info, stats, background);
|
|
||||||
}
|
|
||||||
if(opencl_kernel_use_split(platform_name, device_type)) {
|
if(opencl_kernel_use_split(platform_name, device_type)) {
|
||||||
VLOG(1) << "Using split kernel.";
|
VLOG(1) << "Using split kernel.";
|
||||||
return new OpenCLDeviceSplitKernel(info, stats, background);
|
return new OpenCLDeviceSplitKernel(info, stats, background);
|
||||||
@ -3446,43 +3485,13 @@ void device_opencl_info(vector<DeviceInfo>& devices)
|
|||||||
/* Devices are numbered consecutively across platforms. */
|
/* Devices are numbered consecutively across platforms. */
|
||||||
int num_devices = 0;
|
int num_devices = 0;
|
||||||
foreach(OpenCLPlatformDevice& platform_device, usable_devices) {
|
foreach(OpenCLPlatformDevice& platform_device, usable_devices) {
|
||||||
cl_platform_id platform_id = platform_device.platform_id;
|
const string& platform_name = platform_device.platform_name;
|
||||||
cl_device_id device_id = platform_device.device_id;
|
const cl_device_type device_type = platform_device.device_type;
|
||||||
/* We always increment the device number, so there;s 1:1 mapping from
|
const string& device_name = platform_device.device_name;
|
||||||
* info.num to indexinside usable_devices vector.
|
|
||||||
*/
|
|
||||||
++num_devices;
|
|
||||||
char platform_name[256];
|
|
||||||
if(clGetPlatformInfo(platform_id,
|
|
||||||
CL_PLATFORM_NAME,
|
|
||||||
sizeof(platform_name),
|
|
||||||
&platform_name,
|
|
||||||
NULL) != CL_SUCCESS)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
char device_name[1024] = "\0";
|
|
||||||
if(clGetDeviceInfo(device_id,
|
|
||||||
CL_DEVICE_NAME,
|
|
||||||
sizeof(device_name),
|
|
||||||
&device_name,
|
|
||||||
NULL) != CL_SUCCESS)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
cl_device_type device_type;
|
|
||||||
if(clGetDeviceInfo(device_id,
|
|
||||||
CL_DEVICE_TYPE,
|
|
||||||
sizeof(cl_device_type),
|
|
||||||
&device_type,
|
|
||||||
NULL) != CL_SUCCESS)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
DeviceInfo info;
|
DeviceInfo info;
|
||||||
info.type = DEVICE_OPENCL;
|
info.type = DEVICE_OPENCL;
|
||||||
info.description = string_remove_trademark(string(device_name));
|
info.description = string_remove_trademark(string(device_name));
|
||||||
info.num = num_devices - 1;
|
info.num = num_devices;
|
||||||
info.id = string_printf("OPENCL_%d", info.num);
|
info.id = string_printf("OPENCL_%d", info.num);
|
||||||
/* We don't know if it's used for display, but assume it is. */
|
/* We don't know if it's used for display, but assume it is. */
|
||||||
info.display_device = true;
|
info.display_device = true;
|
||||||
@ -3491,6 +3500,7 @@ void device_opencl_info(vector<DeviceInfo>& devices)
|
|||||||
info.use_split_kernel = opencl_kernel_use_split(platform_name,
|
info.use_split_kernel = opencl_kernel_use_split(platform_name,
|
||||||
device_type);
|
device_type);
|
||||||
devices.push_back(info);
|
devices.push_back(info);
|
||||||
|
num_devices++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user