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
