Skip to content

Commit 768657b

Browse files
author
Thiemo Wiedemeyer
committed
added posibility to select openCL device for depth processing.
if not specified priority is GPU, CPU, others. listing of multiple devices work now correctly.
1 parent 5466b57 commit 768657b

File tree

4 files changed

+102
-36
lines changed

4 files changed

+102
-36
lines changed

examples/protonect/include/libfreenect2/depth_packet_processor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ class OpenCLDepthPacketProcessorImpl;
171171
class OpenCLDepthPacketProcessor : public DepthPacketProcessor
172172
{
173173
public:
174-
OpenCLDepthPacketProcessor();
174+
OpenCLDepthPacketProcessor(const int deviceId = -1);
175175
virtual ~OpenCLDepthPacketProcessor();
176176
virtual void setConfiguration(const libfreenect2::DepthPacketProcessor::Config &config);
177177

examples/protonect/include/libfreenect2/packet_pipeline.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,10 @@ class OpenGLPacketPipeline : public BasePacketPipeline
9595
class OpenCLPacketPipeline : public BasePacketPipeline
9696
{
9797
protected:
98+
const int deviceId;
9899
virtual DepthPacketProcessor *createDepthPacketProcessor();
99100
public:
100-
OpenCLPacketPipeline();
101+
OpenCLPacketPipeline(const int deviceId = -1);
101102
virtual ~OpenCLPacketPipeline();
102103
};
103104
#endif // WITH_OPENCL_SUPPORT

examples/protonect/src/opencl_depth_packet_processor.cpp

Lines changed: 97 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -153,8 +153,9 @@ class OpenCLDepthPacketProcessorImpl
153153
cl::Buffer buf_filtered;
154154

155155
bool isInitialized;
156+
const int deviceId;
156157

157-
OpenCLDepthPacketProcessorImpl() : isInitialized(false)
158+
OpenCLDepthPacketProcessorImpl(const int deviceId = -1) : isInitialized(false), deviceId(deviceId)
158159
{
159160
newIrFrame();
160161
newDepthFrame();
@@ -221,43 +222,81 @@ class OpenCLDepthPacketProcessorImpl
221222
options = oss.str();
222223
}
223224

224-
bool selectDevice(const std::vector<cl::Platform> &platforms, const int type)
225+
void getDevices(const std::vector<cl::Platform> &platforms, std::vector<cl::Device> &devices)
225226
{
226-
bool selected = false;
227-
227+
devices.clear();
228228
for(size_t i = 0; i < platforms.size(); ++i)
229229
{
230230
const cl::Platform &platform = platforms[i];
231-
std::string platformName, platformVendor;
232-
platform.getInfo(CL_PLATFORM_NAME, &platformName);
233-
platform.getInfo(CL_PLATFORM_VENDOR, &platformVendor);
234231

235-
std::cout << OUT_NAME("selectDevice") "found platform: " << platformName << " vendor: " << platformVendor << std::endl;
236-
237-
std::vector<cl::Device> devices;
238-
if(platform.getDevices(type, &devices) != CL_SUCCESS)
232+
std::vector<cl::Device> devs;
233+
if(platform.getDevices(CL_DEVICE_TYPE_ALL, &devs) != CL_SUCCESS)
239234
{
240-
std::cerr << OUT_NAME("selectDevice") "error while getting opencl devices." << std::endl;
241-
return false;
235+
continue;
242236
}
243237

244-
for(size_t j = 0; j < devices.size(); ++j)
238+
devices.insert(devices.end(), devs.begin(), devs.end());
239+
}
240+
}
241+
242+
void listDevice(std::vector<cl::Device> &devices)
243+
{
244+
std::cout << OUT_NAME("listDevice") " devices:" << std::endl;
245+
for(size_t i = 0; i < devices.size(); ++i)
246+
{
247+
cl::Device &dev = devices[i];
248+
std::string devName, devVendor, devType;
249+
size_t devTypeID;
250+
dev.getInfo(CL_DEVICE_NAME, &devName);
251+
dev.getInfo(CL_DEVICE_VENDOR, &devVendor);
252+
dev.getInfo(CL_DEVICE_TYPE, &devTypeID);
253+
254+
switch(devTypeID)
245255
{
246-
cl::Device &dev = devices[i];
247-
std::string devName, devVendor;
248-
dev.getInfo(CL_DEVICE_NAME, &devName);
249-
dev.getInfo(CL_DEVICE_VENDOR, &devVendor);
256+
case CL_DEVICE_TYPE_CPU:
257+
devType = "CPU";
258+
break;
259+
case CL_DEVICE_TYPE_GPU:
260+
devType = "GPU";
261+
break;
262+
case CL_DEVICE_TYPE_ACCELERATOR:
263+
devType = "ACCELERATOR";
264+
break;
265+
case CL_DEVICE_TYPE_CUSTOM:
266+
devType = "CUSTOM";
267+
break;
268+
default:
269+
devType = "UNKNOWN";
270+
}
250271

251-
std::cout << OUT_NAME("selectDevice") "found device: " << devName << " vendor: " << devVendor << std::endl;
272+
std::cout << " " << i << ": " << devName << " (" << devType << ")[" << devVendor << ']' << std::endl;
273+
}
274+
}
252275

253-
if(!selected)
254-
{
255-
selected = true;
256-
device = dev;
257-
}
258-
}
276+
bool selectDevice(std::vector<cl::Device> &devices)
277+
{
278+
if(deviceId != -1 && devices.size() > (size_t)deviceId)
279+
{
280+
device = devices[deviceId];
281+
return true;
259282
}
260283

284+
bool selected = false;
285+
size_t selectedType = 0;
286+
287+
for(size_t i = 0; i < devices.size(); ++i)
288+
{
289+
cl::Device &dev = devices[i];
290+
size_t devTypeID;
291+
dev.getInfo(CL_DEVICE_TYPE, &devTypeID);
292+
293+
if(!selected || (selectedType != CL_DEVICE_TYPE_GPU && devTypeID == CL_DEVICE_TYPE_GPU))
294+
{
295+
selectedType = devTypeID;
296+
selected = true;
297+
device = dev;
298+
}
299+
}
261300
return selected;
262301
}
263302

@@ -289,16 +328,42 @@ class OpenCLDepthPacketProcessorImpl
289328
return false;
290329
}
291330

292-
if(!selectDevice(platforms, CL_DEVICE_TYPE_GPU))
331+
std::vector<cl::Device> devices;
332+
getDevices(platforms, devices);
333+
listDevice(devices);
334+
if(selectDevice(devices))
293335
{
294-
std::cout << OUT_NAME("init") "could not find any GPU device. trying CPU devices" << std::endl;
336+
std::string devName, devVendor, devType;
337+
size_t devTypeID;
338+
device.getInfo(CL_DEVICE_NAME, &devName);
339+
device.getInfo(CL_DEVICE_VENDOR, &devVendor);
340+
device.getInfo(CL_DEVICE_TYPE, &devTypeID);
295341

296-
if(!selectDevice(platforms, CL_DEVICE_TYPE_CPU))
342+
switch(devTypeID)
297343
{
298-
std::cerr << OUT_NAME("init") "could not find any suitable device" << std::endl;
299-
return false;
344+
case CL_DEVICE_TYPE_CPU:
345+
devType = "CPU";
346+
break;
347+
case CL_DEVICE_TYPE_GPU:
348+
devType = "GPU";
349+
break;
350+
case CL_DEVICE_TYPE_ACCELERATOR:
351+
devType = "ACCELERATOR";
352+
break;
353+
case CL_DEVICE_TYPE_CUSTOM:
354+
devType = "CUSTOM";
355+
break;
356+
default:
357+
devType = "UNKNOWN";
300358
}
359+
std::cout << OUT_NAME("init") " selected device: " << devName << " (" << devType << ")[" << devVendor << ']' << std::endl;
360+
}
361+
else
362+
{
363+
std::cerr << OUT_NAME("init") "could not find any suitable device" << std::endl;
364+
return false;
301365
}
366+
302367
context = cl::Context(device);
303368

304369
std::string options;
@@ -505,8 +570,8 @@ class OpenCLDepthPacketProcessorImpl
505570
}
506571
};
507572

508-
OpenCLDepthPacketProcessor::OpenCLDepthPacketProcessor() :
509-
impl_(new OpenCLDepthPacketProcessorImpl())
573+
OpenCLDepthPacketProcessor::OpenCLDepthPacketProcessor(const int deviceId) :
574+
impl_(new OpenCLDepthPacketProcessorImpl(deviceId))
510575
{
511576
}
512577

examples/protonect/src/packet_pipeline.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ DepthPacketProcessor *OpenGLPacketPipeline::createDepthPacketProcessor()
116116

117117
#ifdef WITH_OPENCL_SUPPORT
118118

119-
OpenCLPacketPipeline::OpenCLPacketPipeline()
119+
OpenCLPacketPipeline::OpenCLPacketPipeline(const int deviceId) : deviceId(deviceId)
120120
{
121121
initialize();
122122
}
@@ -125,7 +125,7 @@ OpenCLPacketPipeline::~OpenCLPacketPipeline() { }
125125

126126
DepthPacketProcessor *OpenCLPacketPipeline::createDepthPacketProcessor()
127127
{
128-
OpenCLDepthPacketProcessor *depth_processor = new OpenCLDepthPacketProcessor();
128+
OpenCLDepthPacketProcessor *depth_processor = new OpenCLDepthPacketProcessor(deviceId);
129129
depth_processor->load11To16LutFromFile("11to16.bin");
130130
depth_processor->loadXTableFromFile("xTable.bin");
131131
depth_processor->loadZTableFromFile("zTable.bin");

0 commit comments

Comments
 (0)