J'implémente pour le moment le nouveau module 'OpenCL qui permettra d'utiliser directement cette technologie dans les scripts Abstrasy.
Bien sûr, au moment où j'écris ces lignes, l'implémentation est réduite mais elle fonctionne.
Donc, bien que toujours à l'état embryonnaire, le module 'OpenCL est tout de même assez révélateur des avantages que peut procurer Abstrasy.
En réalité, pour utiliser l'OpenCL, l'interpréteur récupère et charge tout seul l'API JOCL qui est intégrée au paquetage principal Abstrasy. Il n'est donc pas nécessaire d'ajouter soi-même cette bibliothèque au classpath. L'interpréteur s'en occupe et “à chaud”.
Voyez ci-dessous un script d'exemple qui affiche à l'écran les informations du matériel OpenCL disponible. Comme vous pouvez sans doute le constater, le module 'OpenCL n'est pas un simple wrapper de l'API JOCL. Il propose une interface adatée pour le langage. Il profite ainsi de nombreux avantages et d'une grande simplicité.
#
# The MIT License
#
# Copyright © 2013-2015 Luc BRUNINX.
#
# 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.
#
(import 'OpenCL)
#
# Enumérer toutes les plate-formes OpenCL disponibles sur la machine.
#
(for 'p (iterator OpenCL:Platforms:ALL) {
# informations de la plate-forme...
(display "PLATFORM : " p)
(display " ID : " p:ID)
(display " NAME : " p:NAME)
(display " VENDOR : " p:VENDOR)
(display " VERSION : " p:VERSION)
(display " PROFILE : " p:PROFILE)
(display " EXTENSIONS : " (raw-string p:EXTENSIONS))
(for 't (iterator p:EXTENSIONS) {
(display " " t)
})
(display)
#
# Enumérer tous les composants matériels disponibles pour cette plate-forme.
#
(for 'd (iterator (p:get-all-devices)) {
# informations du matériel...
(display " DEVICE : " d)
(display " ID : " d:ID)
(display " NAME : " d:NAME)
(display " VENDOR : " d:VENDOR)
(display " VENDOR_ID : " (hex-string d:VENDOR_ID))
(display " VERSION : " d:VERSION)
(display " DRIVER_VERSION : " d:DRIVER_VERSION)
(display " OPENCL_C_VERSION : " d:OPENCL_C_VERSION)
(display " DEVICE_TYPE : " (hex-string d:DEVICE_TYPE))
(display " DEVICE_TYPE_SET : " (raw-string d:DEVICE_TYPE_SET))
(for 't (iterator d:DEVICE_TYPE_SET) {
(display " " t)
})
(display " PROFILE : " d:PROFILE)
(display " EXTENSIONS : " (raw-string d:EXTENSIONS))
(for 'ext (iterator d:EXTENSIONS) {
(display " " ext)
})
(display " MAX_COMPUTE_UNITS : " d:MAX_COMPUTE_UNITS)
(display " MAX_WORK_ITEM_DIMENSIONS : " d:MAX_WORK_ITEM_DIMENSIONS)
(display " MAX_WORK_ITEM_SIZES : " d:MAX_WORK_ITEM_SIZES)
(display " MAX_WORK_GROUP_SIZE : " d:MAX_WORK_GROUP_SIZE)
(display " MAX_CLOCK_FREQUENCY : " d:MAX_CLOCK_FREQUENCY)
(display " ADDRESS_BITS : " d:ADDRESS_BITS)
(display " PREFERRED_VECTOR_WIDTH_CHAR : " d:PREFERRED_VECTOR_WIDTH_CHAR)
(display " PREFERRED_VECTOR_WIDTH_SHORT : " d:PREFERRED_VECTOR_WIDTH_SHORT)
(display " PREFERRED_VECTOR_WIDTH_INT : " d:PREFERRED_VECTOR_WIDTH_INT)
(display " PREFERRED_VECTOR_WIDTH_LONG : " d:PREFERRED_VECTOR_WIDTH_LONG)
(display " PREFERRED_VECTOR_WIDTH_HALF : " d:PREFERRED_VECTOR_WIDTH_HALF)
(display " PREFERRED_VECTOR_WIDTH_FLOAT : " d:PREFERRED_VECTOR_WIDTH_FLOAT)
(display " PREFERRED_VECTOR_WIDTH_DOUBLE : " d:PREFERRED_VECTOR_WIDTH_DOUBLE)
(display " NATIVE_VECTOR_WIDTH_CHAR : " d:NATIVE_VECTOR_WIDTH_CHAR)
(display " NATIVE_VECTOR_WIDTH_SHORT : " d:NATIVE_VECTOR_WIDTH_SHORT)
(display " NATIVE_VECTOR_WIDTH_INT : " d:NATIVE_VECTOR_WIDTH_INT)
(display " NATIVE_VECTOR_WIDTH_LONG : " d:NATIVE_VECTOR_WIDTH_LONG)
(display " NATIVE_VECTOR_WIDTH_HALF : " d:NATIVE_VECTOR_WIDTH_HALF)
(display " NATIVE_VECTOR_WIDTH_FLOAT : " d:NATIVE_VECTOR_WIDTH_FLOAT)
(display " NATIVE_VECTOR_WIDTH_DOUBLE : " d:NATIVE_VECTOR_WIDTH_DOUBLE)
(display " MAX_MEM_ALLOC_SIZE : " d:MAX_MEM_ALLOC_SIZE)
(display " IMAGE_SUPPORT : " d:IMAGE_SUPPORT)
(display " MAX_READ_IMAGE_ARGS : " d:MAX_READ_IMAGE_ARGS)
(display " MAX_WRITE_IMAGE_ARGS : " d:MAX_WRITE_IMAGE_ARGS)
(display " IMAGE2D_MAX_WIDTH : " d:IMAGE2D_MAX_WIDTH)
(display " IMAGE2D_MAX_HEIGHT : " d:IMAGE2D_MAX_HEIGHT)
(display " IMAGE3D_MAX_WIDTH : " d:IMAGE3D_MAX_WIDTH)
(display " IMAGE3D_MAX_HEIGHT : " d:IMAGE3D_MAX_HEIGHT)
(display " IMAGE3D_MAX_DEPTH : " d:IMAGE3D_MAX_DEPTH)
(display " MAX_SAMPLERS : " d:MAX_SAMPLERS)
(display " MAX_PARAMETER_SIZE : " d:MAX_PARAMETER_SIZE)
(display " MEM_BASE_ADDR_ALIGN : " d:MEM_BASE_ADDR_ALIGN)
(display " MIN_DATA_TYPE_ALIGN_SIZE : " d:MIN_DATA_TYPE_ALIGN_SIZE)
(display " SINGLE_FP_CONFIG : " d:SINGLE_FP_CONFIG)
(display " SINGLE_FP_CONFIG_SET : " (raw-string d:SINGLE_FP_CONFIG_SET))
(for 't (iterator d:SINGLE_FP_CONFIG_SET) {
(display " " t)
})
(display " GLOBAL_MEM_CACHE_TYPE : " d:GLOBAL_MEM_CACHE_TYPE)
(display " GLOBAL_MEM_CACHE_TYPE_SET : " (raw-string d:GLOBAL_MEM_CACHE_TYPE_SET))
(for 't (iterator d:GLOBAL_MEM_CACHE_TYPE_SET) {
(display " " t)
})
(display " GLOBAL_MEM_CACHELINE_SIZE : " d:GLOBAL_MEM_CACHELINE_SIZE)
(display " GLOBAL_MEM_CACHE_SIZE : " d:GLOBAL_MEM_CACHE_SIZE)
(display " LOCAL_MEM_TYPE : " d:LOCAL_MEM_TYPE)
(display " LOCAL_MEM_TYPE_SET : " (raw-string d:LOCAL_MEM_TYPE_SET))
(for 't (iterator d:LOCAL_MEM_TYPE_SET) {
(display " " t)
})
(display " LOCAL_MEM_SIZE : " d:LOCAL_MEM_SIZE)
(display " ERROR_CORRECTION_SUPPORT : " d:ERROR_CORRECTION_SUPPORT)
(display " HOST_UNIFIED_MEMORY : " d:HOST_UNIFIED_MEMORY)
(display " PROFILING_TIMER_RESOLUTION : " d:PROFILING_TIMER_RESOLUTION)
(display " ENDIAN_LITTLE : " d:ENDIAN_LITTLE)
(display " AVAILABLE : " d:AVAILABLE)
(display " COMPILER_AVAILABLE : " d:COMPILER_AVAILABLE)
(display " EXECUTION_CAPABILITIES : " d:EXECUTION_CAPABILITIES)
(display " EXECUTION_CAPABILITIES_SET : " (raw-string d:EXECUTION_CAPABILITIES_SET))
(for 't (iterator d:EXECUTION_CAPABILITIES_SET) {
(display " " t)
})
(display " QUEUE_PROPERTIES : " d:QUEUE_PROPERTIES)
(display " QUEUE_PROPERTIES_SET : " (raw-string d:QUEUE_PROPERTIES_SET))
(for 't (iterator d:QUEUE_PROPERTIES_SET) {
(display " " t)
})
(display " PLATFORM : " d:PLATFORM)
(display)
})
(display)
})
Sur ma machine, je dispose d'une carte NVIDIA QUADRO K5000 et le script ci-dessus donne ceci comme résultat:
PLATFORM : NVIDIA CUDA : NVIDIA Corporation : OpenCL 1.1 CUDA 6.0.1
ID : cl_platform_id[0x7f514c0a9600]
NAME : NVIDIA CUDA
VENDOR : NVIDIA Corporation
VERSION : OpenCL 1.1 CUDA 6.0.1
PROFILE : FULL_PROFILE
EXTENSIONS : (finite-set #|0x31D1A84F|#)
cl_khr_icd
cl_nv_pragma_unroll
cl_nv_device_attribute_query
cl_nv_compiler_options
cl_khr_gl_sharing
cl_khr_byte_addressable_store
DEVICE : Quadro K5000 : NVIDIA Corporation : OpenCL 1.1 CUDA
ID : cl_device_id[0x7f514c2428d0]
NAME : Quadro K5000
VENDOR : NVIDIA Corporation
VENDOR_ID : 0x10DEL
VERSION : OpenCL 1.1 CUDA
DRIVER_VERSION : 331.38
OPENCL_C_VERSION : OpenCL C 1.1
DEVICE_TYPE : 0x4L
DEVICE_TYPE_SET : (finite-set #|0x2D6B2D61|#)
'@!GPU
PROFILE : FULL_PROFILE
EXTENSIONS : (finite-set #|0x33E61296|#)
cl_khr_global_int32_extended_atomics
cl_khr_icd
cl_nv_pragma_unroll
cl_khr_global_int32_base_atomics
cl_khr_fp64
cl_nv_device_attribute_query
cl_nv_compiler_options
cl_khr_local_int32_extended_atomics
cl_khr_gl_sharing
cl_khr_byte_addressable_store
cl_khr_local_int32_base_atomics
MAX_COMPUTE_UNITS : 8
MAX_WORK_ITEM_DIMENSIONS : 3L
MAX_WORK_ITEM_SIZES : (long-ints 1024L 1024L 64L)
MAX_WORK_GROUP_SIZE : 1024L
MAX_CLOCK_FREQUENCY : 705L
ADDRESS_BITS : 32
PREFERRED_VECTOR_WIDTH_CHAR : 1
PREFERRED_VECTOR_WIDTH_SHORT : 1
PREFERRED_VECTOR_WIDTH_INT : 1
PREFERRED_VECTOR_WIDTH_LONG : 1
PREFERRED_VECTOR_WIDTH_HALF : 0
PREFERRED_VECTOR_WIDTH_FLOAT : 1
PREFERRED_VECTOR_WIDTH_DOUBLE : 1
NATIVE_VECTOR_WIDTH_CHAR : 1
NATIVE_VECTOR_WIDTH_SHORT : 1
NATIVE_VECTOR_WIDTH_INT : 1
NATIVE_VECTOR_WIDTH_LONG : 1
NATIVE_VECTOR_WIDTH_HALF : 0
NATIVE_VECTOR_WIDTH_FLOAT : 1
NATIVE_VECTOR_WIDTH_DOUBLE : 1
MAX_MEM_ALLOC_SIZE : 1073561600L
IMAGE_SUPPORT : (true)
MAX_READ_IMAGE_ARGS : 256
MAX_WRITE_IMAGE_ARGS : 16
IMAGE2D_MAX_WIDTH : 32768L
IMAGE2D_MAX_HEIGHT : 32768L
IMAGE3D_MAX_WIDTH : 4096L
IMAGE3D_MAX_HEIGHT : 4096L
IMAGE3D_MAX_DEPTH : 4096L
MAX_SAMPLERS : 32
MAX_PARAMETER_SIZE : 4352L
MEM_BASE_ADDR_ALIGN : 4096
MIN_DATA_TYPE_ALIGN_SIZE : 128
SINGLE_FP_CONFIG : 63L
SINGLE_FP_CONFIG_SET : (finite-set #|0x25E4BCCE|#)
'@!FP_ROUND_TO_INF
'@!FP_INF_NAN
'@!FP_ROUND_TO_ZERO
'@!FP_FMA
'@!FP_DENORM
'@!FP_ROUND_TO_NEAREST
GLOBAL_MEM_CACHE_TYPE : 2L
GLOBAL_MEM_CACHE_TYPE_SET : (finite-set #|0x69583587|#)
'@!READ_WRITE_CACHE
GLOBAL_MEM_CACHELINE_SIZE : 128
GLOBAL_MEM_CACHE_SIZE : 131072L
LOCAL_MEM_TYPE : 1L
LOCAL_MEM_TYPE_SET : (finite-set #|0x1D2C0DE8|#)
'@!LOCAL
LOCAL_MEM_SIZE : 49152L
ERROR_CORRECTION_SUPPORT : (false)
HOST_UNIFIED_MEMORY : (false)
PROFILING_TIMER_RESOLUTION : 0
ENDIAN_LITTLE : (true)
AVAILABLE : (true)
COMPILER_AVAILABLE : (true)
EXECUTION_CAPABILITIES : 1L
EXECUTION_CAPABILITIES_SET : (finite-set #|0x1EDDCE79|#)
'@!EXEC_KERNEL
QUEUE_PROPERTIES : 3L
QUEUE_PROPERTIES_SET : (finite-set #|0x1E5F03A0|#)
'@!QUEUE_PROFILING_ENABLE
'@!QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
PLATFORM : NVIDIA CUDA : NVIDIA Corporation : OpenCL 1.1 CUDA 6.0.1
Ready...
A première vue, ce résulat peut étonner. Mais, il est correcte. L'interface OpenCL NVIDIA ne présente pas les CUDA cores, mais les SMX. Du coup, les informations ci-dessus sont plus évidentes. La carte NVIDIA QUADRO K5000 possède bien 8 SMX (et chacun contient 192 unités de calculs - les CUDA cores).
A titre indicatif, voici le résultat obtenu sur un iMac. Ici, le script énumère chaque équipement matériel (devices) GPU et CPU :
PLATFORM : Apple : Apple : OpenCL 1.2 (Apr 25 2014 22:04:25)
ID : cl_platform_id[0x7fff0000]
NAME : Apple
VENDOR : Apple
VERSION : OpenCL 1.2 (Apr 25 2014 22:04:25)
PROFILE : FULL_PROFILE
EXTENSIONS : (finite-set #|0x5F4D17BF|#)
cl_APPLE_clut
cl_APPLE_query_kernel_names
cl_khr_gl_event
cl_APPLE_ContextLoggingFunctions
cl_APPLE_SetMemObjectDestructor
cl_APPLE_gl_sharing
DEVICE : Intel(R) Core(TM) i5-4570R CPU @ 2.70GHz : Intel : OpenCL 1.2
ID : cl_device_id[0xffffffff]
NAME : Intel(R) Core(TM) i5-4570R CPU @ 2.70GHz
VENDOR : Intel
VENDOR_ID : 0xFFFFFFFFL
VERSION : OpenCL 1.2
DRIVER_VERSION : 1.1
OPENCL_C_VERSION : OpenCL C 1.2
DEVICE_TYPE : 0x2L
DEVICE_TYPE_SET : (finite-set #|0x50554A86|#)
'@!CPU
PROFILE : FULL_PROFILE
EXTENSIONS : (finite-set #|0x43150316|#)
cl_APPLE_clut
cl_khr_global_int32_base_atomics
cl_khr_fp64
cl_APPLE_biased_fixed_point_image_formats
cl_khr_gl_event
cl_khr_3d_image_writes
cl_APPLE_ContextLoggingFunctions
cl_khr_int64_base_atomics
cl_khr_image2d_from_buffer
cl_APPLE_SetMemObjectDestructor
cl_khr_byte_addressable_store
cl_APPLE_gl_sharing
cl_khr_global_int32_extended_atomics
cl_APPLE_query_kernel_names
cl_APPLE_command_queue_priority
cl_APPLE_fp64_basic_ops
cl_khr_int64_extended_atomics
cl_khr_local_int32_extended_atomics
cl_APPLE_fixed_alpha_channel_orders
cl_khr_local_int32_base_atomics
MAX_COMPUTE_UNITS : 4
MAX_WORK_ITEM_DIMENSIONS : 3L
MAX_WORK_ITEM_SIZES : (long-ints 1024L 1L 1L)
MAX_WORK_GROUP_SIZE : 1024L
MAX_CLOCK_FREQUENCY : 2700L
ADDRESS_BITS : 64
PREFERRED_VECTOR_WIDTH_CHAR : 16
PREFERRED_VECTOR_WIDTH_SHORT : 8
PREFERRED_VECTOR_WIDTH_INT : 4
PREFERRED_VECTOR_WIDTH_LONG : 2
PREFERRED_VECTOR_WIDTH_HALF : 0
PREFERRED_VECTOR_WIDTH_FLOAT : 4
PREFERRED_VECTOR_WIDTH_DOUBLE : 2
NATIVE_VECTOR_WIDTH_CHAR : 16
NATIVE_VECTOR_WIDTH_SHORT : 8
NATIVE_VECTOR_WIDTH_INT : 4
NATIVE_VECTOR_WIDTH_LONG : 2
NATIVE_VECTOR_WIDTH_HALF : 0
NATIVE_VECTOR_WIDTH_FLOAT : 4
NATIVE_VECTOR_WIDTH_DOUBLE : 2
MAX_MEM_ALLOC_SIZE : 2147483648L
IMAGE_SUPPORT : (true)
MAX_READ_IMAGE_ARGS : 128
MAX_WRITE_IMAGE_ARGS : 8
IMAGE2D_MAX_WIDTH : 8192L
IMAGE2D_MAX_HEIGHT : 8192L
IMAGE3D_MAX_WIDTH : 2048L
IMAGE3D_MAX_HEIGHT : 2048L
IMAGE3D_MAX_DEPTH : 2048L
MAX_SAMPLERS : 16
MAX_PARAMETER_SIZE : 4096L
MEM_BASE_ADDR_ALIGN : 1024
MIN_DATA_TYPE_ALIGN_SIZE : 128
SINGLE_FP_CONFIG : 191L
SINGLE_FP_CONFIG_SET : (finite-set #|0x0CA386CB|#)
'@!FP_ROUND_TO_INF
'@!FP_FMA
'@!FP_ROUND_TO_ZERO
'@!FP_INF_NAN
'@!FP_DENORM
'@!FP_ROUND_TO_NEAREST
GLOBAL_MEM_CACHE_TYPE : 2L
GLOBAL_MEM_CACHE_TYPE_SET : (finite-set #|0x5A67FF8B|#)
'@!READ_WRITE_CACHE
GLOBAL_MEM_CACHELINE_SIZE : 4194304
GLOBAL_MEM_CACHE_SIZE : 64L
LOCAL_MEM_TYPE : 2L
LOCAL_MEM_TYPE_SET : (finite-set #|0x201C8F3B|#)
'@!GLOBAL
LOCAL_MEM_SIZE : 32768L
ERROR_CORRECTION_SUPPORT : (false)
HOST_UNIFIED_MEMORY : (true)
PROFILING_TIMER_RESOLUTION : 0
ENDIAN_LITTLE : (true)
AVAILABLE : (true)
COMPILER_AVAILABLE : (true)
EXECUTION_CAPABILITIES : 3L
EXECUTION_CAPABILITIES_SET : (finite-set #|0x4BFA359D|#)
'@!EXEC_KERNEL
'@!EXEC_NATIVE_KERNEL
QUEUE_PROPERTIES : 2L
QUEUE_PROPERTIES_SET : (finite-set #|0x5BFF67F7|#)
'@!QUEUE_PROFILING_ENABLE
PLATFORM : Apple : Apple : OpenCL 1.2 (Apr 25 2014 22:04:25)
DEVICE : Iris Pro : Intel : OpenCL 1.2
ID : cl_device_id[0x1024500]
NAME : Iris Pro
VENDOR : Intel
VENDOR_ID : 0x1024500L
VERSION : OpenCL 1.2
DRIVER_VERSION : 1.2(Jun 9 2014 13:24:19)
OPENCL_C_VERSION : OpenCL C 1.2
DEVICE_TYPE : 0x4L
DEVICE_TYPE_SET : (finite-set #|0x3E0150A4|#)
'@!GPU
PROFILE : FULL_PROFILE
EXTENSIONS : (finite-set #|0x7AA06508|#)
cl_APPLE_clut
cl_khr_gl_depth_images
cl_khr_global_int32_base_atomics
cl_khr_gl_event
cl_khr_depth_images
cl_APPLE_ContextLoggingFunctions
cl_khr_image2d_from_buffer
cl_APPLE_SetMemObjectDestructor
cl_khr_byte_addressable_store
cl_APPLE_gl_sharing
cl_khr_global_int32_extended_atomics
cl_APPLE_query_kernel_names
cl_khr_local_int32_extended_atomics
cl_khr_local_int32_base_atomics
MAX_COMPUTE_UNITS : 280
MAX_WORK_ITEM_DIMENSIONS : 3L
MAX_WORK_ITEM_SIZES : (long-ints 512L 512L 512L)
MAX_WORK_GROUP_SIZE : 512L
MAX_CLOCK_FREQUENCY : 1200L
ADDRESS_BITS : 64
PREFERRED_VECTOR_WIDTH_CHAR : 1
PREFERRED_VECTOR_WIDTH_SHORT : 1
PREFERRED_VECTOR_WIDTH_INT : 1
PREFERRED_VECTOR_WIDTH_LONG : 1
PREFERRED_VECTOR_WIDTH_HALF : 0
PREFERRED_VECTOR_WIDTH_FLOAT : 1
PREFERRED_VECTOR_WIDTH_DOUBLE : 0
NATIVE_VECTOR_WIDTH_CHAR : 1
NATIVE_VECTOR_WIDTH_SHORT : 1
NATIVE_VECTOR_WIDTH_INT : 1
NATIVE_VECTOR_WIDTH_LONG : 1
NATIVE_VECTOR_WIDTH_HALF : 0
NATIVE_VECTOR_WIDTH_FLOAT : 1
NATIVE_VECTOR_WIDTH_DOUBLE : 0
MAX_MEM_ALLOC_SIZE : 402653184L
IMAGE_SUPPORT : (true)
MAX_READ_IMAGE_ARGS : 128
MAX_WRITE_IMAGE_ARGS : 8
IMAGE2D_MAX_WIDTH : 16384L
IMAGE2D_MAX_HEIGHT : 16384L
IMAGE3D_MAX_WIDTH : 2048L
IMAGE3D_MAX_HEIGHT : 2048L
IMAGE3D_MAX_DEPTH : 2048L
MAX_SAMPLERS : 16
MAX_PARAMETER_SIZE : 1024L
MEM_BASE_ADDR_ALIGN : 1024
MIN_DATA_TYPE_ALIGN_SIZE : 128
SINGLE_FP_CONFIG : 30L
SINGLE_FP_CONFIG_SET : (finite-set #|0x60ECF11C|#)
'@!FP_ROUND_TO_INF
'@!FP_ROUND_TO_ZERO
'@!FP_INF_NAN
'@!FP_ROUND_TO_NEAREST
GLOBAL_MEM_CACHE_TYPE : 0L
GLOBAL_MEM_CACHE_TYPE_SET : (finite-set #|0x408CF229|#)
'@!NONE
GLOBAL_MEM_CACHELINE_SIZE : 0
GLOBAL_MEM_CACHE_SIZE : 0L
LOCAL_MEM_TYPE : 1L
LOCAL_MEM_TYPE_SET : (finite-set #|0x743C0EEC|#)
'@!LOCAL
LOCAL_MEM_SIZE : 65536L
ERROR_CORRECTION_SUPPORT : (false)
HOST_UNIFIED_MEMORY : (true)
PROFILING_TIMER_RESOLUTION : 0
ENDIAN_LITTLE : (true)
AVAILABLE : (true)
COMPILER_AVAILABLE : (true)
EXECUTION_CAPABILITIES : 1L
EXECUTION_CAPABILITIES_SET : (finite-set #|0x0D4DAD46|#)
'@!EXEC_KERNEL
QUEUE_PROPERTIES : 2L
QUEUE_PROPERTIES_SET : (finite-set #|0x5BFF67F7|#)
'@!QUEUE_PROFILING_ENABLE
PLATFORM : Apple : Apple : OpenCL 1.2 (Apr 25 2014 22:04:25)
Ready...
|
|
|
||||||||