diff --git a/doc/make_constants.py b/doc/make_constants.py index 2e20383bab957c2d26e84f066804cd4ea925be4c..18bbb83c4f9ed1fede19fe229c2eba94702606c0 100644 --- a/doc/make_constants.py +++ b/doc/make_constants.py @@ -58,6 +58,7 @@ def get_extra_lines(tup): yield " .. versionadded:: %s" % pyopencl_ver yield "" + const_ext_lookup = { cl.status_code: { "PLATFORM_NOT_FOUND_KHR": ("cl_khr_icd", "2011.1"), @@ -186,6 +187,10 @@ const_ext_lookup = { "SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS": cl_21, }, + cl.device_topoly_type_amd: { + "PCIE": amd_devattr, + }, + cl.mem_object_type: { "IMAGE2D_ARRAY": cl_12, "IMAGE1D": cl_12, diff --git a/src/wrap_cl.hpp b/src/wrap_cl.hpp index e7471bd8b67c81445a367195edea568e8622d5db..67b0c026f906074df90ba933333c71fd61e50e76 100644 --- a/src/wrap_cl.hpp +++ b/src/wrap_cl.hpp @@ -365,7 +365,7 @@ -#define PYOPENCL_GET_INTEGRAL_INFO(WHAT, FIRST_ARG, SECOND_ARG, TYPE) \ +#define PYOPENCL_GET_TYPED_INFO(WHAT, FIRST_ARG, SECOND_ARG, TYPE) \ { \ TYPE param_value; \ PYOPENCL_CALL_GUARDED(clGet##WHAT##Info, \ @@ -670,7 +670,7 @@ namespace pyopencl py::object get_info(cl_device_info param_name) const { #define DEV_GET_INT_INF(TYPE) \ - PYOPENCL_GET_INTEGRAL_INFO(Device, m_device, param_name, TYPE); + PYOPENCL_GET_TYPED_INFO(Device, m_device, param_name, TYPE); switch (param_name) { @@ -837,15 +837,15 @@ namespace pyopencl // {{{ AMD dev attrs cl_amd_device_attribute_query // // types of AMD dev attrs divined from -// https://www.khronos.org/registry/cl/api/1.2/cl.hpp +// https://github.com/KhronosGroup/OpenCL-CLHPP/blob/3b03738fef487378b188d21cc5f2bae276aa8721/include/CL/opencl.hpp#L1471-L1500 #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD case CL_DEVICE_PROFILING_TIMER_OFFSET_AMD: DEV_GET_INT_INF(cl_ulong); #endif -/* FIXME #ifdef CL_DEVICE_TOPOLOGY_AMD case CL_DEVICE_TOPOLOGY_AMD: + PYOPENCL_GET_TYPED_INFO( + Device, m_device, param_name, cl_device_topology_amd); #endif -*/ #ifdef CL_DEVICE_BOARD_NAME_AMD case CL_DEVICE_BOARD_NAME_AMD: ; PYOPENCL_GET_STR_INFO(Device, m_device, param_name); @@ -876,6 +876,17 @@ namespace pyopencl #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD case CL_DEVICE_LOCAL_MEM_BANKS_AMD: DEV_GET_INT_INF(cl_uint); #endif +// FIXME: MISSING: +// +// CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD +// CL_DEVICE_GFXIP_MAJOR_AMD +// CL_DEVICE_GFXIP_MINOR_AMD +// CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD +// CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD +// CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD +// CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD +// CL_DEVICE_PCIE_ID_AMD + // }}} #ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT @@ -1038,7 +1049,7 @@ namespace pyopencl switch (param_name) { case CL_CONTEXT_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO( + PYOPENCL_GET_TYPED_INFO( Context, m_context, param_name, cl_uint); case CL_CONTEXT_DEVICES: @@ -1102,7 +1113,7 @@ namespace pyopencl #if PYOPENCL_CL_VERSION >= 0x1010 case CL_CONTEXT_NUM_DEVICES: - PYOPENCL_GET_INTEGRAL_INFO( + PYOPENCL_GET_TYPED_INFO( Context, m_context, param_name, cl_uint); #endif @@ -1439,10 +1450,10 @@ namespace pyopencl PYOPENCL_GET_OPAQUE_INFO(CommandQueue, m_queue, param_name, cl_device_id, device); case CL_QUEUE_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(CommandQueue, m_queue, param_name, + PYOPENCL_GET_TYPED_INFO(CommandQueue, m_queue, param_name, cl_uint); case CL_QUEUE_PROPERTIES: - PYOPENCL_GET_INTEGRAL_INFO(CommandQueue, m_queue, param_name, + PYOPENCL_GET_TYPED_INFO(CommandQueue, m_queue, param_name, cl_command_queue_properties); default: @@ -1518,13 +1529,13 @@ namespace pyopencl PYOPENCL_GET_OPAQUE_INFO(Event, m_event, param_name, cl_command_queue, command_queue); case CL_EVENT_COMMAND_TYPE: - PYOPENCL_GET_INTEGRAL_INFO(Event, m_event, param_name, + PYOPENCL_GET_TYPED_INFO(Event, m_event, param_name, cl_command_type); case CL_EVENT_COMMAND_EXECUTION_STATUS: - PYOPENCL_GET_INTEGRAL_INFO(Event, m_event, param_name, + PYOPENCL_GET_TYPED_INFO(Event, m_event, param_name, cl_int); case CL_EVENT_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(Event, m_event, param_name, + PYOPENCL_GET_TYPED_INFO(Event, m_event, param_name, cl_uint); #if PYOPENCL_CL_VERSION >= 0x1010 case CL_EVENT_CONTEXT: @@ -1548,7 +1559,7 @@ namespace pyopencl #if PYOPENCL_CL_VERSION >= 0x2000 case CL_PROFILING_COMMAND_COMPLETE: #endif - PYOPENCL_GET_INTEGRAL_INFO(EventProfiling, m_event, param_name, + PYOPENCL_GET_TYPED_INFO(EventProfiling, m_event, param_name, cl_ulong); default: throw error("Event.get_profiling_info", CL_INVALID_VALUE); @@ -2578,7 +2589,7 @@ namespace pyopencl switch (param_name) { case CL_IMAGE_FORMAT: - PYOPENCL_GET_INTEGRAL_INFO(Image, data(), param_name, + PYOPENCL_GET_TYPED_INFO(Image, data(), param_name, cl_image_format); case CL_IMAGE_ELEMENT_SIZE: case CL_IMAGE_ROW_PITCH: @@ -2589,7 +2600,7 @@ namespace pyopencl #if PYOPENCL_CL_VERSION >= 0x1020 case CL_IMAGE_ARRAY_SIZE: #endif - PYOPENCL_GET_INTEGRAL_INFO(Image, data(), param_name, size_t); + PYOPENCL_GET_TYPED_INFO(Image, data(), param_name, size_t); #if PYOPENCL_CL_VERSION >= 0x1020 case CL_IMAGE_BUFFER: @@ -2608,7 +2619,7 @@ namespace pyopencl case CL_IMAGE_NUM_MIP_LEVELS: case CL_IMAGE_NUM_SAMPLES: - PYOPENCL_GET_INTEGRAL_INFO(Image, data(), param_name, cl_uint); + PYOPENCL_GET_TYPED_INFO(Image, data(), param_name, cl_uint); #endif default: @@ -3767,19 +3778,19 @@ namespace pyopencl switch (param_name) { case CL_SAMPLER_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name, + PYOPENCL_GET_TYPED_INFO(Sampler, m_sampler, param_name, cl_uint); case CL_SAMPLER_CONTEXT: PYOPENCL_GET_OPAQUE_INFO(Sampler, m_sampler, param_name, cl_context, context); case CL_SAMPLER_ADDRESSING_MODE: - PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name, + PYOPENCL_GET_TYPED_INFO(Sampler, m_sampler, param_name, cl_addressing_mode); case CL_SAMPLER_FILTER_MODE: - PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name, + PYOPENCL_GET_TYPED_INFO(Sampler, m_sampler, param_name, cl_filter_mode); case CL_SAMPLER_NORMALIZED_COORDS: - PYOPENCL_GET_INTEGRAL_INFO(Sampler, m_sampler, param_name, + PYOPENCL_GET_TYPED_INFO(Sampler, m_sampler, param_name, cl_bool); default: @@ -3832,13 +3843,13 @@ namespace pyopencl switch (param_name) { case CL_PROGRAM_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(Program, m_program, param_name, + PYOPENCL_GET_TYPED_INFO(Program, m_program, param_name, cl_uint); case CL_PROGRAM_CONTEXT: PYOPENCL_GET_OPAQUE_INFO(Program, m_program, param_name, cl_context, context); case CL_PROGRAM_NUM_DEVICES: - PYOPENCL_GET_INTEGRAL_INFO(Program, m_program, param_name, + PYOPENCL_GET_TYPED_INFO(Program, m_program, param_name, cl_uint); case CL_PROGRAM_DEVICES: { @@ -3904,7 +3915,7 @@ namespace pyopencl // }}} #if PYOPENCL_CL_VERSION >= 0x1020 case CL_PROGRAM_NUM_KERNELS: - PYOPENCL_GET_INTEGRAL_INFO(Program, m_program, param_name, + PYOPENCL_GET_TYPED_INFO(Program, m_program, param_name, size_t); case CL_PROGRAM_KERNEL_NAMES: PYOPENCL_GET_STR_INFO(Program, m_program, param_name); @@ -3923,7 +3934,7 @@ namespace pyopencl { #define PYOPENCL_FIRST_ARG m_program, dev.data() // hackety hack case CL_PROGRAM_BUILD_STATUS: - PYOPENCL_GET_INTEGRAL_INFO(ProgramBuild, + PYOPENCL_GET_TYPED_INFO(ProgramBuild, PYOPENCL_FIRST_ARG, param_name, cl_build_status); case CL_PROGRAM_BUILD_OPTIONS: @@ -3932,13 +3943,13 @@ namespace pyopencl PYOPENCL_FIRST_ARG, param_name); #if PYOPENCL_CL_VERSION >= 0x1020 case CL_PROGRAM_BINARY_TYPE: - PYOPENCL_GET_INTEGRAL_INFO(ProgramBuild, + PYOPENCL_GET_TYPED_INFO(ProgramBuild, PYOPENCL_FIRST_ARG, param_name, cl_program_binary_type); #endif #if PYOPENCL_CL_VERSION >= 0x2000 case CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE: - PYOPENCL_GET_INTEGRAL_INFO(ProgramBuild, + PYOPENCL_GET_TYPED_INFO(ProgramBuild, PYOPENCL_FIRST_ARG, param_name, size_t); #endif @@ -4405,7 +4416,7 @@ namespace pyopencl PYOPENCL_GET_STR_INFO(Kernel, m_kernel, param_name); case CL_KERNEL_NUM_ARGS: case CL_KERNEL_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(Kernel, m_kernel, param_name, + PYOPENCL_GET_TYPED_INFO(Kernel, m_kernel, param_name, cl_uint); case CL_KERNEL_CONTEXT: PYOPENCL_GET_OPAQUE_INFO(Kernel, m_kernel, param_name, @@ -4431,7 +4442,7 @@ namespace pyopencl { #define PYOPENCL_FIRST_ARG m_kernel, dev.data() // hackety hack case CL_KERNEL_WORK_GROUP_SIZE: - PYOPENCL_GET_INTEGRAL_INFO(KernelWorkGroup, + PYOPENCL_GET_TYPED_INFO(KernelWorkGroup, PYOPENCL_FIRST_ARG, param_name, size_t); case CL_KERNEL_COMPILE_WORK_GROUP_SIZE: @@ -4446,13 +4457,13 @@ namespace pyopencl #if PYOPENCL_CL_VERSION >= 0x1010 case CL_KERNEL_PRIVATE_MEM_SIZE: #endif - PYOPENCL_GET_INTEGRAL_INFO(KernelWorkGroup, + PYOPENCL_GET_TYPED_INFO(KernelWorkGroup, PYOPENCL_FIRST_ARG, param_name, cl_ulong); #if PYOPENCL_CL_VERSION >= 0x1010 case CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE: - PYOPENCL_GET_INTEGRAL_INFO(KernelWorkGroup, + PYOPENCL_GET_TYPED_INFO(KernelWorkGroup, PYOPENCL_FIRST_ARG, param_name, size_t); #endif @@ -4472,12 +4483,12 @@ namespace pyopencl { #define PYOPENCL_FIRST_ARG m_kernel, arg_index // hackety hack case CL_KERNEL_ARG_ADDRESS_QUALIFIER: - PYOPENCL_GET_INTEGRAL_INFO(KernelArg, + PYOPENCL_GET_TYPED_INFO(KernelArg, PYOPENCL_FIRST_ARG, param_name, cl_kernel_arg_address_qualifier); case CL_KERNEL_ARG_ACCESS_QUALIFIER: - PYOPENCL_GET_INTEGRAL_INFO(KernelArg, + PYOPENCL_GET_TYPED_INFO(KernelArg, PYOPENCL_FIRST_ARG, param_name, cl_kernel_arg_access_qualifier); @@ -4486,7 +4497,7 @@ namespace pyopencl PYOPENCL_GET_STR_INFO(KernelArg, PYOPENCL_FIRST_ARG, param_name); case CL_KERNEL_ARG_TYPE_QUALIFIER: - PYOPENCL_GET_INTEGRAL_INFO(KernelArg, + PYOPENCL_GET_TYPED_INFO(KernelArg, PYOPENCL_FIRST_ARG, param_name, cl_kernel_arg_type_qualifier); #undef PYOPENCL_FIRST_ARG @@ -4692,9 +4703,9 @@ namespace pyopencl switch (param_name) { case CL_GL_TEXTURE_TARGET: - PYOPENCL_GET_INTEGRAL_INFO(GLTexture, data(), param_name, GLenum); + PYOPENCL_GET_TYPED_INFO(GLTexture, data(), param_name, GLenum); case CL_GL_MIPMAP_LEVEL: - PYOPENCL_GET_INTEGRAL_INFO(GLTexture, data(), param_name, GLint); + PYOPENCL_GET_TYPED_INFO(GLTexture, data(), param_name, GLint); default: throw error("MemoryObject.get_gl_texture_info", CL_INVALID_VALUE); @@ -4945,22 +4956,22 @@ namespace pyopencl switch (param_name) { case CL_MEM_TYPE: - PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name, + PYOPENCL_GET_TYPED_INFO(MemObject, data(), param_name, cl_mem_object_type); case CL_MEM_FLAGS: - PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name, + PYOPENCL_GET_TYPED_INFO(MemObject, data(), param_name, cl_mem_flags); case CL_MEM_SIZE: - PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name, + PYOPENCL_GET_TYPED_INFO(MemObject, data(), param_name, size_t); case CL_MEM_HOST_PTR: throw pyopencl::error("MemoryObject.get_info", CL_INVALID_VALUE, "Use MemoryObject.get_host_array to get host pointer."); case CL_MEM_MAP_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name, + PYOPENCL_GET_TYPED_INFO(MemObject, data(), param_name, cl_uint); case CL_MEM_REFERENCE_COUNT: - PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name, + PYOPENCL_GET_TYPED_INFO(MemObject, data(), param_name, cl_uint); case CL_MEM_CONTEXT: PYOPENCL_GET_OPAQUE_INFO(MemObject, data(), param_name, @@ -4981,7 +4992,7 @@ namespace pyopencl return create_mem_object_wrapper(param_value); } case CL_MEM_OFFSET: - PYOPENCL_GET_INTEGRAL_INFO(MemObject, data(), param_name, + PYOPENCL_GET_TYPED_INFO(MemObject, data(), param_name, size_t); #endif diff --git a/src/wrap_constants.cpp b/src/wrap_constants.cpp index 2420be38b9849a32a46c135735b163aa4daec974..ea8ac981c8ce33dbdf26560d5a6021ab604a0770 100644 --- a/src/wrap_constants.cpp +++ b/src/wrap_constants.cpp @@ -40,6 +40,7 @@ namespace class platform_info { }; class device_type { }; class device_info { }; + class device_topooly_type_amd { }; class device_fp_config { }; class device_mem_cache_type { }; class device_local_mem_type { }; @@ -358,6 +359,7 @@ void pyopencl_expose_constants(py::module &m) ADD_ATTR(DEVICE_, PCI_SLOT_ID_NV); #endif #endif + // {{{ cl_amd_device_attribute_query #ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD ADD_ATTR(DEVICE_, PROFILING_TIMER_OFFSET_AMD); @@ -398,7 +400,6 @@ void pyopencl_expose_constants(py::module &m) #ifdef CL_DEVICE_LOCAL_MEM_BANKS_AMD ADD_ATTR(DEVICE_, LOCAL_MEM_BANKS_AMD); #endif -// }}} #ifdef CL_DEVICE_THREAD_TRACE_SUPPORTED_AMD ADD_ATTR(DEVICE_, THREAD_TRACE_SUPPORTED_AMD); #endif @@ -411,6 +412,19 @@ void pyopencl_expose_constants(py::module &m) #ifdef CL_DEVICE_AVAILABLE_ASYNC_QUEUES_AMD ADD_ATTR(DEVICE_, AVAILABLE_ASYNC_QUEUES_AMD); #endif +#ifdef CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_AMD + ADD_ATTR(DEVICE_, PREFERRED_WORK_GROUP_SIZE_AMD); +#endif +#ifdef CL_DEVICE_MAX_WORK_GROUP_SIZE_AMD + ADD_ATTR(DEVICE_, MAX_WORK_GROUP_SIZE_AMD); +#endif +#ifdef CL_DEVICE_PREFERRED_CONSTANT_BUFFER_SIZE_AMD + ADD_ATTR(DEVICE_, PREFERRED_CONSTANT_BUFFER_SIZE_AMD); +#endif +#ifdef CL_DEVICE_PCIE_ID_AMD + ADD_ATTR(DEVICE_, PCIE_ID_AMD); +#endif +// }}} #ifdef CL_DEVICE_MAX_ATOMIC_COUNTERS_EXT ADD_ATTR(DEVICE_, MAX_ATOMIC_COUNTERS_EXT); @@ -487,6 +501,11 @@ void pyopencl_expose_constants(py::module &m) #endif } + { + py::class_ cls(m, "device_topooly_type_amd"); + cls.attr("PCIE") = CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD; + } + { py::class_ cls(m, "device_fp_config"); ADD_ATTR(FP_, DENORM); @@ -1018,6 +1037,25 @@ void pyopencl_expose_constants(py::module &m) #endif // }}} + +#ifdef CL_DEVICE_TOPOLOGY_AMD + // {{{ cl_device_topology_amd + + { + typedef cl_device_topology_amd cls; + py::class_(m, "DeviceTopologyAMD") + .def("type", [](cls &self) { return self.raw.type; }) + .def("raw", [](cls &self) { return self.raw.data; }) + .def("pcie_unused", [](cls &self) { return self.pcie.bus; }) + .def("pcie_bus", [](cls &self) { return self.pcie.bus; }) + .def("pcie_device", [](cls &self) { return self.pcie.device; }) + .def("pcie_function", [](cls &self) { return self.pcie.function; }) + ; + } + + // }}} +#endif + }