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...
|
![]() |
|
||||||||