[Mesa-dev] [PATCH v2 00/22] Introducing SPIR-V support to clover
Pierre Moreau
pierre.morrow at free.fr
Tue Jan 23 00:33:42 UTC 2018
Hello,
Here is the second version of my initial series for adding SPIR-V support to
clover, after the RFC back in May 2017.
For recap, the focus of this series is to let clover accept SPIR-V binaries
through the cl_khr_il_program extension (from OpenCL 1.2 and on), as well as
through some core features (since OpenCL 2.1). Even if OpenCL 2.1 support in
clover is some way off, there is another motivation for supporting SPIR-V in
clover, as multiple drivers are interested in adding OpenCL support by
converting SPIR-V to NIR.
Note: the series is based on master + Karol’s patch “clover: add functions up
to 2.2 to ICD dispatch table”.
The various patches can be split in different categories:
* Patches 1 through 7: some clover clean-up, adding and moving some
functionalities around to make the implementation easier in the rest of the
series.
* Patches 8 through 13: define SPIR-V as a new IR, add a new frontend to clover
to deal with SPIR-V, and edit compile and link operations to handle SPIR-V as
well.
* Patches 14 through 19: implement cl_khr_il_program
* Patches 20 through 22: implement OpenCL 2.1 support on top of
cl_khr_il_program
Changes since the RFC
---------------------
* Most SPIR-V utilities were dropped, and the remaining ones have been moved to
the clover SPIR-V frontend rather than sitting in src/gallium/auxiliary/spirv.
* The SPIR-V linker has been completely dropped from this series and instead
merge in SPIRV-Tools [1].
* Since SPIRV-Tools now exports a pkgconfig .pc file, use it for detecting the
library.
* Integrate the series with Meson.
* Use pipe_llvm_program_header to pass in the size of the SPIR-V module, rather
than adding a new attribute to pipe_compute_state, as suggested by Francisco
Jerez.
* Check that the device supports the capabilities defined in the SPIR-V binary.
* Check that the platform/device supports the extensions used in the SPIR-V
binary.
* Fix the implementation responsible for filling up the symbols of the clover
module based on the input SPIR-V binary.
* No longer raw SPIR-V binaries through clCreateProgramWithBinary, but instead
keep the current de-serialisation of the clover module, which may contain a
SPIR-V binary.
* Track whether a library was created with the --enable-link-options flag or
not. This is currently not useful as the linker ignores most link options,
but it will become useful when the linker handles those options.
* Implement cl_khr_il_program.
* Most of patches 1 through 8 (apart from patch 2).
Discussions
-----------
* Before, when linking different modules together, you knew that all modules
would use the same IR, as all were created using clCreateProgramWithSource,
therefore the linker could just call the linking function corresponding to
the target’s preferred IR. But with the introduction of
clCreateProgramWithIL(KHR)?, we can now end up in a case where we try to link
a module using NIR as IR (created through clCreateProgramWithSource, assuming
that is the driver’s preferred IR), with another module using SPIR-V as IR
(created through clCreateProgramWithIL). How do we handle such a case: should
we translate the SPIR-V to NIR and use a NIR linker on them, or convert NIR
to SPIR-V and use the SPIR-V linker? NIR and LLVM IR can be handled
relatively easily, but what about TGSI?
* In that regard, is anyone using the TGSI frontend in clover? If not, is
anyone planning to use it? And if still not, shouldn’t we just remove it?
* In the same vein as the linking discussion just above, what should happen
when the driver’s preferred IR is one of the IRs not currently supported by
clover, like NIR for example? Should `compile()` generate a SPIR-V binary
which is directly translated to NIR, or should we keep everything in SPIR-V
until the very last moment, right before sending the IR to the driver? If
all the drivers supporting compute through clover support an IR that can be
translated from SPIR-V, it might be easier to keep everything inside clover
as SPIR-V binaries, until we need to pass the program to the driver, in which
case we convert it on the fly.
(Still) missing
---------------
* As there is no upstream version of LLVM which can produce SPIR-V out of
OpenCL code, clCreateProgramWithSource will refuse to work if the target’s
preferred IR is SPIR-V, for now.
* Optimisation linking options are ignored for now as SPIRV-Tools’ linker does
not supported them yet.
Thank you in advance for reviewing/commenting,
Pierre
[1]: https://github.com/KhronosGroup/SPIRV-Tools/
Pierre Moreau (22):
clover/api: Fix tab indentation to spaces
clover: Add additional functions to query supported IRs
clover/api: Fail if trying to build a non-executable binary
clover: Disallow creating libraries from other libraries
clover: Track flags per module section
clover: Move device extensions definitions to core/device.cpp
clover: Move platform extensions definitions to clover/platform.cpp
include/pipe: Define SPIRV as an IR
configure.ac,meson: Check for SPIRV-Tools
clover/spirv: Import spirv.hpp11 version 1.0 (rev 12)
clover/spirv: Add functions for parsing arguments, linking programs,
etc.
clover: Refuse to compile source code to SPIR-V
clover: Handle the case when linking SPIR-V binaries together
clover: Add a pointer property to return ILs
include/CL: Add cl_khr_il_program
clover: Implement clCreateProgramWithILKHR
clover: Handle CL_PROGRAM_IL_KHR in clGetProgramInfo
clover/api: Implement CL_DEVICE_IL_VERSION_KHR
clover: Advertise cl_khr_il_program
include/CL: Export OpenCL 2.1 functions
clover: Implement clCreateProgramWithIL from OpenCL 2.1
clover: Use OpenCL 2.1 defines in place of cl_khr_il_program
configure.ac | 5 +
include/CL/cl.h | 8 +
include/CL/cl_ext.h | 34 +
include/CL/cl_platform.h | 1 +
meson.build | 2 +
src/gallium/include/pipe/p_defines.h | 1 +
src/gallium/state_trackers/clover/Makefile.am | 15 +-
src/gallium/state_trackers/clover/Makefile.sources | 4 +
src/gallium/state_trackers/clover/api/device.cpp | 16 +-
src/gallium/state_trackers/clover/api/dispatch.cpp | 2 +-
src/gallium/state_trackers/clover/api/dispatch.hpp | 4 +
src/gallium/state_trackers/clover/api/platform.cpp | 6 +-
src/gallium/state_trackers/clover/api/program.cpp | 70 +-
src/gallium/state_trackers/clover/core/device.cpp | 26 +
src/gallium/state_trackers/clover/core/device.hpp | 4 +
src/gallium/state_trackers/clover/core/module.cpp | 1 +
src/gallium/state_trackers/clover/core/module.hpp | 13 +-
.../state_trackers/clover/core/platform.cpp | 5 +
.../state_trackers/clover/core/platform.hpp | 2 +
src/gallium/state_trackers/clover/core/program.cpp | 94 +-
src/gallium/state_trackers/clover/core/program.hpp | 14 +
.../state_trackers/clover/core/property.hpp | 39 +
.../state_trackers/clover/llvm/codegen/bitcode.cpp | 3 +-
.../state_trackers/clover/llvm/codegen/common.cpp | 2 +-
src/gallium/state_trackers/clover/meson.build | 10 +-
.../state_trackers/clover/spirv/invocation.cpp | 668 ++++++++++++++
.../state_trackers/clover/spirv/invocation.hpp | 54 ++
.../state_trackers/clover/spirv/spirv.hpp11 | 997 +++++++++++++++++++++
.../state_trackers/clover/tgsi/compiler.cpp | 3 +-
29 files changed, 2067 insertions(+), 36 deletions(-)
create mode 100644 src/gallium/state_trackers/clover/spirv/invocation.cpp
create mode 100644 src/gallium/state_trackers/clover/spirv/invocation.hpp
create mode 100644 src/gallium/state_trackers/clover/spirv/spirv.hpp11
--
2.16.0
More information about the mesa-dev
mailing list