From ac553589646602b0c70f55abe3423734bf2c6b3e Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Tue, 3 May 2016 10:51:16 +0100 Subject: [PATCH] Implement device info functions --- src/OCLStream.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++++ src/OCLStream.h | 4 +++ 2 files changed, 87 insertions(+) diff --git a/src/OCLStream.cpp b/src/OCLStream.cpp index e5145b4..34b7933 100644 --- a/src/OCLStream.cpp +++ b/src/OCLStream.cpp @@ -136,6 +136,89 @@ void OCLStream::read_arrays(std::vector& a, std::vector& b, std::vector cl::copy(d_c, c.begin(), c.end()); } +// Cache list of devices +bool cached = false; +std::vector devices; + +void getDeviceList(void) +{ + // Get list of platforms + std::vector platforms; + cl::Platform::get(&platforms); + + // Enumerate devices + for (unsigned i = 0; i < platforms.size(); i++) + { + std::vector plat_devices; + platforms[i].getDevices(CL_DEVICE_TYPE_ALL, &plat_devices); + devices.insert(devices.end(), plat_devices.begin(), plat_devices.end()); + } + cached = true; +} + +void listDevices(void) +{ + getDeviceList(); + + // Print device names + if (devices.size() == 0) + { + std::cerr << "No devices found." << std::endl; + } + else + { + std::cout << std::endl; + std::cout << "Devices:" << std::endl; + for (int i = 0; i < devices.size(); i++) + { + std::cout << i << ": " << getDeviceName(i) << std::endl; + } + std::cout << std::endl; + } + + +} + +std::string getDeviceName(const int device) +{ + if (!cached) + getDeviceList(); + + std::string name; + cl_device_info info = CL_DEVICE_NAME; + + if (device < devices.size()) + { + devices[device].getInfo(info, &name); + } + else + { + throw std::runtime_error("Error asking for name for non-existant device"); + } + + return name; + +} + +std::string getDeviceDriver(const int device) +{ + if (!cached) + getDeviceList(); + + std::string driver; + + if (device < devices.size()) + { + devices[device].getInfo(CL_DRIVER_VERSION, &driver); + } + else + { + throw std::runtime_error("Error asking for driver for non-existant device"); + } + + return driver; +} + template class OCLStream; template class OCLStream; diff --git a/src/OCLStream.h b/src/OCLStream.h index f9c133e..551cf28 100644 --- a/src/OCLStream.h +++ b/src/OCLStream.h @@ -1,4 +1,6 @@ +#pragma once + #include #include @@ -48,3 +50,5 @@ class OCLStream : public Stream }; +// Populate the devices list +void getDeviceList(void);