2023-04-25 19:59:54 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "EmberCLPch.h"
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// OpenCLInfo class.
|
|
|
|
/// </summary>
|
|
|
|
|
|
|
|
namespace EmberCLns
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// Keeps information about all valid OpenCL devices on this system.
|
|
|
|
/// Devices which do not successfully create a test command queue are not
|
|
|
|
/// added to the list.
|
|
|
|
/// The pattern is singleton, so there is only one instance per program,
|
|
|
|
/// retreivable by reference via the Instance() function.
|
|
|
|
/// This class derives from EmberReport, so the caller is able
|
|
|
|
/// to retrieve a text dump of error information if any errors occur.
|
|
|
|
/// </summary>
|
|
|
|
class EMBERCL_API OpenCLInfo : public EmberReport, public Singleton<OpenCLInfo>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
const vector<cl::Platform>& Platforms() const;
|
|
|
|
const string& PlatformName(size_t platform) const;
|
|
|
|
const vector<string>& PlatformNames() const;
|
|
|
|
const vector<vector<cl::Device>>& Devices() const;
|
|
|
|
const string& DeviceName(size_t platform, size_t device) const;
|
|
|
|
const vector<pair<size_t, size_t>>& DeviceIndices() const;
|
|
|
|
const vector<string>& AllDeviceNames() const;
|
|
|
|
const vector<string>& DeviceNames(size_t platform) const;
|
|
|
|
size_t TotalDeviceIndex(size_t platform, size_t device) const;
|
|
|
|
const cl::Device* DeviceFromId(cl_device_id id, size_t& platform, size_t& device) const;
|
|
|
|
string DumpInfo() const;
|
|
|
|
bool Ok() const;
|
|
|
|
bool CreateContext(const cl::Platform& platform, cl::Context& context, bool shared);
|
|
|
|
bool CheckCL(cl_int err, const char* name);
|
|
|
|
string ErrorToStringCL(cl_int err);
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Get device information for the specified field.
|
|
|
|
/// Template argument expected to be cl_ulong, cl_uint or cl_int;
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="platform">The index platform of the platform to use</param>
|
|
|
|
/// <param name="device">The index device of the device to use</param>
|
|
|
|
/// <param name="name">The device field/feature to query</param>
|
|
|
|
/// <returns>The value of the field</returns>
|
|
|
|
template<typename T>
|
|
|
|
T GetInfo(size_t platform, size_t device, cl_device_info name) const
|
|
|
|
{
|
|
|
|
T val = T();
|
|
|
|
|
|
|
|
if (platform < m_Devices.size() && device < m_Devices[platform].size())
|
|
|
|
m_Devices[platform][device].getInfo(name, &val);
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
SINGLETON_DERIVED_IMPL(OpenCLInfo);
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
OpenCLInfo();
|
|
|
|
|
|
|
|
bool m_Init;
|
|
|
|
vector<cl::Platform> m_Platforms;
|
|
|
|
vector<vector<cl::Device>> m_Devices;
|
|
|
|
vector<string> m_PlatformNames;
|
|
|
|
vector<vector<string>> m_DeviceNames;
|
|
|
|
vector<pair<size_t, size_t>> m_DeviceIndices;
|
|
|
|
vector<string> m_AllDeviceNames;
|
|
|
|
};
|
|
|
|
}
|