diff --git a/include/ur.py b/include/ur.py index 276bede911..0ef0bf76ac 100644 --- a/include/ur.py +++ b/include/ur.py @@ -1914,7 +1914,9 @@ class ur_queue_info_v(IntEnum): ## The reference count returned should be considered immediately stale. ## It is unsuitable for general use in applications. This feature is ## provided for identifying memory leaks. - SIZE = 5 ## [uint32_t] The size of the queue + SIZE = 5 ## [uint32_t] The size of the queue on the device. Only a valid query + ## if the queue was created with the `ON_DEVICE` queue flag, otherwise + ## `::urQueueGetInfo` will return `::UR_RESULT_ERROR_INVALID_QUEUE`. EMPTY = 6 ## [::ur_bool_t] return true if the queue was empty at the time of the ## query diff --git a/include/ur_api.h b/include/ur_api.h index c5989cee3f..70a2c87fb4 100644 --- a/include/ur_api.h +++ b/include/ur_api.h @@ -5012,7 +5012,9 @@ typedef enum ur_queue_info_t { ///< The reference count returned should be considered immediately stale. ///< It is unsuitable for general use in applications. This feature is ///< provided for identifying memory leaks. - UR_QUEUE_INFO_SIZE = 5, ///< [uint32_t] The size of the queue + UR_QUEUE_INFO_SIZE = 5, ///< [uint32_t] The size of the queue on the device. Only a valid query + ///< if the queue was created with the `ON_DEVICE` queue flag, otherwise + ///< `::urQueueGetInfo` will return `::UR_RESULT_ERROR_INVALID_QUEUE`. UR_QUEUE_INFO_EMPTY = 6, ///< [::ur_bool_t] return true if the queue was empty at the time of the ///< query /// @cond @@ -5072,7 +5074,7 @@ typedef enum ur_queue_flag_t { /// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER /// + `propSize != 0 && pPropValue == NULL` /// + `pPropValue == NULL && pPropSizeRet == NULL` -/// - ::UR_RESULT_ERROR_INVALID_QUEUE +/// - ::UR_RESULT_ERROR_INVALID_QUEUE - "If `hQueue` isn't a valid queue handle or if `propName` isn't supported by `hQueue`." /// - ::UR_RESULT_ERROR_OUT_OF_HOST_MEMORY /// - ::UR_RESULT_ERROR_OUT_OF_RESOURCES UR_APIEXPORT ur_result_t UR_APICALL diff --git a/scripts/core/queue.yml b/scripts/core/queue.yml index 88fe153165..349f8a35c3 100644 --- a/scripts/core/queue.yml +++ b/scripts/core/queue.yml @@ -32,7 +32,10 @@ etors: The reference count returned should be considered immediately stale. It is unsuitable for general use in applications. This feature is provided for identifying memory leaks. - name: SIZE - desc: "[uint32_t] The size of the queue" + desc: | + [uint32_t] The size of the queue on the device. Only a valid query + if the queue was created with the `ON_DEVICE` queue flag, otherwise + `$xQueueGetInfo` will return `$X_RESULT_ERROR_INVALID_QUEUE`. - name: EMPTY desc: "[$x_bool_t] return true if the queue was empty at the time of the query" --- #-------------------------------------------------------------------------- @@ -108,6 +111,7 @@ returns: - "`propSize != 0 && pPropValue == NULL`" - "`pPropValue == NULL && pPropSizeRet == NULL`" - $X_RESULT_ERROR_INVALID_QUEUE + - "If `hQueue` isn't a valid queue handle or if `propName` isn't supported by `hQueue`." - $X_RESULT_ERROR_OUT_OF_HOST_MEMORY - $X_RESULT_ERROR_OUT_OF_RESOURCES --- #-------------------------------------------------------------------------- diff --git a/source/adapters/cuda/device.cpp b/source/adapters/cuda/device.cpp index a4877236ae..8baa96d16f 100644 --- a/source/adapters/cuda/device.cpp +++ b/source/adapters/cuda/device.cpp @@ -553,10 +553,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, ur_queue_flag_t(UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE | UR_QUEUE_FLAG_PROFILING_ENABLE)); case UR_DEVICE_INFO_QUEUE_ON_DEVICE_PROPERTIES: { - // The mandated minimum capability: - ur_queue_flags_t Capability = UR_QUEUE_FLAG_PROFILING_ENABLE | - UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE; - return ReturnValue(Capability); + return ReturnValue(0); } case UR_DEVICE_INFO_QUEUE_ON_HOST_PROPERTIES: { // The mandated minimum capability: diff --git a/source/adapters/hip/device.cpp b/source/adapters/hip/device.cpp index 5b473c050e..4e87ced268 100644 --- a/source/adapters/hip/device.cpp +++ b/source/adapters/hip/device.cpp @@ -465,10 +465,7 @@ UR_APIEXPORT ur_result_t UR_APICALL urDeviceGetInfo(ur_device_handle_t hDevice, return ReturnValue(Capability); } case UR_DEVICE_INFO_QUEUE_ON_DEVICE_PROPERTIES: { - // The mandated minimum capability: - ur_queue_flags_t Capability = UR_QUEUE_FLAG_PROFILING_ENABLE | - UR_QUEUE_FLAG_OUT_OF_ORDER_EXEC_MODE_ENABLE; - return ReturnValue(Capability); + return ReturnValue(0); } case UR_DEVICE_INFO_QUEUE_ON_HOST_PROPERTIES: case UR_DEVICE_INFO_QUEUE_PROPERTIES: { diff --git a/source/adapters/opencl/common.cpp b/source/adapters/opencl/common.cpp index 4fe8bed408..e7fb09eeda 100644 --- a/source/adapters/opencl/common.cpp +++ b/source/adapters/opencl/common.cpp @@ -81,6 +81,8 @@ ur_result_t mapCLErrorToUR(cl_int Result) { return UR_RESULT_ERROR_INVALID_COMMAND_BUFFER_EXP; case CL_INVALID_SYNC_POINT_WAIT_LIST_KHR: return UR_RESULT_ERROR_INVALID_COMMAND_BUFFER_SYNC_POINT_WAIT_LIST_EXP; + case CL_INVALID_COMMAND_QUEUE: + return UR_RESULT_ERROR_INVALID_QUEUE; default: return UR_RESULT_ERROR_UNKNOWN; } diff --git a/source/loader/ur_libapi.cpp b/source/loader/ur_libapi.cpp index ccf1e1e2cf..07adb5aaa1 100644 --- a/source/loader/ur_libapi.cpp +++ b/source/loader/ur_libapi.cpp @@ -3963,7 +3963,7 @@ ur_result_t UR_APICALL urKernelCreateWithNativeHandle( /// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER /// + `propSize != 0 && pPropValue == NULL` /// + `pPropValue == NULL && pPropSizeRet == NULL` -/// - ::UR_RESULT_ERROR_INVALID_QUEUE +/// - ::UR_RESULT_ERROR_INVALID_QUEUE - "If `hQueue` isn't a valid queue handle or if `propName` isn't supported by `hQueue`." /// - ::UR_RESULT_ERROR_OUT_OF_HOST_MEMORY /// - ::UR_RESULT_ERROR_OUT_OF_RESOURCES ur_result_t UR_APICALL urQueueGetInfo( diff --git a/source/ur_api.cpp b/source/ur_api.cpp index 40a6aded00..1b05aac893 100644 --- a/source/ur_api.cpp +++ b/source/ur_api.cpp @@ -3343,7 +3343,7 @@ ur_result_t UR_APICALL urKernelCreateWithNativeHandle( /// - ::UR_RESULT_ERROR_INVALID_NULL_POINTER /// + `propSize != 0 && pPropValue == NULL` /// + `pPropValue == NULL && pPropSizeRet == NULL` -/// - ::UR_RESULT_ERROR_INVALID_QUEUE +/// - ::UR_RESULT_ERROR_INVALID_QUEUE - "If `hQueue` isn't a valid queue handle or if `propName` isn't supported by `hQueue`." /// - ::UR_RESULT_ERROR_OUT_OF_HOST_MEMORY /// - ::UR_RESULT_ERROR_OUT_OF_RESOURCES ur_result_t UR_APICALL urQueueGetInfo( diff --git a/test/conformance/queue/queue_adapter_cuda.match b/test/conformance/queue/queue_adapter_cuda.match index f7967fb388..03e9ccf593 100644 --- a/test/conformance/queue/queue_adapter_cuda.match +++ b/test/conformance/queue/queue_adapter_cuda.match @@ -1,4 +1,3 @@ urQueueCreateTest.InvalidQueueProperties/NVIDIA_CUDA_BACKEND___{{.*}}_ urQueueCreateWithNativeHandleTest.Success/NVIDIA_CUDA_BACKEND___{{.*}}_ urQueueGetInfoTestWithInfoParam.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_QUEUE_INFO_DEVICE_DEFAULT -urQueueGetInfoTestWithInfoParam.Success/NVIDIA_CUDA_BACKEND___{{.*}}___UR_QUEUE_INFO_SIZE diff --git a/test/conformance/queue/queue_adapter_hip.match b/test/conformance/queue/queue_adapter_hip.match index 46a22304cd..9210d3f4fc 100644 --- a/test/conformance/queue/queue_adapter_hip.match +++ b/test/conformance/queue/queue_adapter_hip.match @@ -1,3 +1,2 @@ urQueueCreateTest.InvalidQueueProperties/AMD_HIP_BACKEND___{{.*}}_ urQueueGetInfoTestWithInfoParam.Success/AMD_HIP_BACKEND___{{.*}}___UR_QUEUE_INFO_DEVICE_DEFAULT -urQueueGetInfoTestWithInfoParam.Success/AMD_HIP_BACKEND___{{.*}}___UR_QUEUE_INFO_SIZE diff --git a/test/conformance/queue/queue_adapter_opencl.match b/test/conformance/queue/queue_adapter_opencl.match index 59c11b7c86..6c04c954ec 100644 --- a/test/conformance/queue/queue_adapter_opencl.match +++ b/test/conformance/queue/queue_adapter_opencl.match @@ -1,4 +1,3 @@ urQueueCreateTest.InvalidQueueProperties/Intel_R__OpenCL___{{.*}}_ urQueueCreateWithNativeHandleTest.Success/Intel_R__OpenCL___{{.*}}_ -urQueueGetInfoTestWithInfoParam.Success/Intel_R__OpenCL___{{.*}}___UR_QUEUE_INFO_SIZE urQueueGetInfoTestWithInfoParam.Success/Intel_R__OpenCL___{{.*}}___UR_QUEUE_INFO_EMPTY diff --git a/test/conformance/queue/urQueueGetInfo.cpp b/test/conformance/queue/urQueueGetInfo.cpp index 5f8100b612..18e1e48d52 100644 --- a/test/conformance/queue/urQueueGetInfo.cpp +++ b/test/conformance/queue/urQueueGetInfo.cpp @@ -23,7 +23,7 @@ UUR_TEST_SUITE_P(urQueueGetInfoTestWithInfoParam, UR_QUEUE_INFO_DEVICE_DEFAULT, UR_QUEUE_INFO_FLAGS, UR_QUEUE_INFO_REFERENCE_COUNT, - UR_QUEUE_INFO_SIZE, UR_QUEUE_INFO_EMPTY), + UR_QUEUE_INFO_EMPTY), uur::deviceTestWithParamPrinter); TEST_P(urQueueGetInfoTestWithInfoParam, Success) { @@ -42,6 +42,58 @@ TEST_P(urQueueGetInfoTestWithInfoParam, Success) { urQueueGetInfo(queue, info_type, size, data.data(), nullptr)); } +struct urQueueGetInfoDeviceQueueTestWithInfoParam + : public uur::urContextTestWithParam { + void SetUp() { + urContextTestWithParam::SetUp(); + ur_queue_flags_t deviceQueueCapabilities; + ASSERT_SUCCESS( + urDeviceGetInfo(device, UR_DEVICE_INFO_QUEUE_ON_DEVICE_PROPERTIES, + sizeof(deviceQueueCapabilities), + &deviceQueueCapabilities, nullptr)); + if (!deviceQueueCapabilities) { + GTEST_SKIP() << "Queue on device is not supported."; + } + ASSERT_SUCCESS( + urQueueCreate(context, device, &queueProperties, &queue)); + } + + void TearDown() { + if (queue) { + ASSERT_SUCCESS(urQueueRelease(queue)); + } + urContextTestWithParam::TearDown(); + } + + ur_queue_handle_t queue = nullptr; + ur_queue_properties_t queueProperties = {UR_STRUCTURE_TYPE_QUEUE_PROPERTIES, + nullptr, UR_QUEUE_FLAG_ON_DEVICE}; +}; + +UUR_TEST_SUITE_P(urQueueGetInfoDeviceQueueTestWithInfoParam, + ::testing::Values(UR_QUEUE_INFO_CONTEXT, UR_QUEUE_INFO_DEVICE, + UR_QUEUE_INFO_DEVICE_DEFAULT, + UR_QUEUE_INFO_FLAGS, + UR_QUEUE_INFO_REFERENCE_COUNT, + UR_QUEUE_INFO_SIZE, UR_QUEUE_INFO_EMPTY), + uur::deviceTestWithParamPrinter); + +TEST_P(urQueueGetInfoDeviceQueueTestWithInfoParam, Success) { + ur_queue_info_t info_type = getParam(); + size_t size = 0; + ASSERT_SUCCESS(urQueueGetInfo(queue, info_type, 0, nullptr, &size)); + ASSERT_NE(size, 0); + + if (const auto expected_size = queue_info_size_map.find(info_type); + expected_size != queue_info_size_map.end()) { + ASSERT_EQ(expected_size->second, size); + } + + std::vector data(size); + ASSERT_SUCCESS( + urQueueGetInfo(queue, info_type, size, data.data(), nullptr)); +} + using urQueueGetInfoTest = uur::urQueueTest; UUR_INSTANTIATE_DEVICE_TEST_SUITE_P(urQueueGetInfoTest);