From fd9f3116711595cbc113e5494bbd1a94b16202f7 Mon Sep 17 00:00:00 2001
From: Shane-J-Latham <shane.latham@anu.edu.au>
Date: Sun, 12 Jun 2016 00:11:18 +1000
Subject: [PATCH] Export various vendor extension device attributes to python.

---
 doc/make_constants.py            | 22 ++++++++++++++
 src/c_wrapper/device.cpp         | 48 ++++++++++++++++++++++++++++-
 src/c_wrapper/wrap_constants.cpp | 52 ++++++++++++++++++++++++++++++++
 3 files changed, 121 insertions(+), 1 deletion(-)

diff --git a/doc/make_constants.py b/doc/make_constants.py
index bd2acc57..0ccf5d9a 100644
--- a/doc/make_constants.py
+++ b/doc/make_constants.py
@@ -27,11 +27,16 @@ import pyopencl as cl
 fission = ("cl_ext_device_fission", "2011.1")
 nv_devattr = ("cl_nv_device_attribute_query", "0.92")
 gl_sharing = ("cl_khr_gl_sharing", "0.92")
+cl_spir_devattr = ("cl_khr_spir", "2016.2")
 cl_11 = ("CL_1.1", "0.92")
 cl_12 = ("CL_1.2", "2011.2")
 cl_12_2015 = ("CL_1.2", "2015.2")
 cl_20 = ("CL_2.0", "2015.2")
 amd_devattr = ("cl_amd_device_attribute_query", "2013.2")
+qcom_hp_devattr = ("cl_qcom_ext_host_ptr", "2016.2")
+intel_me_devattr = ("cl_intel_advanced_motion_estimation", "2016.2")
+intel_ss_devattr = ("cl_intel_simultaneous_sharing", "2016.2")
+altera_temp_devattr = ("cl_altera_device_temperature", "2016.2")
 
 
 def get_extra_lines(tup):
@@ -90,6 +95,7 @@ const_ext_lookup = {
             "NATIVE_VECTOR_WIDTH_DOUBLE": cl_11,
             "NATIVE_VECTOR_WIDTH_HALF": cl_11,
             "OPENCL_C_VERSION": cl_11,
+            "SPIR_VERSIONS": cl_spir_devattr,
             "COMPUTE_CAPABILITY_MAJOR_NV": nv_devattr,
             "COMPUTE_CAPABILITY_MINOR_NV": nv_devattr,
             "REGISTERS_PER_BLOCK_NV": nv_devattr,
@@ -97,6 +103,9 @@ const_ext_lookup = {
             "GPU_OVERLAP_NV": nv_devattr,
             "KERNEL_EXEC_TIMEOUT_NV": nv_devattr,
             "INTEGRATED_MEMORY_NV": nv_devattr,
+            "ATTRIBUTE_ASYNC_ENGINE_COUNT_NV": nv_devattr,
+            "PCI_BUS_ID_NV": nv_devattr,
+            "PCI_BUS_SLOT_NV": nv_devattr,
 
             "DOUBLE_FP_CONFIG":
             ("cl_khr_fp64", "2011.1"),
@@ -116,6 +125,19 @@ const_ext_lookup = {
             "GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD": amd_devattr,
             "LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD": amd_devattr,
             "LOCAL_MEM_BANKS_AMD": amd_devattr,
+            "THREAD_TRACE_SUPPORTED_AMD": amd_devattr,
+            "GFXIP_MAJOR_AMD": amd_devattr,
+            "GFXIP_MINOR_AMD": amd_devattr,
+            "AVAILABLE_ASYNC_QUEUES_AMD": amd_devattr,
+            
+            "ME_VERSION_INTEL": intel_me_devattr,
+            "SIMULTANEOUS_INTEROPS_INTEL": intel_ss_devattr,
+            "NUM_SIMULTANEOUS_INTEROPS_INTEL": intel_ss_devattr,
+            
+            "EXT_MEM_PADDING_IN_BYTES_QCOM": qcom_hp_devattr,
+            "PAGE_SIZE_QCOM": qcom_devattr,
+            
+            "CORE_TEMPERATURE_ALTERA": altera_temp_devattr,
 
             "MAX_ATOMIC_COUNTERS_EXT":
             ("cl_ext_atomic_counters_64", "2013.2"),
diff --git a/src/c_wrapper/device.cpp b/src/c_wrapper/device.cpp
index 5e9ec8fc..4bb882ca 100644
--- a/src/c_wrapper/device.cpp
+++ b/src/c_wrapper/device.cpp
@@ -143,6 +143,15 @@ device::get_info(cl_uint param_name) const
     case CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV:
     case CL_DEVICE_REGISTERS_PER_BLOCK_NV:
     case CL_DEVICE_WARP_SIZE_NV:
+#ifdef CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV
+    case CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV:
+#endif
+#ifdef CL_DEVICE_PCI_BUS_ID_NV
+    case CL_DEVICE_PCI_BUS_ID_NV:
+#endif
+#ifdef CL_DEVICE_PCI_SLOT_ID_NV
+    case CL_DEVICE_PCI_SLOT_ID_NV:
+#endif
         return DEV_GET_INT_INF(cl_uint);
     case CL_DEVICE_GPU_OVERLAP_NV:
     case CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV:
@@ -223,6 +232,10 @@ device::get_info(cl_uint param_name) const
            case CL_DEVICE_TOPOLOGY_AMD:
            #endif
         */
+#ifdef CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD
+    case CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD:
+        return DEV_GET_INT_INF(cl_bool);
+#endif
 #ifdef CL_DEVICE_BOARD_NAME_AMD
     case CL_DEVICE_BOARD_NAME_AMD: ;
         return pyopencl_get_str_info(Device, PYOPENCL_CL_CASTABLE_THIS, param_name);
@@ -259,12 +272,45 @@ device::get_info(cl_uint param_name) const
 #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD
     case CL_DEVICE_LOCAL_MEM_BANKS_AMD:
 #endif
-
 #ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT
     case CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT:
+#endif
+#ifdef CL_DEVICE_GFXIP_MAJOR_AMD
+    case CL_DEVICE_GFXIP_MAJOR_AMD:
+#endif
+#ifdef CL_DEVICE_GFXIP_MINOR_AMD
+    case CL_DEVICE_GFXIP_MINOR_AMD:
+#endif
+#ifdef CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD
+    case CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD:
 #endif
         return DEV_GET_INT_INF(cl_uint);
         // }}}
+#ifdef CL_DEVICE_ME_VERSION_INTEL
+    case CL_DEVICE_ME_VERSION_INTEL:
+#endif
+#ifdef CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM
+    case CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM:
+#endif
+#ifdef CL_DEVICE_PAGE_SIZE_QCOM
+    case CL_DEVICE_PAGE_SIZE_QCOM:
+#endif
+#ifdef CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL
+    case CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL:
+#endif
+        return DEV_GET_INT_INF(cl_uint);
+#ifdef CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL
+    case CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL:
+        return pyopencl_get_array_info(cl_uint, Device, PYOPENCL_CL_CASTABLE_THIS, param_name);
+#endif
+#ifdef CL_DEVICE_SPIR_VERSIONS
+    case CL_DEVICE_SPIR_VERSIONS:
+        return pyopencl_get_str_info(Device, PYOPENCL_CL_CASTABLE_THIS, param_name);
+#endif
+#ifdef CL_DEVICE_CORE_TEMPERATURE_ALTERA
+    case CL_DEVICE_CORE_TEMPERATURE_ALTERA:
+        return DEV_GET_INT_INF(cl_int);
+#endif
 
     default:
         throw clerror("Device.get_info", CL_INVALID_VALUE);
diff --git a/src/c_wrapper/wrap_constants.cpp b/src/c_wrapper/wrap_constants.cpp
index 1a024550..bfa882a6 100644
--- a/src/c_wrapper/wrap_constants.cpp
+++ b/src/c_wrapper/wrap_constants.cpp
@@ -201,6 +201,16 @@ void populate_constants(void(*add)(const char*, const char*, int64_t value))
     ADD_ATTR("device_info", DEVICE_, GPU_OVERLAP_NV);
     ADD_ATTR("device_info", DEVICE_, KERNEL_EXEC_TIMEOUT_NV);
     ADD_ATTR("device_info", DEVICE_, INTEGRATED_MEMORY_NV);
+    // Nvidia specific device attributes, not defined in Khronos CL/cl_ext.h
+#ifdef CL_DEVICE_ATTRIBUTE_ASYNC_ENGINE_COUNT_NV
+    ADD_ATTR("device_info", DEVICE_, ATTRIBUTE_ASYNC_ENGINE_COUNT_NV);
+#endif
+#ifdef CL_DEVICE_PCI_BUS_ID_NV
+    ADD_ATTR("device_info", DEVICE_, PCI_BUS_ID_NV);
+#endif
+#ifdef CL_DEVICE_PCI_SLOT_ID_NV
+    ADD_ATTR("device_info", DEVICE_, PCI_SLOT_ID_NV);
+#endif
 #endif
 #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
     ADD_ATTR("device_info", DEVICE_, PROFILING_TIMER_OFFSET_AMD);
@@ -242,6 +252,19 @@ void populate_constants(void(*add)(const char*, const char*, int64_t value))
     ADD_ATTR("device_info", DEVICE_, LOCAL_MEM_BANKS_AMD);
 #endif
 
+#ifdef CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD
+    ADD_ATTR("device_info", DEVICE_, THREAD_TRACE_SUPPORTED_AMD);
+#endif
+#ifdef CL_DEVICE_GFXIP_MAJOR_AMD
+    ADD_ATTR("device_info", DEVICE_, GFXIP_MAJOR_AMD);
+#endif
+#ifdef CL_DEVICE_GFXIP_MINOR_AMD
+    ADD_ATTR("device_info", DEVICE_, GFXIP_MINOR_AMD);
+#endif
+#ifdef CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD
+    ADD_ATTR("device_info", DEVICE_, AVAILABLE_ASYNC_QUEUES_AMD);
+#endif
+
 #ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT
     ADD_ATTR("device_info", DEVICE_, MAX_ATOMIC_COUNTERS_EXT);
 #endif
@@ -280,7 +303,36 @@ void populate_constants(void(*add)(const char*, const char*, int64_t value))
     ADD_ATTR("device_info", DEVICE_, PREFERRED_GLOBAL_ATOMIC_ALIGNMENT);
     ADD_ATTR("device_info", DEVICE_, PREFERRED_LOCAL_ATOMIC_ALIGNMENT);
 #endif
+    /* cl_intel_advanced_motion_estimation */
+#ifdef CL_DEVICE_ME_VERSION_INTEL
+    ADD_ATTR("device_info", DEVICE_, ME_VERSION_INTEL);
+#endif
 
+    /* cl_qcom_ext_host_ptr */
+#ifdef CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM
+    ADD_ATTR("device_info", DEVICE_, EXT_MEM_PADDING_IN_BYTES_QCOM);
+#endif
+#ifdef CL_DEVICE_PAGE_SIZE_QCOM
+    ADD_ATTR("device_info", DEVICE_, PAGE_SIZE_QCOM);
+#endif
+
+    /* cl_khr_spir */
+#ifdef CL_DEVICE_SPIR_VERSIONS
+    ADD_ATTR("device_info", DEVICE_, SPIR_VERSIONS);
+#endif
+
+    /* cl_altera_device_temperature */
+#ifdef CL_DEVICE_CORE_TEMPERATURE_ALTERA
+    ADD_ATTR("device_info", DEVICE_, CORE_TEMPERATURE_ALTERA);
+#endif
+
+    /* cl_intel_simultaneous_sharing */
+#ifdef CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL
+    ADD_ATTR("device_info", DEVICE_, SIMULTANEOUS_INTEROPS_INTEL);
+#endif
+#ifdef CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL
+    ADD_ATTR("device_info", DEVICE_, NUM_SIMULTANEOUS_INTEROPS_INTEL);
+#endif
 
     // device_fp_config
     ADD_ATTR("device_fp_config", FP_, DENORM);
-- 
GitLab