Newer
Older
// Wrap CL constants and errors
//
// Copyright (C) 2009 Andreas Kloeckner
//
// 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.
Andreas Klöckner
committed
#define NO_IMPORT_ARRAY
#define PY_ARRAY_UNIQUE_SYMBOL pyopencl_ARRAY_API
#include "wrap_cl.hpp"
using namespace pyopencl;
namespace
{
// {{{ 'fake' constant scopes
class status_code { };
class platform_info { };
class device_type { };
class device_info { };
class device_topology_type_amd { };
class device_fp_config { };
class device_mem_cache_type { };
class device_local_mem_type { };
class device_exec_capabilities { };
class command_queue_properties { };
class context_info { };
class gl_context_info { };
class context_properties { };
class command_queue_info { };
class channel_order { };
class channel_type { };
class mem_object_type { };
class mem_info { };
class image_info { };
class addressing_mode { };
class filter_mode { };
class sampler_info { };
class map_flags { };
class program_info { };
class program_build_info { };
class program_binary_type { };
class build_status { };
class kernel_info { };
class kernel_arg_info { };
class kernel_arg_address_qualifier { };
class kernel_arg_access_qualifier { };
class event_info { };
class command_type { };
class command_execution_status { };
class profiling_info { };
class buffer_create_type { };
class mem_migration_flags { };
class device_partition_property { };
class device_affinity_domain { };
class device_device_enqueue_capabilities { };
class version_bits { };
class khronos_vendor_id { };
class gl_object_type { };
class gl_texture_info { };
// }}}
}
void pyopencl_expose_constants(py::module_ &m)
static py::exception<pyopencl::error> CL##NAME(m, #NAME, BASE);
DECLARE_EXC(Error, PyExc_Exception);
DECLARE_EXC(MemoryError, CLError.ptr());
DECLARE_EXC(LogicError, CLError.ptr());
DECLARE_EXC(RuntimeError, CLError.ptr());
py::register_exception_translator(
[](std::exception_ptr p)
{
try
{
if (p) std::rethrow_exception(p);
}
catch (pyopencl::error &err)
{
py::object err_obj = py::cast(err);
if (err.code() == CL_MEM_OBJECT_ALLOCATION_FAILURE)
PyErr_SetObject(CLMemoryError.ptr(), err_obj.ptr());
else if (err.code() <= CL_INVALID_VALUE)
PyErr_SetObject(CLLogicError.ptr(), err_obj.ptr());
else if (err.code() > CL_INVALID_VALUE && err.code() < CL_SUCCESS)
PyErr_SetObject(CLRuntimeError.ptr(), err_obj.ptr());
else
PyErr_SetObject(CLError.ptr(), err_obj.ptr());
}
});
py::class_<error> (m, "_ErrorRecord")
.def(py::init<const char *, cl_int, const char *>(),
py::arg("routine"),
py::arg("code"),
py::arg("msg"))
.DEF_SIMPLE_METHOD(routine)
.DEF_SIMPLE_METHOD(code)
.DEF_SIMPLE_METHOD(what)
.def("_program", &cls::get_program)
// }}}
// {{{ constants
#define ADD_ATTR(PREFIX, NAME) \
cls.attr(#NAME) = CL_##PREFIX##NAME
#define ADD_ATTR_SUFFIX(PREFIX, NAME, SUFFIX) \
cls.attr(#NAME) = CL_##PREFIX##NAME##SUFFIX
py::class_<status_code> cls(m, "status_code");
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
ADD_ATTR(, SUCCESS);
ADD_ATTR(, DEVICE_NOT_FOUND);
ADD_ATTR(, DEVICE_NOT_AVAILABLE);
#if !(defined(CL_PLATFORM_NVIDIA) && CL_PLATFORM_NVIDIA == 0x3001)
ADD_ATTR(, COMPILER_NOT_AVAILABLE);
#endif
ADD_ATTR(, MEM_OBJECT_ALLOCATION_FAILURE);
ADD_ATTR(, OUT_OF_RESOURCES);
ADD_ATTR(, OUT_OF_HOST_MEMORY);
ADD_ATTR(, PROFILING_INFO_NOT_AVAILABLE);
ADD_ATTR(, MEM_COPY_OVERLAP);
ADD_ATTR(, IMAGE_FORMAT_MISMATCH);
ADD_ATTR(, IMAGE_FORMAT_NOT_SUPPORTED);
ADD_ATTR(, BUILD_PROGRAM_FAILURE);
ADD_ATTR(, MAP_FAILURE);
ADD_ATTR(, INVALID_VALUE);
ADD_ATTR(, INVALID_DEVICE_TYPE);
ADD_ATTR(, INVALID_PLATFORM);
ADD_ATTR(, INVALID_DEVICE);
ADD_ATTR(, INVALID_CONTEXT);
ADD_ATTR(, INVALID_QUEUE_PROPERTIES);
ADD_ATTR(, INVALID_COMMAND_QUEUE);
ADD_ATTR(, INVALID_HOST_PTR);
ADD_ATTR(, INVALID_MEM_OBJECT);
ADD_ATTR(, INVALID_IMAGE_FORMAT_DESCRIPTOR);
ADD_ATTR(, INVALID_IMAGE_SIZE);
ADD_ATTR(, INVALID_SAMPLER);
ADD_ATTR(, INVALID_BINARY);
ADD_ATTR(, INVALID_BUILD_OPTIONS);
ADD_ATTR(, INVALID_PROGRAM);
ADD_ATTR(, INVALID_PROGRAM_EXECUTABLE);
ADD_ATTR(, INVALID_KERNEL_NAME);
ADD_ATTR(, INVALID_KERNEL_DEFINITION);
ADD_ATTR(, INVALID_KERNEL);
ADD_ATTR(, INVALID_ARG_INDEX);
ADD_ATTR(, INVALID_ARG_VALUE);
ADD_ATTR(, INVALID_ARG_SIZE);
ADD_ATTR(, INVALID_KERNEL_ARGS);
ADD_ATTR(, INVALID_WORK_DIMENSION);
ADD_ATTR(, INVALID_WORK_GROUP_SIZE);
ADD_ATTR(, INVALID_WORK_ITEM_SIZE);
ADD_ATTR(, INVALID_GLOBAL_OFFSET);
ADD_ATTR(, INVALID_EVENT_WAIT_LIST);
ADD_ATTR(, INVALID_EVENT);
ADD_ATTR(, INVALID_OPERATION);
ADD_ATTR(, INVALID_GL_OBJECT);
ADD_ATTR(, INVALID_BUFFER_SIZE);
ADD_ATTR(, INVALID_MIP_LEVEL);
#if defined(cl_khr_icd) && (cl_khr_icd >= 1)
ADD_ATTR(, PLATFORM_NOT_FOUND_KHR);
#endif
#if defined(cl_khr_gl_sharing) && (cl_khr_gl_sharing >= 1)
ADD_ATTR(, INVALID_GL_SHAREGROUP_REFERENCE_KHR);
#endif
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(, MISALIGNED_SUB_BUFFER_OFFSET);
ADD_ATTR(, EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST);
ADD_ATTR(, INVALID_GLOBAL_WORK_SIZE);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(, COMPILE_PROGRAM_FAILURE);
ADD_ATTR(, LINKER_NOT_AVAILABLE);
ADD_ATTR(, LINK_PROGRAM_FAILURE);
ADD_ATTR(, DEVICE_PARTITION_FAILED);
ADD_ATTR(, KERNEL_ARG_INFO_NOT_AVAILABLE);
ADD_ATTR(, INVALID_IMAGE_DESCRIPTOR);
ADD_ATTR(, INVALID_COMPILER_OPTIONS);
ADD_ATTR(, INVALID_LINKER_OPTIONS);
ADD_ATTR(, INVALID_DEVICE_PARTITION_COUNT);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(, INVALID_PIPE_SIZE);
ADD_ATTR(, INVALID_DEVICE_QUEUE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2020
ADD_ATTR(, INVALID_SPEC_ID);
ADD_ATTR(, MAX_SIZE_RESTRICTION_EXCEEDED);
#endif
#if defined(cl_ext_device_fission) && defined(PYOPENCL_USE_DEVICE_FISSION)
ADD_ATTR(, DEVICE_PARTITION_FAILED_EXT);
ADD_ATTR(, INVALID_PARTITION_COUNT_EXT);
ADD_ATTR(, INVALID_PARTITION_NAME_EXT);
#endif
}
{
py::class_<platform_info> cls(m, "platform_info");
ADD_ATTR(PLATFORM_, PROFILE);
ADD_ATTR(PLATFORM_, VERSION);
ADD_ATTR(PLATFORM_, NAME);
ADD_ATTR(PLATFORM_, VENDOR);
#if !(defined(CL_PLATFORM_NVIDIA) && CL_PLATFORM_NVIDIA == 0x3001)
ADD_ATTR(PLATFORM_, EXTENSIONS);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(PLATFORM_, HOST_TIMER_RESOLUTION);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(PLATFORM_, NUMERIC_VERSION);
ADD_ATTR(PLATFORM_, EXTENSIONS_WITH_VERSION);
py::class_<device_type> cls(m, "device_type");
ADD_ATTR(DEVICE_TYPE_, DEFAULT);
ADD_ATTR(DEVICE_TYPE_, CPU);
ADD_ATTR(DEVICE_TYPE_, GPU);
ADD_ATTR(DEVICE_TYPE_, ACCELERATOR);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(DEVICE_TYPE_, CUSTOM);
#endif
ADD_ATTR(DEVICE_TYPE_, ALL);
}
{
py::class_<device_info> cls(m, "device_info");
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
ADD_ATTR(DEVICE_, TYPE);
ADD_ATTR(DEVICE_, VENDOR_ID);
ADD_ATTR(DEVICE_, MAX_COMPUTE_UNITS);
ADD_ATTR(DEVICE_, MAX_WORK_ITEM_DIMENSIONS);
ADD_ATTR(DEVICE_, MAX_WORK_GROUP_SIZE);
ADD_ATTR(DEVICE_, MAX_WORK_ITEM_SIZES);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_CHAR);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_SHORT);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_INT);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_LONG);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_FLOAT);
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_DOUBLE);
ADD_ATTR(DEVICE_, MAX_CLOCK_FREQUENCY);
ADD_ATTR(DEVICE_, ADDRESS_BITS);
ADD_ATTR(DEVICE_, MAX_READ_IMAGE_ARGS);
ADD_ATTR(DEVICE_, MAX_WRITE_IMAGE_ARGS);
ADD_ATTR(DEVICE_, MAX_MEM_ALLOC_SIZE);
ADD_ATTR(DEVICE_, IMAGE2D_MAX_WIDTH);
ADD_ATTR(DEVICE_, IMAGE2D_MAX_HEIGHT);
ADD_ATTR(DEVICE_, IMAGE3D_MAX_WIDTH);
ADD_ATTR(DEVICE_, IMAGE3D_MAX_HEIGHT);
ADD_ATTR(DEVICE_, IMAGE3D_MAX_DEPTH);
ADD_ATTR(DEVICE_, IMAGE_SUPPORT);
ADD_ATTR(DEVICE_, MAX_PARAMETER_SIZE);
ADD_ATTR(DEVICE_, MAX_SAMPLERS);
ADD_ATTR(DEVICE_, MEM_BASE_ADDR_ALIGN);
ADD_ATTR(DEVICE_, MIN_DATA_TYPE_ALIGN_SIZE);
ADD_ATTR(DEVICE_, SINGLE_FP_CONFIG);
#ifdef CL_DEVICE_DOUBLE_FP_CONFIG
ADD_ATTR(DEVICE_, DOUBLE_FP_CONFIG);
#endif
#ifdef CL_DEVICE_HALF_FP_CONFIG
ADD_ATTR(DEVICE_, HALF_FP_CONFIG);
#endif
ADD_ATTR(DEVICE_, GLOBAL_MEM_CACHE_TYPE);
ADD_ATTR(DEVICE_, GLOBAL_MEM_CACHELINE_SIZE);
ADD_ATTR(DEVICE_, GLOBAL_MEM_CACHE_SIZE);
ADD_ATTR(DEVICE_, GLOBAL_MEM_SIZE);
ADD_ATTR(DEVICE_, MAX_CONSTANT_BUFFER_SIZE);
ADD_ATTR(DEVICE_, MAX_CONSTANT_ARGS);
ADD_ATTR(DEVICE_, LOCAL_MEM_TYPE);
ADD_ATTR(DEVICE_, LOCAL_MEM_SIZE);
ADD_ATTR(DEVICE_, ERROR_CORRECTION_SUPPORT);
ADD_ATTR(DEVICE_, PROFILING_TIMER_RESOLUTION);
ADD_ATTR(DEVICE_, ENDIAN_LITTLE);
ADD_ATTR(DEVICE_, AVAILABLE);
ADD_ATTR(DEVICE_, COMPILER_AVAILABLE);
ADD_ATTR(DEVICE_, EXECUTION_CAPABILITIES);
ADD_ATTR(DEVICE_, QUEUE_PROPERTIES);
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(DEVICE_, QUEUE_ON_HOST_PROPERTIES);
#endif
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
ADD_ATTR(DEVICE_, NAME);
ADD_ATTR(DEVICE_, VENDOR);
ADD_ATTR(, DRIVER_VERSION);
ADD_ATTR(DEVICE_, VERSION);
ADD_ATTR(DEVICE_, PROFILE);
ADD_ATTR(DEVICE_, VERSION);
ADD_ATTR(DEVICE_, EXTENSIONS);
ADD_ATTR(DEVICE_, PLATFORM);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(DEVICE_, PREFERRED_VECTOR_WIDTH_HALF);
ADD_ATTR(DEVICE_, HOST_UNIFIED_MEMORY);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_CHAR);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_SHORT);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_INT);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_LONG);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_FLOAT);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_DOUBLE);
ADD_ATTR(DEVICE_, NATIVE_VECTOR_WIDTH_HALF);
ADD_ATTR(DEVICE_, OPENCL_C_VERSION);
#endif
// support for cl_nv_device_attribute_query
#ifdef CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV
ADD_ATTR(DEVICE_, COMPUTE_CAPABILITY_MAJOR_NV);
ADD_ATTR(DEVICE_, COMPUTE_CAPABILITY_MINOR_NV);
ADD_ATTR(DEVICE_, REGISTERS_PER_BLOCK_NV);
ADD_ATTR(DEVICE_, WARP_SIZE_NV);
ADD_ATTR(DEVICE_, GPU_OVERLAP_NV);
ADD_ATTR(DEVICE_, KERNEL_EXEC_TIMEOUT_NV);
ADD_ATTR(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_, ATTRIBUTE_ASYNC_ENGINE_COUNT_NV);
#endif
#ifdef CL_DEVICE_PCI_BUS_ID_NV
ADD_ATTR(DEVICE_, PCI_BUS_ID_NV);
#endif
#ifdef CL_DEVICE_PCI_SLOT_ID_NV
ADD_ATTR(DEVICE_, PCI_SLOT_ID_NV);
#endif
#ifdef CL_DEVICE_PCI_SLOT_ID_NV
ADD_ATTR(DEVICE_, PCI_DOMAIN_ID_NV);
#endif
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
// {{{ cl_amd_device_attribute_query
#ifdef CL_DEVICE_PROFILING_TIMER_OFFSET_AMD
ADD_ATTR(DEVICE_, PROFILING_TIMER_OFFSET_AMD);
#endif
#ifdef CL_DEVICE_TOPOLOGY_AMD
ADD_ATTR(DEVICE_, TOPOLOGY_AMD);
#endif
#ifdef CL_DEVICE_BOARD_NAME_AMD
ADD_ATTR(DEVICE_, BOARD_NAME_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_FREE_MEMORY_AMD
ADD_ATTR(DEVICE_, GLOBAL_FREE_MEMORY_AMD);
#endif
#ifdef CL_DEVICE_SIMD_PER_COMPUTE_UNIT_AMD
ADD_ATTR(DEVICE_, SIMD_PER_COMPUTE_UNIT_AMD);
#endif
#ifdef CL_DEVICE_SIMD_WIDTH_AMD
ADD_ATTR(DEVICE_, SIMD_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_SIMD_INSTRUCTION_WIDTH_AMD
ADD_ATTR(DEVICE_, SIMD_INSTRUCTION_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD
ADD_ATTR(DEVICE_, WAVEFRONT_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNELS_AMD
ADD_ATTR(DEVICE_, GLOBAL_MEM_CHANNELS_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANKS_AMD
ADD_ATTR(DEVICE_, GLOBAL_MEM_CHANNEL_BANKS_AMD);
#endif
#ifdef CL_DEVICE_GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD
ADD_ATTR(DEVICE_, GLOBAL_MEM_CHANNEL_BANK_WIDTH_AMD);
#endif
#ifdef CL_DEVICE_LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD
ADD_ATTR(DEVICE_, LOCAL_MEM_SIZE_PER_COMPUTE_UNIT_AMD);
#endif
#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
#ifdef CL_DEVICE_GFXIP_MAJOR_AMD
ADD_ATTR(DEVICE_, GFXIP_MAJOR_AMD);
#endif
#ifdef CL_DEVICE_GFXIP_MINOR_AMD
ADD_ATTR(DEVICE_, GFXIP_MINOR_AMD);
#endif
#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);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(DEVICE_, LINKER_AVAILABLE);
ADD_ATTR(DEVICE_, BUILT_IN_KERNELS);
ADD_ATTR(DEVICE_, IMAGE_MAX_BUFFER_SIZE);
ADD_ATTR(DEVICE_, IMAGE_MAX_ARRAY_SIZE);
ADD_ATTR(DEVICE_, PARENT_DEVICE);
ADD_ATTR(DEVICE_, PARTITION_MAX_SUB_DEVICES);
ADD_ATTR(DEVICE_, PARTITION_PROPERTIES);
ADD_ATTR(DEVICE_, PARTITION_AFFINITY_DOMAIN);
ADD_ATTR(DEVICE_, PARTITION_TYPE);
ADD_ATTR(DEVICE_, REFERENCE_COUNT);
ADD_ATTR(DEVICE_, PREFERRED_INTEROP_USER_SYNC);
ADD_ATTR(DEVICE_, PRINTF_BUFFER_SIZE);
#endif
#ifdef cl_khr_image2d_from_buffer
ADD_ATTR(DEVICE_, IMAGE_PITCH_ALIGNMENT);
ADD_ATTR(DEVICE_, IMAGE_BASE_ADDRESS_ALIGNMENT);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(DEVICE_, MAX_READ_WRITE_IMAGE_ARGS);
ADD_ATTR(DEVICE_, MAX_GLOBAL_VARIABLE_SIZE);
ADD_ATTR(DEVICE_, QUEUE_ON_DEVICE_PROPERTIES);
ADD_ATTR(DEVICE_, QUEUE_ON_DEVICE_PREFERRED_SIZE);
ADD_ATTR(DEVICE_, QUEUE_ON_DEVICE_MAX_SIZE);
ADD_ATTR(DEVICE_, MAX_ON_DEVICE_QUEUES);
ADD_ATTR(DEVICE_, MAX_ON_DEVICE_EVENTS);
ADD_ATTR(DEVICE_, SVM_CAPABILITIES);
ADD_ATTR(DEVICE_, GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE);
ADD_ATTR(DEVICE_, MAX_PIPE_ARGS);
ADD_ATTR(DEVICE_, PIPE_MAX_ACTIVE_RESERVATIONS);
ADD_ATTR(DEVICE_, PIPE_MAX_PACKET_SIZE);
ADD_ATTR(DEVICE_, PREFERRED_PLATFORM_ATOMIC_ALIGNMENT);
ADD_ATTR(DEVICE_, PREFERRED_GLOBAL_ATOMIC_ALIGNMENT);
ADD_ATTR(DEVICE_, PREFERRED_LOCAL_ATOMIC_ALIGNMENT);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(DEVICE_, IL_VERSION);
ADD_ATTR(DEVICE_, MAX_NUM_SUB_GROUPS);
ADD_ATTR(DEVICE_, SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(DEVICE_, NUMERIC_VERSION);
ADD_ATTR(DEVICE_, EXTENSIONS_WITH_VERSION);
ADD_ATTR(DEVICE_, ILS_WITH_VERSION);
ADD_ATTR(DEVICE_, BUILT_IN_KERNELS_WITH_VERSION);
ADD_ATTR(DEVICE_, ATOMIC_MEMORY_CAPABILITIES);
ADD_ATTR(DEVICE_, ATOMIC_FENCE_CAPABILITIES);
ADD_ATTR(DEVICE_, NON_UNIFORM_WORK_GROUP_SUPPORT);
ADD_ATTR(DEVICE_, OPENCL_C_ALL_VERSIONS);
ADD_ATTR(DEVICE_, PREFERRED_WORK_GROUP_SIZE_MULTIPLE);
ADD_ATTR(DEVICE_, WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT);
ADD_ATTR(DEVICE_, GENERIC_ADDRESS_SPACE_SUPPORT);
ADD_ATTR(DEVICE_, OPENCL_C_FEATURES);
#ifdef CL_DEVICE_DEVICE_ENQUEUE_SUPPORT
// some busted headers shipped by Debian have this
cls.attr("DEVICE_ENQUEUE_CAPABILITIES") = CL_DEVICE_DEVICE_ENQUEUE_SUPPORT;
#else
ADD_ATTR(DEVICE_, DEVICE_ENQUEUE_CAPABILITIES);
#endif
/* cl_intel_advanced_motion_estimation */
#ifdef CL_DEVICE_ME_VERSION_INTEL
ADD_ATTR(DEVICE_, ME_VERSION_INTEL);
#endif
/* cl_qcom_ext_host_ptr */
#ifdef CL_DEVICE_EXT_MEM_PADDING_IN_BYTES_QCOM
ADD_ATTR(DEVICE_, EXT_MEM_PADDING_IN_BYTES_QCOM);
#endif
#ifdef CL_DEVICE_PAGE_SIZE_QCOM
ADD_ATTR(DEVICE_, PAGE_SIZE_QCOM);
#endif
/* cl_khr_spir */
#ifdef CL_DEVICE_SPIR_VERSIONS
ADD_ATTR(DEVICE_, SPIR_VERSIONS);
#endif
/* cl_altera_device_temperature */
#ifdef CL_DEVICE_CORE_TEMPERATURE_ALTERA
ADD_ATTR(DEVICE_, CORE_TEMPERATURE_ALTERA);
#endif
/* cl_intel_simultaneous_sharing */
#ifdef CL_DEVICE_SIMULTANEOUS_INTEROPS_INTEL
ADD_ATTR(DEVICE_, SIMULTANEOUS_INTEROPS_INTEL);
#endif
#ifdef CL_DEVICE_NUM_SIMULTANEOUS_INTEROPS_INTEL
ADD_ATTR(DEVICE_, NUM_SIMULTANEOUS_INTEROPS_INTEL);
py::class_<device_topology_type_amd> cls(m, "device_topology_type_amd");
#ifdef CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD
cls.attr("PCIE") = CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD;
#endif
py::class_<device_fp_config> cls(m, "device_fp_config");
ADD_ATTR(FP_, DENORM);
ADD_ATTR(FP_, INF_NAN);
ADD_ATTR(FP_, ROUND_TO_NEAREST);
ADD_ATTR(FP_, ROUND_TO_ZERO);
ADD_ATTR(FP_, ROUND_TO_INF);
ADD_ATTR(FP_, FMA);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(FP_, SOFT_FLOAT);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(FP_, CORRECTLY_ROUNDED_DIVIDE_SQRT);
#endif
}
{
py::class_<device_mem_cache_type> cls(m, "device_mem_cache_type");
ADD_ATTR( , NONE);
ADD_ATTR( , READ_ONLY_CACHE);
ADD_ATTR( , READ_WRITE_CACHE);
}
{
py::class_<device_local_mem_type> cls(m, "device_local_mem_type");
ADD_ATTR( , LOCAL);
ADD_ATTR( , GLOBAL);
}
{
py::class_<device_exec_capabilities> cls(m, "device_exec_capabilities");
ADD_ATTR(EXEC_, KERNEL);
ADD_ATTR(EXEC_, NATIVE_KERNEL);
#ifdef CL_EXEC_IMMEDIATE_EXECUTION_INTEL
ADD_ATTR(EXEC_, IMMEDIATE_EXECUTION_INTEL);
#endif
}
{
py::class_<device_svm_capabilities> cls(m, "device_svm_capabilities");
#if PYOPENCL_CL_VERSION >= 0x2000
// device_svm_capabilities
ADD_ATTR(DEVICE_SVM_, COARSE_GRAIN_BUFFER);
ADD_ATTR(DEVICE_SVM_, FINE_GRAIN_BUFFER);
ADD_ATTR(DEVICE_SVM_, FINE_GRAIN_SYSTEM);
ADD_ATTR(DEVICE_SVM_, ATOMICS);
#endif
}
py::class_<command_queue_properties> cls(m, "command_queue_properties");
ADD_ATTR(QUEUE_, OUT_OF_ORDER_EXEC_MODE_ENABLE);
ADD_ATTR(QUEUE_, PROFILING_ENABLE);
#ifdef CL_QUEUE_IMMEDIATE_EXECUTION_ENABLE_INTEL
ADD_ATTR(QUEUE_, IMMEDIATE_EXECUTION_ENABLE_INTEL);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(QUEUE_, ON_DEVICE);
ADD_ATTR(QUEUE_, ON_DEVICE_DEFAULT);
py::class_<context_info> cls(m, "context_info");
ADD_ATTR(CONTEXT_, REFERENCE_COUNT);
ADD_ATTR(CONTEXT_, DEVICES);
ADD_ATTR(CONTEXT_, PROPERTIES);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(CONTEXT_, NUM_DEVICES);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(CONTEXT_, INTEROP_USER_SYNC);
#endif
}
{
py::class_<gl_context_info> cls(m, "gl_context_info");
#if defined(cl_khr_gl_sharing) && (cl_khr_gl_sharing >= 1)
ADD_ATTR(, CURRENT_DEVICE_FOR_GL_CONTEXT_KHR);
ADD_ATTR(, DEVICES_FOR_GL_CONTEXT_KHR);
#endif
}
{
py::class_<context_properties> cls(m, "context_properties");
ADD_ATTR(CONTEXT_, PLATFORM);
#if defined(cl_khr_gl_sharing) && (cl_khr_gl_sharing >= 1)
ADD_ATTR( ,GL_CONTEXT_KHR);
ADD_ATTR( ,EGL_DISPLAY_KHR);
ADD_ATTR( ,GLX_DISPLAY_KHR);
ADD_ATTR( ,WGL_HDC_KHR);
ADD_ATTR( ,CGL_SHAREGROUP_KHR);
#endif
#if defined(__APPLE__) && defined(HAVE_GL)
ADD_ATTR( ,CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE);
#endif /* __APPLE__ */
// cl_amd_offline_devices
#ifdef CL_CONTEXT_OFFLINE_DEVICES_AMD
ADD_ATTR(CONTEXT_, OFFLINE_DEVICES_AMD);
#endif
}
{
py::class_<command_queue_info> cls(m, "command_queue_info");
ADD_ATTR(QUEUE_, CONTEXT);
ADD_ATTR(QUEUE_, DEVICE);
ADD_ATTR(QUEUE_, REFERENCE_COUNT);
ADD_ATTR(QUEUE_, PROPERTIES);
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(QUEUE_, PROPERTIES_ARRAY);
#endif
{
py::class_<queue_properties> cls(m, "queue_properties");
ADD_ATTR(QUEUE_, PROPERTIES);
ADD_ATTR(QUEUE_, SIZE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(QUEUE_, DEVICE_DEFAULT);
py::class_<mem_flags> cls(m, "mem_flags");
ADD_ATTR(MEM_, READ_WRITE);
ADD_ATTR(MEM_, WRITE_ONLY);
ADD_ATTR(MEM_, READ_ONLY);
ADD_ATTR(MEM_, USE_HOST_PTR);
ADD_ATTR(MEM_, ALLOC_HOST_PTR);
ADD_ATTR(MEM_, COPY_HOST_PTR);
#ifdef cl_amd_device_memory_flags
ADD_ATTR(MEM_, USE_PERSISTENT_MEM_AMD);
#endif
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MEM_, HOST_WRITE_ONLY);
ADD_ATTR(MEM_, HOST_READ_ONLY);
ADD_ATTR(MEM_, HOST_NO_ACCESS);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(MEM_, KERNEL_READ_AND_WRITE);
#endif
}
{
py::class_<svm_mem_flags> cls(m, "svm_mem_flags");
ADD_ATTR(MEM_, READ_WRITE);
ADD_ATTR(MEM_, WRITE_ONLY);
ADD_ATTR(MEM_, READ_ONLY);
ADD_ATTR(MEM_, SVM_FINE_GRAIN_BUFFER);
ADD_ATTR(MEM_, SVM_ATOMICS);
py::class_<channel_order> cls(m, "channel_order");
ADD_ATTR( , R);
ADD_ATTR( , A);
ADD_ATTR( , RG);
ADD_ATTR( , RA);
ADD_ATTR( , RGB);
ADD_ATTR( , RGBA);
ADD_ATTR( , BGRA);
ADD_ATTR( , INTENSITY);
ADD_ATTR( , LUMINANCE);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR( , Rx);
ADD_ATTR( , RGx);
ADD_ATTR( , RGBx);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR( , sRGB);
ADD_ATTR( , sRGBx);
ADD_ATTR( , sRGBA);
ADD_ATTR( , sBGRA);
ADD_ATTR( , ABGR);
py::class_<channel_type> cls(m, "channel_type");
ADD_ATTR( , SNORM_INT8);
ADD_ATTR( , SNORM_INT16);
ADD_ATTR( , UNORM_INT8);
ADD_ATTR( , UNORM_INT16);
ADD_ATTR( , UNORM_SHORT_565);
ADD_ATTR( , UNORM_SHORT_555);
ADD_ATTR( , UNORM_INT_101010);
ADD_ATTR( , SIGNED_INT8);
ADD_ATTR( , SIGNED_INT16);
ADD_ATTR( , SIGNED_INT32);
ADD_ATTR( , UNSIGNED_INT8);
ADD_ATTR( , UNSIGNED_INT16);
ADD_ATTR( , UNSIGNED_INT32);
ADD_ATTR( , HALF_FLOAT);
ADD_ATTR( , FLOAT);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR( , UNORM_INT24);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR( , UNORM_INT_101010_2);
#endif
py::class_<mem_object_type> cls(m, "mem_object_type");
ADD_ATTR(MEM_OBJECT_, BUFFER);
ADD_ATTR(MEM_OBJECT_, IMAGE2D);
ADD_ATTR(MEM_OBJECT_, IMAGE3D);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MEM_OBJECT_, IMAGE2D_ARRAY);
ADD_ATTR(MEM_OBJECT_, IMAGE1D);
ADD_ATTR(MEM_OBJECT_, IMAGE1D_ARRAY);
ADD_ATTR(MEM_OBJECT_, IMAGE1D_BUFFER);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(MEM_OBJECT_, PIPE);
py::class_<mem_info> cls(m, "mem_info");
ADD_ATTR(MEM_, TYPE);
ADD_ATTR(MEM_, FLAGS);
ADD_ATTR(MEM_, SIZE);
ADD_ATTR(MEM_, HOST_PTR);
ADD_ATTR(MEM_, MAP_COUNT);
ADD_ATTR(MEM_, REFERENCE_COUNT);
ADD_ATTR(MEM_, CONTEXT);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(MEM_, ASSOCIATED_MEMOBJECT);
ADD_ATTR(MEM_, OFFSET);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(MEM_, USES_SVM_POINTER);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(MEM_, PROPERTIES);
py::class_<image_info> cls(m, "image_info");
ADD_ATTR(IMAGE_, FORMAT);
ADD_ATTR(IMAGE_, ELEMENT_SIZE);
ADD_ATTR(IMAGE_, ROW_PITCH);
ADD_ATTR(IMAGE_, SLICE_PITCH);
ADD_ATTR(IMAGE_, WIDTH);
ADD_ATTR(IMAGE_, HEIGHT);
ADD_ATTR(IMAGE_, DEPTH);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(IMAGE_, ARRAY_SIZE);
ADD_ATTR(IMAGE_, BUFFER);
ADD_ATTR(IMAGE_, NUM_MIP_LEVELS);
ADD_ATTR(IMAGE_, NUM_SAMPLES);
#endif
}
{
py::class_<pipe_info> cls(m, "pipe_info");
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(PIPE_, PACKET_SIZE);
ADD_ATTR(PIPE_, MAX_PACKETS);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(PIPE_, PROPERTIES);
#endif
}
py::class_<pipe_properties> cls(m, "pipe_properties");
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(PIPE_, PACKET_SIZE);
ADD_ATTR(PIPE_, MAX_PACKETS);
#endif
}
py::class_<addressing_mode> cls(m, "addressing_mode");
ADD_ATTR(ADDRESS_, NONE);
ADD_ATTR(ADDRESS_, CLAMP_TO_EDGE);
ADD_ATTR(ADDRESS_, CLAMP);
ADD_ATTR(ADDRESS_, REPEAT);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(ADDRESS_, MIRRORED_REPEAT);
#endif
}
{
py::class_<filter_mode> cls(m, "filter_mode");
ADD_ATTR(FILTER_, NEAREST);
ADD_ATTR(FILTER_, LINEAR);
}
{
py::class_<sampler_info> cls(m, "sampler_info");
ADD_ATTR(SAMPLER_, REFERENCE_COUNT);
ADD_ATTR(SAMPLER_, CONTEXT);
ADD_ATTR(SAMPLER_, NORMALIZED_COORDS);
ADD_ATTR(SAMPLER_, ADDRESSING_MODE);
ADD_ATTR(SAMPLER_, FILTER_MODE);
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(SAMPLER_, MIP_FILTER_MODE);
ADD_ATTR(SAMPLER_, LOD_MIN);
ADD_ATTR(SAMPLER_, LOD_MAX);
#endif
#if PYOPENCL_CL_VERSION >= 0x3000
ADD_ATTR(SAMPLER_, PROPERTIES);
// {{{ cl_khr_mipmap_image
#ifdef CL_SAMPLER_MIP_FILTER_MODE_KHR
ADD_ATTR(SAMPLER_, MIP_FILTER_MODE_KHR);
ADD_ATTR(SAMPLER_, LOD_MIN_KHR);
ADD_ATTR(SAMPLER_, LOD_MAX_KHR);
#endif
// }}}
{
py::class_<sampler_properties> cls(m, "sampler_properties");
ADD_ATTR(SAMPLER_, NORMALIZED_COORDS);
ADD_ATTR(SAMPLER_, ADDRESSING_MODE);
ADD_ATTR(SAMPLER_, FILTER_MODE);
}
py::class_<map_flags> cls(m, "map_flags");
ADD_ATTR(MAP_, READ);
ADD_ATTR(MAP_, WRITE);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(MAP_, WRITE_INVALIDATE_REGION);
#endif
}
{
py::class_<program_info> cls(m, "program_info");
ADD_ATTR(PROGRAM_, REFERENCE_COUNT);
ADD_ATTR(PROGRAM_, CONTEXT);
ADD_ATTR(PROGRAM_, NUM_DEVICES);
ADD_ATTR(PROGRAM_, DEVICES);
ADD_ATTR(PROGRAM_, SOURCE);
ADD_ATTR(PROGRAM_, BINARY_SIZES);
ADD_ATTR(PROGRAM_, BINARIES);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(PROGRAM_, NUM_KERNELS);
ADD_ATTR(PROGRAM_, KERNEL_NAMES);
#endif
#if PYOPENCL_CL_VERSION >= 0x2010
ADD_ATTR(PROGRAM_, IL);
#endif
#if PYOPENCL_CL_VERSION >= 0x2020
ADD_ATTR(PROGRAM_, SCOPE_GLOBAL_CTORS_PRESENT);
ADD_ATTR(PROGRAM_, SCOPE_GLOBAL_DTORS_PRESENT);
py::class_<program_build_info> cls(m, "program_build_info");
ADD_ATTR(PROGRAM_BUILD_, STATUS);
ADD_ATTR(PROGRAM_BUILD_, OPTIONS);
ADD_ATTR(PROGRAM_BUILD_, LOG);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(PROGRAM_, BINARY_TYPE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(PROGRAM_BUILD_, GLOBAL_VARIABLE_TOTAL_SIZE);
py::class_<program_binary_type> cls(m, "program_binary_type");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(PROGRAM_BINARY_TYPE_, NONE);
ADD_ATTR(PROGRAM_BINARY_TYPE_, COMPILED_OBJECT);
ADD_ATTR(PROGRAM_BINARY_TYPE_, LIBRARY);
ADD_ATTR(PROGRAM_BINARY_TYPE_, EXECUTABLE);
#endif
}
{
py::class_<kernel_info> cls(m, "kernel_info");
ADD_ATTR(KERNEL_, FUNCTION_NAME);
ADD_ATTR(KERNEL_, NUM_ARGS);
ADD_ATTR(KERNEL_, REFERENCE_COUNT);
ADD_ATTR(KERNEL_, CONTEXT);
ADD_ATTR(KERNEL_, PROGRAM);
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_, ATTRIBUTES);
#endif
}
{
py::class_<kernel_arg_info> cls(m, "kernel_arg_info");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_, ADDRESS_QUALIFIER);
ADD_ATTR(KERNEL_ARG_, ACCESS_QUALIFIER);
ADD_ATTR(KERNEL_ARG_, TYPE_NAME);
ADD_ATTR(KERNEL_ARG_, NAME);
#endif
}
{
py::class_<kernel_arg_address_qualifier> cls(
m, "kernel_arg_address_qualifier");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_ADDRESS_, GLOBAL);
ADD_ATTR(KERNEL_ARG_ADDRESS_, LOCAL);
ADD_ATTR(KERNEL_ARG_ADDRESS_, CONSTANT);
ADD_ATTR(KERNEL_ARG_ADDRESS_, PRIVATE);
#endif
}
{
py::class_<kernel_arg_access_qualifier> cls(
m, "kernel_arg_access_qualifier");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_ACCESS_, READ_ONLY);
ADD_ATTR(KERNEL_ARG_ACCESS_, WRITE_ONLY);
ADD_ATTR(KERNEL_ARG_ACCESS_, READ_WRITE);
ADD_ATTR(KERNEL_ARG_ACCESS_, NONE);
#endif
}
{
py::class_<kernel_arg_type_qualifier> cls(
m, "kernel_arg_type_qualifier");
#if PYOPENCL_CL_VERSION >= 0x1020
ADD_ATTR(KERNEL_ARG_TYPE_, NONE);
ADD_ATTR(KERNEL_ARG_TYPE_, CONST);
ADD_ATTR(KERNEL_ARG_TYPE_, RESTRICT);
ADD_ATTR(KERNEL_ARG_TYPE_, VOLATILE);
#endif
#if PYOPENCL_CL_VERSION >= 0x2000
ADD_ATTR(KERNEL_ARG_TYPE_, PIPE);
#endif
}
py::class_<kernel_work_group_info> cls(m, "kernel_work_group_info");
ADD_ATTR(KERNEL_, WORK_GROUP_SIZE);
ADD_ATTR(KERNEL_, COMPILE_WORK_GROUP_SIZE);
ADD_ATTR(KERNEL_, LOCAL_MEM_SIZE);
#if PYOPENCL_CL_VERSION >= 0x1010
ADD_ATTR(KERNEL_, PREFERRED_WORK_GROUP_SIZE_MULTIPLE);