feature(opencl): enable bindless image support for OpenCL frontend - #956
feature(opencl): enable bindless image support for OpenCL frontend#956juanchuletas wants to merge 4 commits into
Conversation
Enable BindlessHeapsHelper initialization for the OpenCL frontend by querying hardware capability via releaseHelper instead of returning false unconditionally in getGlobalBindlessHeapConfiguration. Add opt-in bindless image creation through CL_MEM_BINDLESS_IMAGE_INTEL property. When set, Image::create allocates a bindless slot in the global Surface State Heap using the shared BindlessHeapsHelper infrastructure already used by the Level Zero frontend. Signed-off-by: juan.garcia.cpp@gmail.com
…de for supported hardware Enable getBindlessMode to query hardware capability instead of defaulting to false. Add CL_IMAGE_BINDLESS_HANDLE_INTEL query key to clGetImageInfo for retrieving the bindless handle from an image. Signed-off-by: Juan Garcia <juan.garcia.cpp@gmail.com>
Remove getBindlessMode check from createBindlessHeapsHelper so the global Surface State Heap is created based on hardware capability alone. Keep getBindlessMode returning false for OpenCL to preserve normal bound-mode dispatch for all kernel arguments. This allows bindless images to explicitly allocate slots in the persistent heap via CL_MEM_BINDLESS_IMAGE_INTEL without breaking existing kernel execution. Signed-off-by: Juan Garcia <juan.garcia.cpp@gmail.com>
Kernel::patchBindlessSurfaceStatesInCrossThreadData ran on every dispatch and unconditionally re-patched the cross-thread-data offset for any explicit arg with a valid bindless offset, using the local per-dispatch Surface State Heap indexing scheme. For bindless images this was overwriting the offset that setArgImageWithMipLevel had already patched to point at the image's persistent slot in the global SSH, so the shader always read whatever (uninitialized) data happened to sit in the local SSH slot instead of the actual image descriptor. Do not repatch image args whose bound cl_mem is a genuine bindless image (CL_MEM_BINDLESS_IMAGE_INTEL), since those already carry the correct address into their own persistent slot. Signed-off-by: Juan Garcia <juan.garcia.cpp@gmail.com>
756ca6f to
647fcb8
Compare
|
Update: Since the last update I added:
The last part took a while to get right. Three issues had to be fixed together:
Tested with a small C program that creates a 1x1 bindless image with a known pixel, compiles a kernel with the bindless flags, and reads the pixel back through Still missing :
|
|
Update: Test creates 3 separate 4x4 RGBA8 images, each with a distinct pixel pattern, all bindless. Handles come back at different global SSH offsets (131072, 131392, 131712). A single kernel dispatch takes all three as arguments and reads from each based on work-item id. All 48 pixels across the three images come back correct. Ran the same test in bound mode ( no bindless flags) as a regression check. Also passes, confirming the dispatch path changes did not affect the existing behavior. |
Enable BindlessHeapsHelper initialization for the OpenCL frontend by querying hardware capability via releaseHelper instead of returning false unconditionally in getGlobalBindlessHeapConfiguration.
Add opt-in bindless image creation through CL_MEM_BINDLESS_IMAGE_INTEL property. When set, Image::create allocates a bindless slot in the global Surface State Heap using the shared BindlessHeapsHelper infrastructure already used by the Level Zero frontend.
Signed-off-by: juan.garcia.cpp@gmail.com
Context
I am working on sycl_ext_oneapi_bindless_images in intel/llvm (PR #22257). The Unified Runtime OpenCL adapter returns UR_RESULT_ERROR_UNSUPPORTED_FEATURE for all bindless image entry points because the OpenCL has no bindless support.
This PR is the first step: enabling the shared BindlessHeapsHelper infrastructure for the OpenCL frontend and adding opt-in bindless slot allocation for images via CL_MEM_BINDLESS_IMAGE_INTEL.
Validated on Intel Arc A770:
Remaining work:
Handle retrieval API so applications can query the bindless handle
Extension string registration is needed kind of cl_intel_bindless_images