Add new clGetDeviceInfo queries

Add support for following queries:
 - CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION
 - CL_DEVICE_EXTENSIONS_WITH_VERSION
 - CL_DEVICE_NUMERIC_VERSION
 - CL_DEVICE_OPENCL_C_ALL_VERSIONS

Related-To: NEO-4368

Change-Id: I920671869fdb8815521173e2ec5ab3a4b905ec19
Signed-off-by: Filip Hazubski <filip.hazubski@intel.com>
This commit is contained in:
Filip Hazubski
2020-05-26 15:28:40 +02:00
committed by sys_ocldev
parent 23ad10731b
commit 4e2097e427
8 changed files with 213 additions and 15 deletions

View File

@@ -123,6 +123,7 @@ class ClDevice : public BaseObject<_cl_device_id> {
protected:
void initializeCaps();
void initializeOpenclCAllVersions();
void initializeOsSpecificCaps();
void setupFp64Flags();

View File

@@ -30,8 +30,6 @@ static std::string spirVersions = "1.2 ";
#define TOSTR(b) QTR(b)
static std::string driverVersion = TOSTR(NEO_OCL_DRIVER_VERSION);
const char *builtInKernels = ""; // the "always available" (extension-independent) builtin kernels
static constexpr cl_device_fp_config defaultFpFlags = static_cast<cl_device_fp_config>(CL_FP_ROUND_TO_NEAREST |
CL_FP_ROUND_TO_ZERO |
CL_FP_ROUND_TO_INF |
@@ -106,17 +104,21 @@ void ClDevice::initializeCaps() {
case 30:
deviceInfo.clVersion = "OpenCL 3.0 NEO ";
deviceInfo.clCVersion = "OpenCL C 3.0 ";
deviceInfo.numericClVersion = CL_MAKE_VERSION(3, 0, 0);
break;
case 21:
deviceInfo.clVersion = "OpenCL 2.1 NEO ";
deviceInfo.clCVersion = "OpenCL C 2.0 ";
deviceInfo.numericClVersion = CL_MAKE_VERSION(2, 1, 0);
break;
case 12:
default:
deviceInfo.clVersion = "OpenCL 1.2 NEO ";
deviceInfo.clCVersion = "OpenCL C 1.2 ";
deviceInfo.numericClVersion = CL_MAKE_VERSION(1, 2, 0);
break;
}
initializeOpenclCAllVersions();
deviceInfo.platformLP = (hwInfo.capabilityTable.supportsOcl21Features == false);
deviceInfo.spirVersions = spirVersions.c_str();
auto supportsVme = hwInfo.capabilityTable.supportsVme;
@@ -196,16 +198,23 @@ void ClDevice::initializeCaps() {
deviceInfo.deviceExtensions = deviceExtensions.c_str();
exposedBuiltinKernels = builtInKernels;
std::vector<std::string> exposedBuiltinKernelsVector;
if (supportsVme) {
exposedBuiltinKernels.append("block_motion_estimate_intel;");
exposedBuiltinKernelsVector.push_back("block_motion_estimate_intel");
}
if (supportsAdvancedVme) {
auto advVmeKernels = "block_advanced_motion_estimate_check_intel;block_advanced_motion_estimate_bidirectional_check_intel;";
exposedBuiltinKernels.append(advVmeKernels);
exposedBuiltinKernelsVector.push_back("block_advanced_motion_estimate_check_intel");
exposedBuiltinKernelsVector.push_back("block_advanced_motion_estimate_bidirectional_check_intel");
}
for (auto builtInKernel : exposedBuiltinKernelsVector) {
exposedBuiltinKernels.append(builtInKernel);
exposedBuiltinKernels.append(";");
cl_name_version kernelNameVersion;
kernelNameVersion.version = CL_MAKE_VERSION(1, 0, 0);
strcpy_s(kernelNameVersion.name, CL_NAME_VERSION_MAX_NAME_SIZE, builtInKernel.c_str());
deviceInfo.builtInKernelsWithVersion.push_back(kernelNameVersion);
}
deviceInfo.builtInKernels = exposedBuiltinKernels.c_str();
deviceInfo.deviceType = CL_DEVICE_TYPE_GPU;
@@ -386,6 +395,38 @@ void ClDevice::initializeCaps() {
}
initializeOsSpecificCaps();
std::stringstream deviceExtensionsStringStream{deviceExtensions};
std::vector<std::string> deviceExtensionsVector{
std::istream_iterator<std::string>{deviceExtensionsStringStream}, std::istream_iterator<std::string>{}};
for (auto deviceExtension : deviceExtensionsVector) {
cl_name_version deviceExtensionWithVersion;
deviceExtensionWithVersion.version = CL_MAKE_VERSION(1, 0, 0);
strcpy_s(deviceExtensionWithVersion.name, CL_NAME_VERSION_MAX_NAME_SIZE, deviceExtension.c_str());
deviceInfo.extensionsWithVersion.push_back(deviceExtensionWithVersion);
}
}
void ClDevice::initializeOpenclCAllVersions() {
cl_name_version openClCVersion;
strcpy_s(openClCVersion.name, CL_NAME_VERSION_MAX_NAME_SIZE, "OpenCL C");
openClCVersion.version = CL_MAKE_VERSION(1, 0, 0);
deviceInfo.openclCAllVersions.push_back(openClCVersion);
openClCVersion.version = CL_MAKE_VERSION(1, 1, 0);
deviceInfo.openclCAllVersions.push_back(openClCVersion);
openClCVersion.version = CL_MAKE_VERSION(1, 2, 0);
deviceInfo.openclCAllVersions.push_back(openClCVersion);
if (ocl21FeaturesEnabled) {
openClCVersion.version = CL_MAKE_VERSION(2, 0, 0);
deviceInfo.openclCAllVersions.push_back(openClCVersion);
}
if (enabledClVersion == 30) {
openClCVersion.version = CL_MAKE_VERSION(3, 0, 0);
deviceInfo.openclCAllVersions.push_back(openClCVersion);
}
}
} // namespace NEO

View File

@@ -129,6 +129,7 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
case CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG: getCap<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG >(src, srcSize, retSize); break;
case CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT: getCap<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT >(src, srcSize, retSize); break;
case CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT: getCap<CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT >(src, srcSize, retSize); break;
case CL_DEVICE_NUMERIC_VERSION: getCap<CL_DEVICE_NUMERIC_VERSION >(src, srcSize, retSize); break;
case CL_DEVICE_OPENCL_C_VERSION: getStr<CL_DEVICE_OPENCL_C_VERSION >(src, srcSize, retSize); break;
case CL_DEVICE_PARENT_DEVICE: getCap<CL_DEVICE_PARENT_DEVICE >(src, srcSize, retSize); break;
case CL_DEVICE_PARTITION_AFFINITY_DOMAIN: getCap<CL_DEVICE_PARTITION_AFFINITY_DOMAIN >(src, srcSize, retSize); break;
@@ -214,6 +215,18 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName,
case CL_DEVICE_OPENCL_C_FEATURES:
retSize = srcSize = 0;
break;
case CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION:
src = deviceInfo.builtInKernelsWithVersion.data();
retSize = srcSize = deviceInfo.builtInKernelsWithVersion.size() * sizeof(cl_name_version);
break;
case CL_DEVICE_OPENCL_C_ALL_VERSIONS:
src = deviceInfo.openclCAllVersions.data();
retSize = srcSize = deviceInfo.openclCAllVersions.size() * sizeof(cl_name_version);
break;
case CL_DEVICE_EXTENSIONS_WITH_VERSION:
src = deviceInfo.extensionsWithVersion.data();
retSize = srcSize = deviceInfo.extensionsWithVersion.size() * sizeof(cl_name_version);
break;
default:
if (getDeviceInfoForImage(paramName, src, srcSize, retSize) && !getSharedDeviceInfo().imageSupport) {
src = &value;

View File

@@ -9,11 +9,16 @@
#include "opencl/extensions/public/cl_ext_private.h"
#include <vector>
namespace NEO {
// clang-format off
struct ClDeviceInfo {
cl_name_version ilsWithVersion[1];
std::vector<cl_name_version> builtInKernelsWithVersion;
std::vector<cl_name_version> openclCAllVersions;
std::vector<cl_name_version> extensionsWithVersion;
cl_device_type deviceType;
size_t maxSliceCount;
size_t image3DMaxWidth;
@@ -50,6 +55,7 @@ struct ClDeviceInfo {
double platformHostTimerResolution;
size_t planarYuvMaxWidth;
size_t planarYuvMaxHeight;
cl_version numericClVersion;
cl_uint maxComputUnits;
cl_uint maxWorkItemDimensions;
cl_uint maxNumOfSubGroups;

View File

@@ -129,6 +129,7 @@ template<> struct Map<CL_DEVICE_NATIVE_VECTOR_WIDTH_INT > :
template<> struct Map<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG > : public ClMapBase<CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, uint32_t, &ClDeviceInfo::nativeVectorWidthLong> {};
template<> struct Map<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT > : public ClMapBase<CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, uint32_t, &ClDeviceInfo::nativeVectorWidthShort> {};
template<> struct Map<CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT > : public ClMapBase<CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT, uint32_t, &ClDeviceInfo::nonUniformWorkGroupSupport> {};
template<> struct Map<CL_DEVICE_NUMERIC_VERSION > : public ClMapBase<CL_DEVICE_NUMERIC_VERSION, uint32_t, &ClDeviceInfo::numericClVersion> {};
template<> struct Map<CL_DEVICE_OPENCL_C_VERSION > : public ClMapBase<CL_DEVICE_OPENCL_C_VERSION, const char *, &ClDeviceInfo::clCVersion> {};
template<> struct Map<CL_DEVICE_PARENT_DEVICE > : public ClMapBase<CL_DEVICE_PARENT_DEVICE, cl_device_id, &ClDeviceInfo::parentDevice> {};
template<> struct Map<CL_DEVICE_PARTITION_AFFINITY_DOMAIN > : public ClMapBase<CL_DEVICE_PARTITION_AFFINITY_DOMAIN, uint64_t, &ClDeviceInfo::partitionAffinityDomain> {};