From 6b1a7f4bb8fcd0fb3dfcf76889e44f20ee36b72b Mon Sep 17 00:00:00 2001 From: "Sudarsanam, Arvind" Date: Sat, 17 Aug 2024 04:49:38 -0700 Subject: [PATCH 1/2] Test new offload model Signed-off-by: Sudarsanam, Arvind --- sycl/test-e2e/format.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/test-e2e/format.py b/sycl/test-e2e/format.py index 44a3566a16c54..8aaa897a1de5f 100644 --- a/sycl/test-e2e/format.py +++ b/sycl/test-e2e/format.py @@ -173,7 +173,7 @@ def execute(self, test, litConfig): substitutions.append( ( "%{build}", - "%clangxx -fsycl -fsycl-targets=%{sycl_triple} %verbose_print %s", + "%clangxx -fsycl -fsycl-targets=%{sycl_triple} --offload-new-driver %verbose_print %s", ) ) if platform.system() == "Windows": From e0b5425ea2ff608ae8264f4ef63deb893ed149a1 Mon Sep 17 00:00:00 2001 From: "Sudarsanam, Arvind" Date: Sat, 17 Aug 2024 08:56:52 -0700 Subject: [PATCH 2/2] Turn on --offload-new-driver in driver code Signed-off-by: Sudarsanam, Arvind --- clang/include/clang/Driver/Driver.h | 7 ++++++ clang/lib/Driver/Driver.cpp | 36 +++++++++++++++++++++++---- clang/lib/Driver/ToolChains/Clang.cpp | 10 +++++--- sycl/test-e2e/format.py | 2 +- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 1477e7f99d785..b308656b3635d 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -591,6 +591,13 @@ class Driver { /// specified subarch llvm::Triple MakeSYCLDeviceTriple(StringRef TargetArch = "spir64") const; + /// Utility function to parse all devices passed via -fsycl-targets. + /// Return 'true' for JIT, AOT Intel CPU/GPUs and NVidia/AMD targets. + /// Otherwise return 'false'. + bool + GetUseNewOffloadDriverForSYCLOffload(Compilation &C, + const llvm::opt::ArgList &Args) const; + /// PrintActions - Print the list of actions. void PrintActions(const Compilation &C) const; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f8f2ff94e2a2c..6f4844f78b9d8 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1348,6 +1348,32 @@ static void appendOneArg(InputArgList &Args, const Arg *Opt, Args.append(Copy); } + /// Utility function to parse all devices passed via -fsycl-targets. + /// Return 'true' for JIT, AOT Intel CPU/GPUs and NVidia/AMD targets. + /// Otherwise return 'false'. +bool Driver::GetUseNewOffloadDriverForSYCLOffload(Compilation &C, + const ArgList &Args) const { + // Check only if enabled with -fsycl + if (!Args.hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false)) + return false; + + if (Args.hasFlag(options::OPT_no_offload_new_driver, + options::OPT_offload_new_driver, false)) + return false; + + if (Args.hasArg(options::OPT_fintelfpga)) + return false; + + if (const Arg *A = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { + for (const char *Val : A->getValues()) { + llvm::Triple TT(C.getDriver().MakeSYCLDeviceTriple(Val)); + if ((!TT.isSPIROrSPIRV()) || TT.isSPIRAOT()) + return false; + } + } + return true; +} + bool Driver::readConfigFile(StringRef FileName, llvm::cl::ExpansionContext &ExpCtx) { // Try opening the given file. @@ -1899,11 +1925,10 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { // Use new offloading path for OpenMP. This is disabled as the SYCL // offloading path is not properly setup to use the updated device linking // scheme. - if ((C->isOffloadingHostKind(Action::OFK_OpenMP) && - TranslatedArgs->hasFlag(options::OPT_fopenmp_new_driver, - options::OPT_no_offload_new_driver, true)) || + if (C->isOffloadingHostKind(Action::OFK_OpenMP) || TranslatedArgs->hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false)) + options::OPT_no_offload_new_driver, false) || + GetUseNewOffloadDriverForSYCLOffload(*C, *TranslatedArgs)) setUseNewOffloadingDriver(); // Determine FPGA emulation status. @@ -7289,7 +7314,8 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, bool UseNewOffloadingDriver = C.isOffloadingHostKind(Action::OFK_OpenMP) || Args.hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false); + options::OPT_no_offload_new_driver, false) || + GetUseNewOffloadDriverForSYCLOffload(C, Args); // Builder to be used to build offloading actions. std::unique_ptr OffloadBuilder = diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 8df597de8f5ff..7d3c6c139e6d3 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5229,10 +5229,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, bool IsDeviceOffloadAction = !(JA.isDeviceOffloading(Action::OFK_None) || JA.isDeviceOffloading(Action::OFK_Host)); bool IsHostOffloadingAction = - JA.isHostOffloading(Action::OFK_OpenMP) || - (JA.isHostOffloading(C.getActiveOffloadKinds()) && - Args.hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false)); + (JA.isHostOffloading(Action::OFK_OpenMP) || + (JA.isHostOffloading(C.getActiveOffloadKinds()) && + Args.hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false))) || + (JA.isHostOffloading(Action::OFK_SYCL) && + C.getDriver().GetUseNewOffloadDriverForSYCLOffload(C, Args)); bool IsRDCMode = Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, IsSYCL); diff --git a/sycl/test-e2e/format.py b/sycl/test-e2e/format.py index 8aaa897a1de5f..44a3566a16c54 100644 --- a/sycl/test-e2e/format.py +++ b/sycl/test-e2e/format.py @@ -173,7 +173,7 @@ def execute(self, test, litConfig): substitutions.append( ( "%{build}", - "%clangxx -fsycl -fsycl-targets=%{sycl_triple} --offload-new-driver %verbose_print %s", + "%clangxx -fsycl -fsycl-targets=%{sycl_triple} %verbose_print %s", ) ) if platform.system() == "Windows":