Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: [SYCL] Basic SYCL device compiler support #3071

Closed
wants to merge 4 commits into from

Conversation

bader
Copy link
Contributor

@bader bader commented Jan 21, 2021

This PR includes a set of commits from required to reach milestone 1 for "SYCL support in upstream clang" project, which implies successful compilation of basic SYCL application like simple-vector-add .

Here is a list of patch with preliminary TODOs left to finalize the solution.

  1. 7788782 [SYCL] Implement OpenCL kernel function generation - https://reviews.llvm.org/D71016 - TODO: this should be updated with recent refactoring from the sycl branch
  2. b20e9f4 TODO: revert this change after CodeGen part is updated - this should gone once previous patch is updated
  3. e343510 [SYCL] Enable Open CL types required for implementing the SYCL headers. - https://reviews.llvm.org/D77220
  4. e90c927 [SPIR-V] Add SPIR-V builtin functions and types - https://reviews.llvm.org/D108034

@bader bader added the upstream This change is related to upstreaming SYCL support to llorg. label Jan 21, 2021
@bader
Copy link
Contributor Author

bader commented Jan 26, 2021

2. 0a6590d [SYCL] Implement OpenCL kernel function generation - https://reviews.llvm.org/D71016 - TODO: this should be updated with recent refactoring from the sycl branch

While I was looking at this item I found a couple of other PRs, which are intended to improve this patch:

In addition to these two patches, we need another patch to emit SPIR metadata, calling convention, etc., which are required for successful translation to SPIR-V format.

@bader bader changed the base branch from master to main May 24, 2021 15:34
Fznamznon and others added 4 commits November 25, 2021 06:41
Summary:
All SYCL memory objects shared between host and device (buffers/images, these
objects map to OpenCL buffers and images) must be accessed through special
accessor classes. The "device" side implementation of these classes contain
pointers to the device memory. As there is no way in OpenCL to pass
structures with pointers inside as kernel arguments, all memory objects
shared between host and device must be passed to the kernel as raw
pointers. SYCL also has a special mechanism for passing kernel arguments
from host to the device. In OpenCL kernel arguments are set by calling
`clSetKernelArg` function for each kernel argument, meanwhile in SYCL all the
kernel arguments are fields of "SYCL kernel function" which can be defined
as a lambda function or a named function object and passed as an argument
to SYCL function for invoking kernels (such as `parallel_for` or `single_task`).

To facilitate the mapping of SYCL kernel data members to OpenCL kernel
arguments and overcome OpenCL limitations we added the generation of an
OpenCL kernel function inside the compiler. An OpenCL kernel function
contains the body of the SYCL kernel function, receives OpenCL-like
parameters and additionally does some manipulation to initialize SYCL
kernel data members with these parameters. In some pseudo code the OpenCL
kernel function can look like this:

```
// SYCL kernel is defined in SYCL headers:
template <typename KernelName, typename KernelType/*, ...*/>
__attribute__((sycl_kernel)) void sycl_kernel_function(KernelType KernelFuncObj) {
  // ...
  KernelFuncObj();
}

// Generated OpenCL kernel function
__kernel KernelName(global int* a) {
  KernelType KernelFuncObj; // Actually kernel function object declaration
  // doesn't have a name in AST.
  // Let the kernel function object have one captured field - accessor A.
  // We need to init it with global pointer from arguments:
  KernelFuncObj.A.__init(a);
  // Body of the SYCL kernel from SYCL headers:
  {
    KernelFuncObj();
  }
}
```
OpenCL kernel function is generated by the compiler inside the Sema
using AST nodes.

Reviewers: bader, Naghasan, ABataev, keryell

Subscribers: agozillon, mgorny, yaxunl, jfb, ebevhan, Anastasia, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D71016
The CodeGen patch is outdated and it doesn't work with SYCL 2020 syntax
used in this test.
This patch implements a few of the OpenCL types for SYCL, however
doesn't bother handling semantic analysis as these are not intended to
be used anywhere but in the SYCL implementation.

Signed-off-by: Erich Keane <erich.keane@intel.com>

Differential Revision: https://reviews.llvm.org/D77220
* Make the OpenCL Builtin lookup agnostic to programming models

  Rename the OpenCL Builtin lookup system to make it agnostic.
  The Builtin emitter is now outputting the builtin information
  into a class so that different programming models can be
  produced and used.

* Add SPIR-V variants of TypeSampledImage as clang builtin type.

  This patch adds SPIR-V sampled image types as derivative of the builtin OpenCL Image types.
  For each OpenCL image type, clang defines a Sampled<image type> variant and
  lowered as a "spirv.SampledImage.<image>" llvm opaque type.

* Enable SPIR-V builtin lookup

  Add flag -fdeclare-spirv-builtins to enable lookup of SPIR-V builtins.

  If -fdeclare-spirv-builtins is passed to clang, the compiler will try
  to lookup for the builtin described in SPIRVBuiltins.td for any match.
  If a match is found, overloads are build for the match.

  This will enforce a stable way to express SPIR-V builtins and make them
  closer to how the translator mangles them. This will help ensuring
  builtin for CUDA does not break easily. This will also support any
  changes suggested by the SPIRV-LLVM people on how to represent builtins.

  Define __SPIRV_BUILTIN_DECLARATIONS__ when passing
  -fdeclare-spirv-builtins to clang.

  Added OpenCL SPIR-V extended set builtins bindings and
  part of the core SPIR-V (mostly missing Images and Pipes)

TODO: Known vendor extensions are not implemented yet.

Signed-off-by: Victor Lomuller <victor@codeplay.com>

Differential Revision: https://reviews.llvm.org/D108034
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Stale upstream This change is related to upstreaming SYCL support to llorg.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants