/* * Copyright (c) 2017, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #include #include "cl_api_tests.h" #include "runtime/helpers/hw_info.h" #include "runtime/device/device.h" using namespace OCLRT; typedef api_tests clGetDeviceInfoTests; namespace ULT { TEST_F(clGetDeviceInfoTests, DeviceType) { cl_device_info paramName = 0; size_t paramSize = 0; void *paramValue = nullptr; size_t paramRetSize = 0; cl_device_type deviceType = CL_DEVICE_TYPE_CPU; // set to wrong value paramName = CL_DEVICE_TYPE; paramSize = sizeof(cl_device_type); paramValue = &deviceType; retVal = clGetDeviceInfo( devices[0], paramName, paramSize, paramValue, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(static_cast(CL_DEVICE_TYPE_GPU), deviceType); } TEST_F(clGetDeviceInfoTests, NullDevice) { size_t paramRetSize = 0; retVal = clGetDeviceInfo( nullptr, CL_DEVICE_TYPE, 0, nullptr, ¶mRetSize); EXPECT_NE(CL_SUCCESS, retVal); } TEST_F(clGetDeviceInfoTests, givenOpenCLDeviceWhenAskedForSupportedSvmTypeCorrectValueIsReturned) { cl_device_svm_capabilities svmCaps; retVal = clGetDeviceInfo( devices[0], CL_DEVICE_SVM_CAPABILITIES, sizeof(cl_device_svm_capabilities), &svmCaps, nullptr); EXPECT_EQ(CL_SUCCESS, retVal); const HardwareInfo &hwInfo = pPlatform->getDevice(0)->getHardwareInfo(); cl_device_svm_capabilities expectedCaps = 0; if (hwInfo.capabilityTable.ftrSvm != 0) { if (hwInfo.capabilityTable.ftrSupportsCoherency != 0) { expectedCaps = CL_DEVICE_SVM_COARSE_GRAIN_BUFFER | CL_DEVICE_SVM_FINE_GRAIN_BUFFER | CL_DEVICE_SVM_ATOMICS; } else { expectedCaps = CL_DEVICE_SVM_COARSE_GRAIN_BUFFER; } } EXPECT_EQ(svmCaps, expectedCaps); } TEST_F(clGetDeviceInfoTests, givenNeoDeviceWhenAskedForDriverVersionThenNeoIsReturned) { cl_device_info paramName = 0; size_t paramSize = 0; void *paramValue = nullptr; size_t paramRetSize = 0; cl_uint driverVersion = 0; paramName = CL_DEVICE_DRIVER_VERSION_INTEL; retVal = clGetDeviceInfo( devices[0], paramName, 0, nullptr, ¶mRetSize); EXPECT_EQ(sizeof(cl_uint), paramRetSize); paramSize = paramRetSize; paramValue = &driverVersion; retVal = clGetDeviceInfo( devices[0], paramName, paramSize, paramValue, ¶mRetSize); EXPECT_EQ((cl_uint)CL_DEVICE_DRIVER_VERSION_INTEL_NEO1, driverVersion); } //------------------------------------------------------------------------------ struct GetDeviceInfoP : public api_fixture, public ::testing::TestWithParam { void SetUp() override { param = GetParam(); api_fixture::SetUp(); } void TearDown() override { api_fixture::TearDown(); } cl_device_info param; }; typedef GetDeviceInfoP GetDeviceInfoStr; TEST_P(GetDeviceInfoStr, StringType) { char *paramValue = nullptr; size_t paramRetSize = 0; cl_int retVal = clGetDeviceInfo( devices[0], param, 0, nullptr, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); ASSERT_NE(0u, paramRetSize); paramValue = new char[paramRetSize]; retVal = clGetDeviceInfo( devices[0], param, paramRetSize, paramValue, nullptr); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_GE(std::strlen(paramValue), 0u); // check for extensions if (param == CL_DEVICE_EXTENSIONS) { std::string extensionString(paramValue); size_t currentOffset = 0u; std::string supportedExtensions[] = { "cl_khr_3d_image_writes ", "cl_khr_byte_addressable_store ", "cl_khr_fp16 ", "cl_khr_depth_images ", "cl_khr_global_int32_base_atomics ", "cl_khr_global_int32_extended_atomics ", "cl_khr_local_int32_base_atomics ", "cl_khr_local_int32_extended_atomics ", "cl_intel_subgroups ", "cl_intel_required_subgroup_size ", "cl_intel_subgroups_short ", "cl_khr_spir ", "cl_intel_accelerator ", "cl_intel_media_block_io ", "cl_intel_driver_diagnostics ", "cl_intel_device_side_avc_motion_estimation ", }; for (auto element = 0u; element < sizeof(supportedExtensions) / sizeof(supportedExtensions[0]); element++) { auto foundOffset = extensionString.find(supportedExtensions[element]); EXPECT_TRUE(foundOffset != std::string::npos); EXPECT_GE(foundOffset, currentOffset); currentOffset = foundOffset; } } // check IL versions if (param == CL_DEVICE_IL_VERSION) { Device *pDevice = castToObject(devices[0]); // do not test if not supported if (pDevice->getSupportedClVersion() >= 21) { std::string versionString(paramValue); size_t currentOffset = 0u; std::string supportedVersions[] = { "SPIR-V_1.0 ", }; for (auto element = 0u; element < sizeof(supportedVersions) / sizeof(supportedVersions[0]); element++) { auto foundOffset = versionString.find(supportedVersions[element]); EXPECT_TRUE(foundOffset != std::string::npos); EXPECT_GE(foundOffset, currentOffset); currentOffset = foundOffset; } } } delete[] paramValue; } static cl_device_info deviceInfoStrParams[] = { // CL_DEVICE_VERSION CL_DEVICE_BUILT_IN_KERNELS, CL_DEVICE_EXTENSIONS, CL_DEVICE_IL_VERSION, // OpenCL 2.1 CL_DEVICE_NAME, CL_DEVICE_OPENCL_C_VERSION, CL_DEVICE_PROFILE, CL_DEVICE_VENDOR, CL_DEVICE_VERSION, CL_DRIVER_VERSION}; INSTANTIATE_TEST_CASE_P( api, GetDeviceInfoStr, testing::ValuesIn(deviceInfoStrParams)); typedef GetDeviceInfoP GetDeviceInfoVectorWidth; TEST_P(GetDeviceInfoVectorWidth, GreatherThanZero) { cl_uint paramValue = 0; size_t paramRetSize = 0; auto retVal = clGetDeviceInfo( devices[0], param, 0, nullptr, ¶mRetSize); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(sizeof(cl_uint), paramRetSize); retVal = clGetDeviceInfo( devices[0], param, paramRetSize, ¶mValue, nullptr); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_GT(paramValue, 0u); } cl_device_info devicePrefferredVector[] = { CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT}; INSTANTIATE_TEST_CASE_P( api, GetDeviceInfoVectorWidth, testing::ValuesIn(devicePrefferredVector)); } // namespace ULT