| Name String |
| |
| cl_intel_accelerator |
| |
| Contributors |
| |
| Nico Galoppo, Intel |
| Craig Hansen-Sturm, Intel |
| Yejun Guo, Intel |
| Ben Ashbaugh, Intel |
| |
| Contact |
| |
| Ben Ashbaugh, Intel (ben.ashbaugh 'at' intel.com) |
| |
| IP Status |
| |
| TBD |
| |
| Version |
| |
| Version 2, February 12, 2016 |
| |
| Number |
| |
| OpenCL Extension #24 |
| |
| Status |
| |
| Final Draft |
| |
| Dependencies |
| |
| OpenCL 1.2 is required. This extension is written against revision 19 of |
| the OpenCL 1.2 specification. |
| |
| Overview |
| |
| The accelerator extension consists of a unified set of OpenCL runtime APIs to |
| create, query, and manage the lifetime of objects which represent |
| acceleration processors, engines, or algorithms. Accelerator object instances |
| are referenced with the generic cl_accelerator_intel type by the runtime API, |
| but they are always associated with a specific acceleration engine type, which |
| is assigned by the application at accelerator object creation time. Descriptors |
| are used to assign acceleration engine-specific properties to the accelerator |
| objects. This mechanism of specialized creation with generic referencing is |
| analogous to the way image objects are managed in the OpenCL 1.2 runtime API |
| via generic cl_mem referencing but specialized descriptor-based creation with |
| clCreateImage(). |
| |
| Each accelerator object is assigned a unique type id. Vendors are freely |
| encouraged to define new accelerator types and ids. This base extension |
| provides a unified mechanism for the creation and lifetime management of new |
| accelerator types, but the semantics and creation descriptors of these types |
| are to be defined in acceleration engine-specific extensions. |
| |
| Accelerator objects can be supplied to kernels as arguments. Unless an |
| extension defines a new OpenCL C language type for the engine-specific |
| accelerator (e.g. accelerator_t), accelerator objects can only be used in |
| conjunction with built-in kernels. If an extension does define such a new |
| type, or if it provides a mechanism to access accelerator data within |
| kernels, then accelerator objects can act as regular kernel arguments as |
| well. |
| |
| New Procedures and Functions |
| |
| cl_accelerator_intel clCreateAcceleratorINTEL( |
| cl_context context, |
| cl_accelerator_type_intel accelerator_type, |
| size_t descriptor_size, |
| const void* descriptor, |
| cl_int* errcode_ret) |
| |
| cl_int clRetainAcceleratorINTEL( |
| cl_accelerator_intel accelerator) |
| |
| cl_int clReleaseAcceleratorINTEL( |
| cl_accelerator_intel accelerator) |
| |
| cl_int clGetAcceleratorInfoINTEL( |
| cl_accelerator_intel accelerator, |
| cl_accelerator_info_intel param_name, |
| size_t param_value_size, |
| void* param_value, |
| size_t* param_value_size_ret) |
| |
| New Tokens |
| |
| Accepted as the <param_name> parameter of clGetAcceleratorInfoINTEL: |
| |
| CL_ACCELERATOR_DESCRIPTOR_INTEL 0x4090 |
| CL_ACCELERATOR_REFERENCE_COUNT_INTEL 0x4091 |
| CL_ACCELERATOR_CONTEXT_INTEL 0x4092 |
| CL_ACCELERATOR_TYPE_INTEL 0x4093 |
| |
| Returned by clSetKernelArg when <arg_value> is not a valid accelerator |
| object, and by clRetainAccelerator, clReleaseAccelerator, and |
| clGetAcceleratorInfo when <accelerator> is not a valid accelerator |
| object: |
| |
| CL_INVALID_ACCELERATOR_INTEL -1094 |
| |
| Returned by clSetKernelArg when <arg_value> is not an accerator object |
| of the correct type, and by clCreateAccelerator when <accelerator_type> |
| is not a valid accelerator type: |
| |
| CL_INVALID_ACCELERATOR_TYPE_INTEL -1095 |
| |
| Returned by clCreateAccelerator when values described by <descriptor> |
| are not valid, or if a combination of values is not valid: |
| |
| CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL -1096 |
| |
| Returned by clCreateAccelerator when <accelerator_type> is a valid |
| accelerator type, but it not supported by any device in <context>. |
| |
| CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL -1097 |
| |
| New Types |
| |
| Parameter type of clRetainAcceleratorINTEL, clReleaseAcceleratorINTEL, |
| clGetAcceleratorInfoINTEL and a return type of clCreateAcceleratorINTEL: |
| |
| typedef struct _cl_accelerator_intel* cl_accelerator_intel; |
| |
| Parameter type of accelerator_type for clCreateAcceleratorINTEL: |
| |
| typedef cl_uint cl_accelerator_type_intel; |
| |
| Parameter type of param_name for clGetAcceleratorInfoINTEL: |
| |
| typedef cl_uint cl_accelerator_info_intel; |
| |
| Changes to Section 5.7.2 - "Setting Kernel Arguments" of the OpenCL 1.2 |
| specification: |
| |
| Add to the paragraph describing the argument value parameter to |
| clSetKernelArg: |
| |
| "... If the argument is an accelerator object, the <arg_value> entry must |
| be a pointer to the accelerator object." |
| |
| Add to the paragraph describing the argument size parameter to |
| clSetKernelArg: |
| |
| "... If the argument is an accelerator object, the <arg_size> value must |
| be equal to sizeof(cl_accelerator_intel)." |
| |
| Add to the list of error codes for clSetKernelArg: |
| |
| " * CL_INVALID_ACCELERATOR_INTEL for an argument declared to be an |
| accelerator object when the specified <arg_value> is not a valid |
| accelerator object. |
| * CL_INVALID_ARG_SIZE ... or if the argument is an accelerator object and |
| <arg_size> != sizeof(cl_accelerator_intel). |
| * CL_INVALID_ACCELERATOR_TYPE_INTEL for an argument declared to be an |
| accelerator object when the accelerator type of the specified <arg_value> |
| does not match the specific accelerator type required for the kernel |
| argument." |
| |
| Add a new Section 5.XX - "Accelerator Objects": |
| |
| "Accelerator objects represent the programmable state of an acceleration |
| processor, engine, or algorithm. Accelerator objects can be supplied to |
| kernels as arguments. Unless an extension defines a new OpenCL C language |
| type for the engine-specific accelerator (e.g. accelerator_t), accelerator |
| objects can only be used in conjunction with built-in kernels. In this |
| section, we discuss how accelerator objects are created and managed using |
| OpenCL runtime API functions." |
| |
| Add a new Section 5.XX.1 - "Creating Accelerator Objects": |
| |
| "The function |
| |
| cl_accelerator_intel clCreateAcceleratorINTEL( |
| cl_context context, |
| cl_accelerator_type_intel accelerator_type, |
| size_t descriptor_size, |
| const void* descriptor, |
| cl_int* errcode_ret) |
| |
| creates an accelerator object. The accelerator object will be created with a |
| reference count of one. Accelerator objects created with this function have |
| semantics defined by the parameter <accelerator_type>, which are defined and |
| described by extensions external to this document. |
| |
| <context> must be a valid OpenCL context. |
| |
| <accelerator_type> specifies the type of accelerator object created. The type |
| constants are defined by acceleration engine-specific extensions. It is |
| encouraged that extensions follow the naming scheme of |
| CL_ACCELERATOR_TYPE_{name}_INTEL where {name} is a descriptive acceleration |
| engine string. |
| |
| <descriptor_size> is a value which specifies of the size, in bytes, of the |
| immediately following descriptor structure. |
| |
| <descriptor> is a pointer to a structure that defines the parameter set of |
| the accelerator object. This parameter set describes the configurable state |
| of the underlying object. The actual structure supplied must be consistent |
| with <accelerator_type>. The descriptor structures are defined by |
| acceleration engine-specific extensions. It is encouraged that extensions |
| follow the naming scheme of cl_{name}_desc_INTEL where {name} is a |
| descriptive acceleration engine string. |
| |
| <errcode_ret> will return an appropriate error code. If errcode_ret is NULL, |
| then no error value will be returned. |
| |
| clCreateAcceleratorINTEL returns a valid non-zero accelerator object, and |
| <errcode_ret> is set to CL_SUCCESS if the accelerator object is created |
| successfully. Otherwise, it returns a NULL value with one of the following |
| error values returned in <errcode_ret>: |
| |
| * CL_INVALID_CONTEXT if <context> is not a valid context. |
| * CL_INVALID_ACCELERATOR_TYPE_INTEL if <accelerator_type> is not a valid |
| accelerator type. |
| * CL_INVALID_ACCELERATOR_DESCRIPTOR_INTEL if values specified in |
| <descriptor> are not valid (or a combination of values is not valid), |
| if <descriptor_size> does not match the required size for the specified |
| <accelerator_type>, or if <descriptor> is NULL. |
| * CL_ACCELERATOR_TYPE_NOT_SUPPORTED_INTEL if <accelerator_type> is not |
| supported by any device in <context>. |
| * CL_INVALID_OPERATION if none of the devices in the context support |
| accelerator objects. |
| * CL_OUT_OF_RESOURCES if there is a failure to allocate resources required |
| by the OpenCL implementation on the device. |
| * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required |
| by the OpenCL implementation on the host. |
| |
| The function |
| |
| cl_int clRetainAcceleratorINTEL( |
| cl_accelerator_intel accelerator) |
| |
| increments the <accelerator> reference count. clCreateAcceleratorINTEL performs |
| an implicit retain. |
| |
| clRetainAcceleratorINTEL returns CL_SUCCESS if the function is executed |
| successfully. Otherwise, it returns one of the following errors: |
| |
| * CL_INVALID_ACCELERATOR_INTEL if <accelerator> is a not a valid accelerator |
| object. |
| * CL_OUT_OF_RESOURCES if there is a failure to allocate resources required |
| by the OpenCL implementation on the device. |
| * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required |
| by the OpenCL implementation on the host. |
| |
| The function |
| |
| cl_int clReleaseAcceleratorINTEL( |
| cl_accelerator_intel accelerator) |
| |
| decrements the <accelerator> reference count. The accelerator object is |
| deleted after the reference count becomes zero and commands queued for |
| execution on a command-queue(s) that reference <accelerator> have finished. |
| |
| clReleaseAcceleratorINTEL returns CL_SUCCESS if the function is executed |
| successfully. Otherwise, it returns one of the following errors: |
| |
| * CL_INVALID_ACCELERATOR_INTEL if <accelerator> is a not a valid accelerator |
| object. |
| * CL_OUT_OF_RESOURCES if there is a failure to allocate resources required |
| by the OpenCL implementation on the device. |
| * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required |
| by the OpenCL implementation on the host. |
| |
| Add a new Section 5.XX.2 - "Accelerator Queries" |
| |
| The function |
| |
| cl_int clGetAcceleratorInfoINTEL( |
| cl_accelerator_intel accelerator, |
| cl_accelerator_info_intel param_name, |
| size_t param_value_size, |
| void* param_value, |
| size_t* param_value_size_ret) |
| |
| returns information about the accelerator object. |
| |
| <accelerator> specifies the accelerator object being queried. |
| |
| <param_name> specifies the information to query. The list of supported |
| param_name types and the information returned in <param_value> by |
| clGetAcceleratorInfo is described in the table below. |
| |
| <param_value> is a pointer to memory where the appropriate result being |
| queried is returned. If <param_value> is NULL, it is ignored. |
| |
| <param_value_size> is used to specify the size in bytes of the memory |
| pointed to by <param_value>. This size is dependent on the param_name, and |
| must be greater than or equal to the size of return type as described in |
| the table below. |
| |
| ---------------------------------------------------------------------------- |
| cl_accelerator_info_intel Return type Description |
| ------------------------- ----------- -------------------------- |
| CL_ACCELERATOR_DESCRIPTOR_INTEL Return the complete |
| descriptor structure |
| supplied when the |
| accelerator was created. |
| Refer to the external |
| extension document where |
| the descriptor is defined. |
| |
| CL_ACCELERATOR_REFERENCE_COUNT_INTEL cl_uint Return the reference count |
| associated with the |
| accelerator |
| |
| CL_ACCELERATOR_CONTEXT_INTEL cl_context Return the context |
| specified when the |
| accelerator was created. |
| |
| CL_ACCELERATOR_TYPE_INTEL cl_uint Return the accelerator |
| type specified when the |
| accelerator was created. |
| Refer to the external |
| extension document |
| where the descriptor is |
| defined. |
| ---------------------------------------------------------------------------- |
| |
| <param_value_size_ret> returns the actual size in bytes of data queried by |
| <param_value>. If <param_value_size_ret> is NULL, it is ignored. |
| |
| clGetAcceleratorInfoINTEL returns CL_SUCCESS if the function is executed |
| successfully. Otherwise, it returns one of the following errors: |
| |
| * CL_INVALID_VALUE if <param_name> is not valid, or if size in bytes |
| specified by param_value_size is less than the size of return type as |
| described in the table above and <param_value> is not NULL. |
| * CL_INVALID_ACCELERATOR_INTEL if <accelerator> is a not a valid accelerator |
| object. |
| * CL_OUT_OF_RESOURCES if there is a failure to allocate resources required |
| by the OpenCL implementation on the device. |
| * CL_OUT_OF_HOST_MEMORY if there is a failure to allocate resources required |
| by the OpenCL implementation on the host." |
| |
| Add a new Section 5.XX.3 - "Accelerator Descriptors" |
| |
| "Descriptors are defined by acceleration engine-specific extensions." |
| |
| Add a new Section 5.XX.4 - "Using Accelerators" |
| |
| "Accelerator semantics and usage are defined by acceleration engine-specific |
| extensions." |
| |
| Interactions with other extensions |
| |
| All follow-on/external accelerator extension documents extend this base |
| accelerator document and will use the host-side functions defined within |
| this document. |
| |
| Revision History |
| |
| Version 1 - Initial Revision |
| Version 2 - Formatting and minor error condition bug fixes. |
| |