| Name Strings |
| |
| cl_khr_icd |
| |
| Contributors |
| |
| Ben Ashbaugh |
| Christopher Cameron |
| Benedict Gaster |
| Michael Houston |
| John Kessenich |
| Christopher Lamb |
| Laurent Morichetti |
| Aftab Munshi |
| Ofer Rosenberg |
| |
| IP Status |
| |
| No known claims. |
| |
| Version |
| |
| Version 8, August 8, 2017 |
| |
| Number |
| |
| OpenCL Extension #5 |
| |
| Status |
| |
| Ratified by the Khronos Promoters, January 29, 2010 |
| |
| Extension Type |
| |
| OpenCL platform extension |
| |
| Dependencies |
| |
| OpenCL 1.0 is required. |
| |
| Overview |
| |
| This extension defines a simple mechanism through which the Khronos |
| installable client driver loader (ICD Loader) may expose multiple |
| separate vendor installable client drivers (Vendor ICDs) for |
| OpenCL. An application written against the ICD Loader will be able to |
| access all cl_platform_ids exposed by all vendor implementations |
| with the ICD Loader acting as a demultiplexor. |
| |
| Inferring Vendors From Function Calls from Arguments |
| |
| At every OpenCL function call, the ICD Loader infers the Vendor ICD |
| function to call from the arguments to the function. An object is |
| said to be ICD compatible if it is of the following structure: |
| |
| struct _cl_<object> |
| { |
| struct _cl_icd_dispatch *dispatch; |
| // ... remainder of internal data |
| }; |
| |
| <object> is one of platform_id, device_id, context, command_queue, |
| mem, program, kernel, event, or sampler. |
| |
| The structure _cl_icd_dispatch is a function pointer dispatch |
| table which is used to direct calls to a particular vendor |
| implementation. All objects created from ICD compatible objects |
| must be ICD compatible. |
| |
| A link to source code which defines the entries in the function |
| table structure _cl_icd_dispatch is available in the Sample |
| Code section of this document. The order of the functions in |
| _cl_icd_dispatch is determined by the ICD Loader's source. The ICD |
| Loader's source's _cl_icd_dispatch table is to be appended to only. |
| |
| Functions which do not have an argument from which the vendor |
| implementation may be inferred are ignored, with the exception |
| of clGetExtensionFunctionAddress which is described below. |
| |
| ICD Data |
| |
| A Vendor ICD is defined by two pieces of data. |
| |
| The Vendor ICD library specifies a library which contains the |
| OpenCL entrypoints for the vendor's OpenCL implementation. The |
| vendor ICD's library file name should include the vendor name, or |
| a vendor-specific implementation identifier. |
| |
| The Vendor ICD extension suffix is a short string which specifies |
| the default suffix for extensions implemented only by that vendor. |
| See Additions to Chapter 9 for details on the mechanism through |
| which this is accomplished. The vendor suffix string is optional. |
| |
| ICD Loader Vendor Enumeration on Windows |
| |
| To enumerate Vendor ICDs on Windows, the ICD Loader will first |
| scan for REG_SZ string values in the "Display Adapter" and |
| "Software Components" HKR registry keys. The exact registry |
| keys to scan should be obtained via PnP Configuration Manager |
| APIs, but will look like: |
| |
| For 64-bit ICDs: |
| |
| HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Display Adapter GUID}\{Instance ID}\OpenCLDriverName, or |
| |
| HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Software Component GUID}\{Instance ID}\OpenCLDriverName |
| |
| For 32-bit ICDs: |
| |
| HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Display Adapter GUID}\{Instance ID}\OpenCLDriverNameWoW, or |
| |
| HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Software Component GUID}\{Instance ID}\OpenCLDriverNameWoW |
| |
| These registry values contain the path to the Vendor ICD library. |
| For example, if the registry contains the value: |
| |
| [HKLM\SYSTEM\CurrentControlSet\Control\Class\{GUID}\{Instance}] |
| "OpenCLDriverName"="c:\\vendor a\\vndra_ocl.dll" |
| |
| Then the ICD loader will open the Vendor ICD library: |
| |
| "c:\vendor a\vndra_ocl.dll" |
| |
| The ICD Loader will also scan for REG_DWORD values in the registry |
| key: |
| |
| HKLM\SOFTWARE\Khronos\OpenCL\Vendors |
| |
| For each registry value in this key which has data set to 0, the |
| ICD Loader will open the Vendor ICD library specified by the name |
| of the registry value. |
| |
| For example, if the registry contains the value: |
| |
| [HKLM\SOFTWARE\Khronos\OpenCL\Vendors] |
| "c:\\vendor a\\vndra_ocl.dll"=dword:00000000 |
| |
| Then the ICD will open the Vendor ICD library: |
| |
| "c:\vendor a\vndra_ocl.dll" |
| |
| ICD Loader Vendor Enumeration on Linux |
| |
| To enumerate vendor ICDs on Linux, the ICD Loader scans |
| the files the path /etc/OpenCL/vendors. For each |
| file in this path, the ICD Loader opens the file as a text |
| file. The expected format for the file is a single line of |
| text which specifies the Vendor ICD's library. The ICD |
| Loader will attempt to open that file as a shared object |
| using dlopen(). Note that the library specified may be an |
| absolute path or just a file name. |
| |
| For example, if the following file exists |
| /etc/OpenCL/vendors/VendorA.icd |
| and contains the text |
| libVendorAOpenCL.so |
| then the ICD Loader will load the library "libVendorAOpenCL.so" |
| |
| Adding a Vendor Library |
| |
| Upon successfully loading a Vendor ICD's library, the |
| ICD Loader queries the following functions from the library: |
| clIcdGetPlatformIDsKHR, clGetPlatformInfo, and |
| clGetExtensionFunctionAddress. If any of these functions |
| are not present then the ICD Loader will close and ignore |
| the library. |
| |
| Next the ICD Loader queries available ICD-enabled |
| platforms in the library using clIcdGetPlatformIDsKHR. |
| For each of these platforms, the ICD Loader queries the |
| platform's extension string to verify that cl_khr_icd is |
| supported, then queries the platform's Vendor ICD extension |
| suffix using clGetPlatformInfo with the value |
| CL_PLATFORM_ICD_SUFFIX_KHR. |
| |
| If any of these steps fail, the ICD Loader will ignore the |
| Vendor ICD and continue on to the next. |
| |
| New Procedures and Functions |
| |
| cl_int clIcdGetPlatformIDsKHR( |
| cl_uint num_entries, |
| cl_platform_id *platforms, |
| cl_uint *num_platforms); |
| |
| New Tokens |
| |
| Accepted as <param_name> to the function clGetPlatformInfo |
| |
| CL_PLATFORM_ICD_SUFFIX_KHR 0x0920 |
| |
| Returned by clGetPlatformIDs when no platforms are found |
| |
| CL_PLATFORM_NOT_FOUND_KHR -1001 |
| |
| |
| Additions to Chapter 4 of the OpenCL 1.0.48 Specification |
| |
| In section 4.1, replace the description of the return values of |
| clGetPlatformIDs with: |
| |
| "clGetPlatformIDs returns CL_SUCCESS if the function is executed |
| successfully and there are a non zero number of platforms available. |
| It returns CL_PLATFORM_NOT_FOUND_KHR if zero platforms are |
| available. It returns CL_INVALID_VALUE if <num_entries> is |
| equal to zero and <platforms> is not NULL or if both <num_platforms> |
| and <platforms> are NULL." |
| |
| In section 4.1, add the following after the description of |
| clGetPlatforms: |
| |
| "The list of platforms accessible through the Khronos ICD Loader |
| can be obtained using the following function |
| |
| cl_int clIcdGetPlatformIDsKHR( |
| cl_uint num_entries, |
| cl_platform_id *platforms, |
| cl_uint *num_platforms); |
| |
| <num_entries> is the number of cl_platform_id entries that can be |
| added to <platforms>. If <platforms> is not NULL, then |
| <num_entries> must be greater than zero. |
| |
| <platforms> returns a list of OpenCL platforms available for access |
| through the Khronos ICD Loader. The cl_platform_id values returned in |
| <platform> are ICD compatible and can be used to identify a |
| specific OpenCL platform. If the <platforms> argument is NULL, |
| then this argument is ignored. The number of OpenCL platforms |
| returned is the minimum of the value specified by num_entries or |
| the number of OpenCL platforms available. |
| |
| <num_platforms> returns the number of OpenCL platforms available. |
| If <num_platforms> is NULL, then this argument is ignored. |
| |
| clIcdGetPlatformIDsKHR returns CL_SUCCESS if the function is executed |
| successfully and there are a non zero number of platforms available. |
| It returns CL_PLATFORM_NOT_FOUND_KHR if zero platforms are |
| available. It returns CL_INVALID_VALUE if <num_entries> is |
| equal to zero and <platforms> is not NULL or if both <num_platforms> |
| and <platforms> are NULL." |
| |
| Add the following to table 4.1: |
| |
| "-------------------------------------------------------------------- |
| cl_platform_info Return Type Description |
| ---------------- ----------- ---------------------------- |
| CL_PLATFORM_ICD_SUFFIX_KHR char[] Then function name suffix |
| used to identify extension |
| functions to be directed to |
| this platform by the ICD |
| Loader." |
| |
| Additions to Chapter 9 of the OpenCL 1.0.48 Specification |
| |
| Add the following paragraph to the end of Section 9.2: |
| |
| "For functions supported by the ICD Loader, |
| clGetExtensionFunctionAddress will return the function pointer of |
| the ICD Loader implementation. For extension functions which the ICD |
| Loader is unaware of, the function clGetExtensionFunctionAddress |
| will determine the vendor implementation to return based on the |
| string passed in. The ICD Loader will return the result from |
| querying clGetExtensionFunctionAddress on the vendor ICD enumerated |
| by the ICD Loader whose ICD suffix is a suffix of the function name |
| being queried. If no such vendor exists or the suffix of the |
| function is KHR or EXT then clGetExtensionFunctionAddress will |
| return NULL." |
| |
| Interactions with other extensions |
| |
| None. |
| |
| Issues |
| |
| 1. Some OpenCL functions do not take an object argument from which |
| their vendor library may be identified (e.g, clUnloadCompiler), |
| how will they be handled? |
| |
| RESOLVED: Such functions will be a NOOP for all calls through the |
| ICD. |
| |
| 2. How are OpenCL extension to be handled? |
| |
| RESOLVED: OpenCL extension functions may be added to the ICD as |
| soon as they are implemented by any vendor. The suffix mechanism |
| provides access for vendor extensions which are not yet added to |
| the ICD. |
| |
| 3: How will the ICD handle a NULL cl_platform_id? |
| |
| RESOLVED: The NULL platform is not supported by the ICD. |
| |
| 4. There exists no mechanism to unload the ICD, should there be |
| one? |
| |
| RESOLVED: As there is no standard mechanism for unloading a vendor |
| implementation, do not add one for the ICD. |
| |
| Sample Code |
| |
| The official source for the ICD loader is available on github, here: |
| https://github.com/KhronosGroup/OpenCL-ICD-Loader |
| |
| An abbreviated version of the _cl_icd_dispatch structure is |
| as follows. |
| |
| struct _cl_icd_dispatch |
| { |
| CL_API_ENTRY cl_int (CL_API_CALL *clGetPlatformIDs)( |
| cl_uint num_entries, |
| cl_platform_id * platforms, |
| cl_uint * num_platforms) CL_API_SUFFIX__VERSION_1_0; |
| |
| CL_API_ENTRY cl_int (CL_API_CALL *clGetPlatformInfo)( |
| cl_platform_id platform, |
| cl_platform_info param_name, |
| size_t param_value_size, |
| void * param_value, |
| size_t * param_value_size_ret) CL_API_SUFFIX__VERSION_1_0; |
| |
| /* ...continues... */ |
| } |
| |
| As an example of this mechanism in action, consider the function |
| clCreateCommandQueue. The implementation of this function in the |
| ICD Loader is as follows |
| |
| cl_command_queue clCreateCommandQueue( |
| cl_context context, |
| cl_device_id device, |
| cl_command_queue_properties properties, |
| cl_int * errcode_ret) |
| { |
| return context->dispatch->clCreateCommandQueue( |
| context, |
| device, |
| properties, |
| errcode_ret); |
| } |
| |
| Conformance Tests |
| |
| A vendor supports cl_khr_icd if conformance may be run successfully |
| on their platform through the ICD Loader. |
| |
| Revision History |
| |
| Version 8, 2017/08/08 (Ben Ashbaugh) - updated to include HKR |
| as a scanned registry key for Windows, added github link for ICD |
| loader source code. |
| |
| Version 7, 2010/03/02 (Jon Leech) - fix typos for |
| clGetExtensionFunctionAddress (public bug 258), reflow a paragraph |
| with very long lines. |
| |
| Version 6, 2010/02/17 (Jon Leech) - remove URLs pointing to |
| resources available only to Khronos members, since this |
| was causing confusion to outside readers of the extension |
| spec. |
| |
| Version 5, 2009/12/08 (Christopher Cameron) - Clarify language |
| of ICD Loader versus Vendor ICD, update Linux enumeration to |
| reflect bug and email discussion. |
| |
| Version 4, 2009/11/10 (Christopher Cameron) - Fix typos. |
| |
| Version 3, 2009/11/05 (Christopher Cameron) - update Linux and |
| Windows enumeration to use directories and registry values. |
| Change suffix information to come from platform query. Add |
| error code for clGetPlatformIDs when there are no platforms. |
| |
| Version 2, 2009/11/02 (Christopher Cameron) - update Linux |
| enumeration to use INI file format. Some cleanup of sections. |
| Update on ICD unload function. |
| |
| Version 1, 2009/09/20 (Christopher Cameron) - initial extension |
| specification (see also Khronos bug 5391) |