oneDNN uses the OpenCL runtime for GPU engines to interact with the GPU. Users may need to use oneDNN with other code that uses OpenCL. For that purpose, the library provides API extensions to interoperate with underlying OpenCL objects.
The interoperability API is provided for two scenarios:
The mapping between oneDNN and OpenCL objects is provided in the following table:
| oneDNN object | OpenCL object(s) |
|---|---|
| Engine | cl_device_id and cl_context |
| Stream | cl_command_queue |
| Memory | cl_mem |
| oneDNN object | API to construct oneDNN object |
|---|---|
| Engine | dnnl::engine(kind, ocl_dev, ocl_ctx) |
| Stream | dnnl::stream(engine, ocl_queue) |
| Memory | dnnl::memory(memory_desc, engine, ocl_mem) |
| oneDNN object | API to access OpenCL object(s) |
|---|---|
| Engine | dnnl::engine::get_ocl_device() and dnnl::engine::get_ocl_context() |
| Stream | dnnl::stream::get_ocl_command_queue() |
| Memory | dnnl::memory::get_ocl_mem_object() |
| oneDNN object | API to construct oneDNN object |
|---|---|
| Engine | dnnl_engine_create_ocl(&engine, kind, ocl_dev, ocl_ctx) |
| Stream | dnnl_stream_create_ocl(&stream, engine, ocl_queue) |
| Memory | dnnl_memory_create(&memory, memory_desc, engine, &ocl_mem) |
| oneDNN object | API to access OpenCL object(s) |
|---|---|
| Engine | dnnl_engine_get_ocl_device() and dnnl_engine_get_ocl_context() |
| Stream | dnnl_stream_get_ocl_command_queue() |
| Memory | dnnl_memory_get_ocl_mem_object() |