Name ARM_shared_virtual_memory Name Strings cl_arm_shared_virtual_memory Contributors Robert Elliott, ARM Mats Petersson, ARM Contact Robert Elliott, ARM (robert.elliott 'at' ARM.com) IP Status No claims or disclosures are known to exist. Version Revision: #2, Mar 14th, 2018 Number OpenCL Extension #40 Status Deprecated in favour of the equivalent OpenCL 2.0 feature. Extension Type OpenCL device extension Dependencies Requires OpenCL version 1.2 or later. Overview This extension enables the shared virtual memory features in versions prior to 2.0 as described in OpenCL version 2.0 section 3. The C11 style atomics provided in OpenCL C version 2.0 is also supported, with the exception that generic address space is not supported. For these functions, address space specific variants have been provided. Memory allocated through clSVMAllocARM can be used as host_ptr passed to clCreateImage and clCreateBuffer, as per 5.6.1 in the OpenCL 2.0 specification. Header File cl_ext.h New Types Atomic types according to OpenCL C version 2.0 section: Memory order 6.13.11.3 Memory scope 6.13.11.4 Atomic integer and floating-point types 6.13.11.6 New host types The following types are added to allow the arguments to the functions described below. Bitfield types are using the same bit values as their CL 2.0 counterparts. The cl_kernel_exec_info_arm type uses the new tokens CL_KERNEL_EXEC_INFO_SVM_PTRS_ARM and CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM_ARM. typedef cl_bitfield cl_svm_mem_flags_arm; typedef cl_uint cl_kernel_exec_info_arm; typedef cl_bitfield cl_device_svm_capabilities_arm; New Procedures and Functions Built-in Function Atomic C11 functions as per OpenCL C version 2.0 section 6.13.11. Program scope variables and generic address space are not supported. Examples that should work: kernel nuclear_reactor() { local volatile atomic_int destMemory; int value = 42; int old_value = atomic_fetch_max( &destMemory, value ); } kernel nuclear_reactor(global atomic_int *destMemory) { int value = 42; int oldValue = atomic_fetch_max( destMemory, value ); } The following is not expected to work: global atomic_int globalAtomic; kernel nuclear_reactor() { int value = 42; int old_value = atomic_fetch_max( &globalAtomic, value ); } /* This is an example showing exolicit need for generic addresss space by mixing local and global in the same atomic call. */ kernel nuclear_reactor(global atomic_int *destMemory, int choice) { local atomic_int localMemory; int value = 42; int oldValue = atomic_fetch_max( (choice) ? destMemory : &localMemory, value ); } To make this example work: /* This is an example showing exolicit need for generic addresss space by mixing local and global in the same atomic call. */ kernel nuclear_reactor(global atomic_int *destMemory, int choice) { local atomic_int localMemory; int value = 42; int oldValue; if (choice) oldValue = atomic_fetch_max( destMemory, value ); else oldValue = atomic_fetch_max( &localMemory, value ); } Description See OpenCL C version 2.0 section 6.13.11. Note however that generic address space is not supported, so the are supported for the private, local and global address spaces. To enable this functionality, the compiler option '-cl-arm-svm' should be passed as an option to the relevant clBuildProgram or clCompileProgram call. Driver functions The following new functions are added to allow shared virtual memory to be allocated, deallocated and accessed. For description see OpenCL 2.0 section 5.6. clEnqueueSVMMapARM clEnqueueSVMUnmapARM clSVMAllocARM clSVMFreeARM clEnqueueSVMFreeARM clEnqueueSVMMemcpyARM clEnqueueSVMMemFillARM Functions for kernels and their arguments are added, as per OpenCL version 2.0 section 5.9.2. clSetKernelArgSVMPointerARM clSetKernelExecInfoARM Changes to existing functions: The clGetDeviceInfo function now accepts an additional enumeration to get the SVM capabilities: CL_DEVICE_SVM_CAPABILITIES_ARM, see section 4.2 of OpenCL version 2.0. The clGetMemObjectInfo will accept a param_name of CL_MEM_USES_SVM_POINTER_ARM, as per section 5.5.5 of OpenCL version 2.0. The clGetEventInfo function to respond to CL_EVENT_COMMAND_TYPE with a CL_COMMAND_SVM_xxx_ARM as per section 5.11 of OpenCL version 2.0. Note that if the driver is built as a CL2.0 driver, the value returned by clGetEventInfo will be the one described in te CL2.0 specification even when using the extension calls. New Tokens The following new attributes and properties are added: To be used by clGetDeviceInfo #define CL_DEVICE_SVM_CAPABILITIES_ARM 0x40B6 #define CL_MEM_USES_SVM_POINTER_ARM 0x40B7 To be used by clSetKernelExecInfoARM: #define CL_KERNEL_EXEC_INFO_SVM_PTRS_ARM 0x40B8 #define CL_KERNEL_EXEC_INFO_SVM_FINE_GRAIN_SYSTEM_ARM 0x40B9 To be used by clGetEventInfo: #define CL_COMMAND_SVM_FREE_ARM 0x40BA #define CL_COMMAND_SVM_MEMCPY_ARM 0x40BB #define CL_COMMAND_SVM_MEMFILL_ARM 0x40BC #define CL_COMMAND_SVM_MAP_ARM 0x40BD #define CL_COMMAND_SVM_UNMAP_ARM 0x40BE Flag values returned by clGetDeviceInfo with CL_DEVICE_SVM_CAPABILITIES_ARM as the param_name. #define CL_DEVICE_SVM_COARSE_GRAIN_BUFFER_ARM (1 << 0) #define CL_DEVICE_SVM_FINE_GRAIN_BUFFER_ARM (1 << 1) #define CL_DEVICE_SVM_FINE_GRAIN_SYSTEM_ARM (1 << 2) #define CL_DEVICE_SVM_ATOMICS_ARM (1 << 3) Flag values used by clSVMAllocARM: #define CL_MEM_SVM_FINE_GRAIN_BUFFER_ARM (1 << 10) #define CL_MEM_SVM_ATOMICS_ARM (1 << 11) Revision History Revision: #1, Mar 15th, 2016 - Initial revision Revision: #2, Mar 14th, 2018 - Deprecate the extension