-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[Driver][SYCL] Add initial SYCL offload compilation support #107493
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
Changes from 1 commit
4112034
47cc846
8c29ad5
7884962
5e204cd
db45e5c
f57670e
05c7584
b810ae2
8a0826a
92cab9a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -182,7 +182,8 @@ def opencl_Group : OptionGroup<"<opencl group>">, Group<f_Group>, | |
| DocName<"OpenCL options">; | ||
|
|
||
| def sycl_Group : OptionGroup<"<SYCL group>">, Group<f_Group>, | ||
| DocName<"SYCL options">; | ||
| DocName<"SYCL options">, | ||
| Visibility<[ClangOption, CLOption]>; | ||
|
|
||
| def cuda_Group : OptionGroup<"<CUDA group>">, Group<f_Group>, | ||
| DocName<"CUDA options">, | ||
|
|
@@ -6691,12 +6692,16 @@ defm : FlangIgnoredDiagOpt<"frontend-loop-interchange">; | |
| defm : FlangIgnoredDiagOpt<"target-lifetime">; | ||
|
|
||
| // C++ SYCL options | ||
| let Group = sycl_Group in { | ||
| def fsycl : Flag<["-"], "fsycl">, | ||
| Visibility<[ClangOption, CLOption]>, | ||
| Group<sycl_Group>, HelpText<"Enables SYCL kernels compilation for device">; | ||
| HelpText<"Enables SYCL kernels compilation for device">; | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The existing help text could use some improvement,. How about simply "Enable SYCL C++ extensions" (and "Disable SYCL C++ extensions" for |
||
| def fno_sycl : Flag<["-"], "fno-sycl">, | ||
| Visibility<[ClangOption, CLOption]>, | ||
| Group<sycl_Group>, HelpText<"Disables SYCL kernels compilation for device">; | ||
| HelpText<"Disables SYCL kernels compilation for device">; | ||
| def fsycl_device_only : Flag<["-"], "fsycl-device-only">, | ||
| Alias<offload_device_only>, HelpText<"Compile SYCL kernels for device only">; | ||
|
Comment on lines
+6783
to
+6784
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "kernels" seems out of place in the help text. How about more closely following the existing help text for CUDA? "Compile SYCL code for device only". |
||
| def fsycl_host_only : Flag<["-"], "fsycl-host-only">, | ||
| Alias<offload_host_only>, HelpText<"Compile SYCL kernels for host only">; | ||
|
Comment on lines
+6785
to
+6786
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar to the above comment; "kernels" seems out of place here. There is also an interesting deviation from the equivalent option for CUDA: SYCL should presumably follow suit here and add the "Has no effect on non-SYCL compilations." qualification (and the behavior of the option should presumably match). |
||
| } // let Group = sycl_Group | ||
|
|
||
| // OS-specific options | ||
| let Flags = [TargetSpecific] in { | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||
|---|---|---|---|---|
|
|
@@ -43,6 +43,7 @@ | |||
| #include "ToolChains/PS4CPU.h" | ||||
| #include "ToolChains/RISCVToolchain.h" | ||||
| #include "ToolChains/SPIRV.h" | ||||
| #include "ToolChains/SYCL.h" | ||||
| #include "ToolChains/Solaris.h" | ||||
| #include "ToolChains/TCE.h" | ||||
| #include "ToolChains/VEToolchain.h" | ||||
|
|
@@ -767,6 +768,26 @@ Driver::OpenMPRuntimeKind Driver::getOpenMPRuntime(const ArgList &Args) const { | |||
| return RT; | ||||
| } | ||||
|
|
||||
| static const char *getDefaultSYCLArch(Compilation &C) { | ||||
| if (C.getDefaultToolChain().getTriple().getArch() == llvm::Triple::x86) | ||||
mdtoguchi marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||||
| return "spir"; | ||||
| return "spir64"; | ||||
|
||||
| } | ||||
|
|
||||
| static bool addSYCLDefaultTriple(Compilation &C, | ||||
| SmallVectorImpl<llvm::Triple> &SYCLTriples) { | ||||
| for (const auto &SYCLTriple : SYCLTriples) { | ||||
| if (SYCLTriple.getSubArch() == llvm::Triple::NoSubArch && | ||||
| SYCLTriple.isSPIROrSPIRV()) | ||||
| return false; | ||||
| } | ||||
| // Add the default triple as it was not found. | ||||
| llvm::Triple DefaultTriple = | ||||
| C.getDriver().MakeSYCLDeviceTriple(getDefaultSYCLArch(C)); | ||||
| SYCLTriples.insert(SYCLTriples.begin(), DefaultTriple); | ||||
| return true; | ||||
| } | ||||
|
|
||||
| void Driver::CreateOffloadingDeviceToolChains(Compilation &C, | ||||
| InputList &Inputs) { | ||||
|
|
||||
|
|
@@ -979,6 +1000,44 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, | |||
| return; | ||||
| } | ||||
|
|
||||
| // | ||||
| // SYCL | ||||
| // | ||||
| // We need to generate a SYCL toolchain if the user specified -fsycl. | ||||
| // If -fsycl is supplied we will assume SPIR-V. | ||||
|
||||
| // If -fsycl is supplied we will assume SPIR-V. |
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually, this comment doesn't seem all that helpful here either. Perhaps it would be better colocated with addSYCLDefaultTriple(). Hmm, no, perhaps getDefaultSYCLArch() then?
mdtoguchi marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since AoT support doesn't exist in Clang yet, this TODO comment seems premature.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems that something needs to be done in these default cases. In this context, TC is known to be null, but falling through leads to an unconditional dereference of it below. Some llvm_unreachable() or similar calls seem appropriate.
Uh oh!
There was an error while loading. Please reload this page.