From afd6a5cb61febb93e6ddd42c0f2543195e8b0e69 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Sun, 8 Sep 2024 22:11:23 -0700 Subject: [PATCH 01/14] [Driver] Enable --offload-arch for SYCL AOT compilation with the new offload driver. --- clang/lib/Driver/Driver.cpp | 101 +++++++++++++++++- clang/lib/Driver/ToolChains/SYCL.cpp | 25 +++++ clang/lib/Driver/ToolChains/SYCL.h | 76 +++++++++++++ .../Driver/sycl-offload-arch-intelgpu.cpp | 10 ++ 4 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 clang/test/Driver/sycl-offload-arch-intelgpu.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index c888733f1d885..0e012f0968d82 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1022,7 +1022,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, for (const auto &TripleAndArchs : DerivedArchs) OpenMPTriples.insert(TripleAndArchs.first()); - } + } // end of offload-arch for (StringRef Val : OpenMPTriples) { llvm::Triple TT(ToolChain::getOpenMPTriple(Val)); @@ -1109,6 +1109,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, }; Arg *SYCLTargets = getArgRequiringSYCLRuntime(options::OPT_fsycl_targets_EQ); + Arg *SYCLOffloadArch = getArgRequiringSYCLRuntime(options::OPT_offload_arch_EQ); // Check if -fsycl-host-compiler is used in conjunction with -fsycl. Arg *SYCLHostCompiler = @@ -1182,12 +1183,14 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, llvm::StringMap> DerivedArchs; llvm::StringMap FoundNormalizedTriples; llvm::SmallVector UniqueSYCLTriplesVec; +//llvm::StringSet<> SYCLTriples; + std::multiset SYCLTriples; if (HasSYCLTargetsOption) { // At this point, we know we have a valid combination // of -fsycl*target options passed Arg *SYCLTargetsValues = SYCLTargets; if (SYCLTargetsValues) { - llvm::StringSet<> SYCLTriples; + if (SYCLTargetsValues->getNumValues()) { // Multiple targets are currently not supported when using @@ -1275,10 +1278,12 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, SYCLTriples.insert(DeviceTriple.normalize()); if (!Arch.empty()) DerivedArchs[DeviceTriple.getTriple()].insert(Arch); - } + } // end of SYCLTargetsValues for loop + if (!SYCLTriples.empty()) { for (const auto &SYCLTriple : SYCLTriples) { - llvm::Triple Triple(SYCLTriple.getKey()); + //llvm::Triple TT(MakeSYCLDeviceTriple(Val)); + llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple)); UniqueSYCLTriplesVec.push_back(Triple); } } @@ -1287,7 +1292,93 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, Diag(clang::diag::warn_drv_empty_joined_argument) << SYCLTargetsValues->getAsString(C.getInputArgs()); } - } else { + } else if(SYCLOffloadArch) { + const ToolChain *HostTC = C.getSingleOffloadToolChain(); + auto AMDTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs()); + auto NVPTXTriple = getNVIDIAOffloadTargetTriple(*this, C.getInputArgs(), + HostTC->getTriple()); + + // Attempt to deduce the offloading triple from the set of architectures. + // We can only correctly deduce NVPTX / AMDGPU triples currently. We need + // to temporarily create these toolchains so that we can access tools for + // inferring architectures. + llvm::DenseSet Archs; + if (NVPTXTriple) { + auto TempTC = std::make_unique( + *this, *NVPTXTriple, *HostTC, C.getInputArgs(), Action::OFK_None); + for (StringRef Arch : getOffloadArchs( + C, C.getArgs(), Action::OFK_SYCL, &*TempTC, true)) + Archs.insert(Arch); + } + if (AMDTriple) { + auto TempTC = std::make_unique( + *this, *AMDTriple, *HostTC, C.getInputArgs()); + for (StringRef Arch : getOffloadArchs( + C, C.getArgs(), Action::OFK_SYCL, &*TempTC, true)) + Archs.insert(Arch); + } + if (!AMDTriple && !NVPTXTriple) { + for (StringRef Arch : + getOffloadArchs(C, C.getArgs(), Action::OFK_SYCL, nullptr, true)) + Archs.insert(Arch); + } + for (StringRef Arch : Archs) { + if (NVPTXTriple && IsNVIDIAOffloadArch(StringToOffloadArch( + getProcessorFromTargetID(*NVPTXTriple, Arch)))) { + DerivedArchs[NVPTXTriple->getTriple()].insert(Arch); + } else if (AMDTriple && + IsAMDOffloadArch(StringToOffloadArch( + getProcessorFromTargetID(*AMDTriple, Arch)))) { + DerivedArchs[AMDTriple->getTriple()].insert(Arch); + } + else if (IsIntelCPUOffloadArch(StringToOffloadArchIntel(Arch))) { + DerivedArchs["spir64_x86_64"].insert(Arch); + } else if(IsIntelGPUOffloadArch(StringToOffloadArchIntel(Arch))) { + DerivedArchs["spir64_gen"].insert(Arch); + } + else { + Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << Arch; + return; + } + } + // If the set is empty then we failed to find a native architecture. + if (Archs.empty()) { + Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) + << "native"; + return; + } + + for (const auto &TripleAndArchs : DerivedArchs) + SYCLTriples.insert(TripleAndArchs.first()); // ["triple -> arch"] + + +for (StringRef Val : SYCLTriples) { + llvm::Triple TT(MakeSYCLDeviceTriple(Val)); + std::string NormalizedName = TT.normalize(); + + // Make sure we don't have a duplicate triple. + auto Duplicate = FoundNormalizedTriples.find(NormalizedName); + if (Duplicate != FoundNormalizedTriples.end()) { + Diag(clang::diag::warn_drv_omp_offload_target_duplicate) + << Val << Duplicate->second; + continue; + } + + // Store the current triple so that we can check for duplicates in the + // following iterations. + FoundNormalizedTriples[NormalizedName] = Val; +} + + if (!SYCLTriples.empty()) { + for (const auto &SYCLTriple : SYCLTriples) { + llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple)); + UniqueSYCLTriplesVec.push_back(Triple); + } + } + addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); + +} // end of --offload-arch + else { // If -fsycl is supplied without -fsycl-targets we will assume SPIR-V. // For -fsycl-device-only, we also setup the implied triple as needed. if (HasValidSYCLRuntime) { diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 5ae515c456747..fbd5a78fbe90f 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -27,6 +27,31 @@ using namespace clang::driver::tools; using namespace clang; using namespace llvm::opt; +struct StringToOffloadArchIntelMap { + const char *ArchName; + OffloadArchIntel IntelArch; +}; + +static const StringToOffloadArchIntelMap StringToArchNamesMap[] = { + {"broadwell", OffloadArchIntel::BROADWELL}, + {"coffeelake", OffloadArchIntel::COFFEELAKE}, + {"icelake-client", OffloadArchIntel::ICELAKECLIENT}, + {"bdw", OffloadArchIntel::BDW}, + {"cfl", OffloadArchIntel::CFL}, + {"icl", OffloadArchIntel::ICL}}; + +OffloadArchIntel +clang::driver::StringToOffloadArchIntel(llvm::StringRef ArchNameAsString) { + auto result = std::find_if( + std::begin(StringToArchNamesMap), std::end(StringToArchNamesMap), + [ArchNameAsString](const StringToOffloadArchIntelMap &map) { + return ArchNameAsString == map.ArchName; + }); + if (result == std::end(StringToArchNamesMap)) + return OffloadArchIntel::UNKNOWN; + return result->IntelArch; +} + SYCLInstallationDetector::SYCLInstallationDetector(const Driver &D) : D(D), InstallationCandidates() { InstallationCandidates.emplace_back(D.Dir + "/.."); diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 03ea18d560146..1fb23f97db65b 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -16,6 +16,82 @@ namespace clang { namespace driver { +// List of supported Intel values for CPUs +// and GPUs. +enum class OffloadArchIntel { + // CPUs + UNKNOWN, + SKYLAKEAVX512, + COREAVX2, + COREI7AVX, + COREI7, + WESTMERE, + SANDYBRIDGE, + IVYBRIDGE, + BROADWELL, + COFFEELAKE, + ALDERLAKE, + SKYLAKE, + SKX, + CASCADELAKE, + ICELAKECLIENT, + ICELAKESERVER, + SAPPHIRERAPIDS, + GRANITERAPIDS, + // GPUs + BDW, + SKL, + KBL, + CFL, + APL, + BXT, + GLK, + WHL, + AML, + CML, + ICLLP, + ICL, + EHL, + JSL, + TGLLP, + TGL, + RKL, + ADL_S, + RPL_S, + ADL_P, + ADL_N, + DG1, + ACM_G10, + DG2_G10, + ACM_G11, + DG2_GLL, + ACM_G12, + DG2_G12, + PVC, + PVC_VG, + MTL_U, + MTL_S, + ARL_U, + ARL_S, + MTL_H, + ARL_H, + BMG_G21, + LNL_M +}; + +// Check if the given Arch value is a valid Intel CPU. +static inline bool IsIntelCPUOffloadArch(OffloadArchIntel Arch) { + return Arch >= OffloadArchIntel::SKYLAKEAVX512 && + Arch < OffloadArchIntel::BDW; +} + +// Check if the given Arch value is a valid Intel GPU. +static inline bool IsIntelGPUOffloadArch(OffloadArchIntel Arch) { + return Arch >= OffloadArchIntel::BDW && Arch <= OffloadArchIntel::LNL_M; +} + +OffloadArchIntel StringToOffloadArchIntel(llvm::StringRef ArchNameAsString); + class SYCLInstallationDetector { public: SYCLInstallationDetector(const Driver &D); diff --git a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp b/clang/test/Driver/sycl-offload-arch-intelgpu.cpp new file mode 100644 index 0000000000000..a92032bd70111 --- /dev/null +++ b/clang/test/Driver/sycl-offload-arch-intelgpu.cpp @@ -0,0 +1,10 @@ +/// Tests the behaviors of using -fsycl --offload-new-driver +// --offload-arch=. + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bdw %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=DEVICE,MACRO -DDEV_STR=bdw -DMAC_STR=BDW +// MACRO: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" +// MACRO: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// MACRO: clang{{.*}} "-fsycl-is-host" +// MACRO: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// DEVICE: ocloc{{.*}} "-device" "[[DEV_STR]]" From d5339a04bd644b7d5abb65189a09e18d261ff3f6 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Tue, 10 Sep 2024 16:35:28 -0700 Subject: [PATCH 02/14] Add initial test. --- .../clang/Basic/DiagnosticDriverKinds.td | 2 + clang/lib/Driver/Driver.cpp | 165 ++++++++++-------- .../Driver/sycl-offload-arch-intelgpu.cpp | 19 +- 3 files changed, 104 insertions(+), 82 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index b6e71082be66d..4e573cf4f075a 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -396,6 +396,8 @@ def err_drv_sycl_missing_amdgpu_arch : Error< "missing AMDGPU architecture for SYCL offloading; specify it with '-Xsycl-target-backend%select{|=%1}0 --offload-arch='">; def err_drv_sycl_thinlto_split_off: Error< "'%0' is not supported when '%1' is set with '-fsycl'">; +def err_drv_sycl_offload_arch_new_driver: Error< + "'--offload-arch' is supported when '-fsycl' is set with '--offload-new-driver'">; def warn_drv_sycl_offload_target_duplicate : Warning< "SYCL offloading target '%0' is similar to target '%1' already specified; " "will be ignored">, InGroup; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 0e012f0968d82..b71d432d8438f 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1109,7 +1109,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, }; Arg *SYCLTargets = getArgRequiringSYCLRuntime(options::OPT_fsycl_targets_EQ); - Arg *SYCLOffloadArch = getArgRequiringSYCLRuntime(options::OPT_offload_arch_EQ); // Check if -fsycl-host-compiler is used in conjunction with -fsycl. Arg *SYCLHostCompiler = @@ -1183,8 +1182,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, llvm::StringMap> DerivedArchs; llvm::StringMap FoundNormalizedTriples; llvm::SmallVector UniqueSYCLTriplesVec; -//llvm::StringSet<> SYCLTriples; - std::multiset SYCLTriples; + llvm::StringSet<> SYCLTriples; if (HasSYCLTargetsOption) { // At this point, we know we have a valid combination // of -fsycl*target options passed @@ -1278,12 +1276,11 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, SYCLTriples.insert(DeviceTriple.normalize()); if (!Arch.empty()) DerivedArchs[DeviceTriple.getTriple()].insert(Arch); - } // end of SYCLTargetsValues for loop + } if (!SYCLTriples.empty()) { for (const auto &SYCLTriple : SYCLTriples) { - //llvm::Triple TT(MakeSYCLDeviceTriple(Val)); - llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple)); + llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple.getKey())); UniqueSYCLTriplesVec.push_back(Triple); } } @@ -1292,92 +1289,93 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, Diag(clang::diag::warn_drv_empty_joined_argument) << SYCLTargetsValues->getAsString(C.getInputArgs()); } - } else if(SYCLOffloadArch) { - const ToolChain *HostTC = C.getSingleOffloadToolChain(); - auto AMDTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs()); - auto NVPTXTriple = getNVIDIAOffloadTargetTriple(*this, C.getInputArgs(), - HostTC->getTriple()); - - // Attempt to deduce the offloading triple from the set of architectures. - // We can only correctly deduce NVPTX / AMDGPU triples currently. We need - // to temporarily create these toolchains so that we can access tools for - // inferring architectures. - llvm::DenseSet Archs; - if (NVPTXTriple) { - auto TempTC = std::make_unique( - *this, *NVPTXTriple, *HostTC, C.getInputArgs(), Action::OFK_None); - for (StringRef Arch : getOffloadArchs( - C, C.getArgs(), Action::OFK_SYCL, &*TempTC, true)) - Archs.insert(Arch); - } - if (AMDTriple) { - auto TempTC = std::make_unique( - *this, *AMDTriple, *HostTC, C.getInputArgs()); - for (StringRef Arch : getOffloadArchs( - C, C.getArgs(), Action::OFK_SYCL, &*TempTC, true)) - Archs.insert(Arch); - } - if (!AMDTriple && !NVPTXTriple) { - for (StringRef Arch : - getOffloadArchs(C, C.getArgs(), Action::OFK_SYCL, nullptr, true)) - Archs.insert(Arch); - } - for (StringRef Arch : Archs) { - if (NVPTXTriple && IsNVIDIAOffloadArch(StringToOffloadArch( - getProcessorFromTargetID(*NVPTXTriple, Arch)))) { - DerivedArchs[NVPTXTriple->getTriple()].insert(Arch); - } else if (AMDTriple && - IsAMDOffloadArch(StringToOffloadArch( - getProcessorFromTargetID(*AMDTriple, Arch)))) { - DerivedArchs[AMDTriple->getTriple()].insert(Arch); - } - else if (IsIntelCPUOffloadArch(StringToOffloadArchIntel(Arch))) { - DerivedArchs["spir64_x86_64"].insert(Arch); - } else if(IsIntelGPUOffloadArch(StringToOffloadArchIntel(Arch))) { - DerivedArchs["spir64_gen"].insert(Arch); - } - else { - Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << Arch; - return; - } - } - // If the set is empty then we failed to find a native architecture. - if (Archs.empty()) { - Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) - << "native"; + } + // If the user specified --offload-arch, deduce the offloading + // target triple(s) from the set of architecture(s). + // Create a toolchain for each valid triple. + else if (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ) && !IsHIP && + !IsCuda) { + const ToolChain *HostTC = C.getSingleOffloadToolChain(); + auto AMDTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs()); + auto NVPTXTriple = getNVIDIAOffloadTargetTriple(*this, C.getInputArgs(), + HostTC->getTriple()); + + // Attempt to deduce the offloading triple from the set of architectures. + // We need to temporarily create these toolchains so that we can access + // tools for inferring architectures. + llvm::DenseSet Archs; + if (NVPTXTriple) { + auto TempTC = std::make_unique( + *this, *NVPTXTriple, *HostTC, C.getInputArgs(), Action::OFK_None); + for (StringRef Arch : + getOffloadArchs(C, C.getArgs(), Action::OFK_SYCL, &*TempTC, true)) + Archs.insert(Arch); + } + if (AMDTriple) { + auto TempTC = std::make_unique( + *this, *AMDTriple, *HostTC, C.getInputArgs()); + for (StringRef Arch : + getOffloadArchs(C, C.getArgs(), Action::OFK_SYCL, &*TempTC, true)) + Archs.insert(Arch); + } + if (!AMDTriple && !NVPTXTriple) { + for (StringRef Arch : + getOffloadArchs(C, C.getArgs(), Action::OFK_SYCL, nullptr, true)) + Archs.insert(Arch); + } + for (StringRef Arch : Archs) { + if (NVPTXTriple && IsNVIDIAOffloadArch(StringToOffloadArch( + getProcessorFromTargetID(*NVPTXTriple, Arch)))) { + DerivedArchs[NVPTXTriple->getTriple()].insert(Arch); + } else if (AMDTriple && + IsAMDOffloadArch(StringToOffloadArch( + getProcessorFromTargetID(*AMDTriple, Arch)))) { + DerivedArchs[AMDTriple->getTriple()].insert(Arch); + } else if (IsIntelCPUOffloadArch(StringToOffloadArchIntel(Arch))) { + DerivedArchs["spir64_x86_64"].insert(Arch); + } else if (IsIntelGPUOffloadArch(StringToOffloadArchIntel(Arch))) { + DerivedArchs["spir64_gen"].insert(Arch); + } else { + Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << Arch; return; } + } + // If the set is empty then we failed to find a native architecture. + if (Archs.empty()) { + Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << "native"; + return; + } - for (const auto &TripleAndArchs : DerivedArchs) - SYCLTriples.insert(TripleAndArchs.first()); // ["triple -> arch"] - + for (const auto &TripleAndArchs : DerivedArchs) + SYCLTriples.insert(TripleAndArchs.first()); -for (StringRef Val : SYCLTriples) { - llvm::Triple TT(MakeSYCLDeviceTriple(Val)); + for (const auto &Val : SYCLTriples) { + llvm::Triple TT(MakeSYCLDeviceTriple(Val.getKey())); std::string NormalizedName = TT.normalize(); // Make sure we don't have a duplicate triple. auto Duplicate = FoundNormalizedTriples.find(NormalizedName); if (Duplicate != FoundNormalizedTriples.end()) { Diag(clang::diag::warn_drv_omp_offload_target_duplicate) - << Val << Duplicate->second; + << Val.getKey() << Duplicate->second; continue; } // Store the current triple so that we can check for duplicates in the // following iterations. - FoundNormalizedTriples[NormalizedName] = Val; -} + FoundNormalizedTriples[NormalizedName] = Val.getKey(); + } - if (!SYCLTriples.empty()) { - for (const auto &SYCLTriple : SYCLTriples) { - llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple)); - UniqueSYCLTriplesVec.push_back(Triple); - } - } - addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); - -} // end of --offload-arch + if (!SYCLTriples.empty()) { + for (const auto &SYCLTriple : SYCLTriples) { + llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple.getKey())); + UniqueSYCLTriplesVec.push_back(Triple); + } + } + + addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); + + } // end of --offload-arch else { // If -fsycl is supplied without -fsycl-targets we will assume SPIR-V. // For -fsycl-device-only, we also setup the implied triple as needed. @@ -7335,6 +7333,21 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, handleArguments(C, Args, Inputs, Actions); + bool HasValidSYCLRuntime = + C.getInputArgs().hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, + false) || + hasSYCLDeviceOnly(C.getInputArgs()); + bool IsSYCLOffloadArchEnabled = + HasValidSYCLRuntime && + C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); + + if (IsSYCLOffloadArchEnabled && + !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false)) { + Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); + return; + } + // If '-fintelfpga' is passed, add '-fsycl' to the list of arguments const llvm::opt::OptTable &Opts = getOpts(); Arg *SYCLFpgaArg = C.getInputArgs().getLastArg(options::OPT_fintelfpga); diff --git a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp b/clang/test/Driver/sycl-offload-arch-intelgpu.cpp index a92032bd70111..a27d1c15c33ee 100644 --- a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp +++ b/clang/test/Driver/sycl-offload-arch-intelgpu.cpp @@ -2,9 +2,16 @@ // --offload-arch=. // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bdw %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=DEVICE,MACRO -DDEV_STR=bdw -DMAC_STR=BDW -// MACRO: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" -// MACRO: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" -// MACRO: clang{{.*}} "-fsycl-is-host" -// MACRO: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" -// DEVICE: ocloc{{.*}} "-device" "[[DEV_STR]]" +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE,CLANG-OFFLOAD-PACKAGER -DDEV_STR=bdw -DMAC_STR=BDW + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cfl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE,CLANG-OFFLOAD-PACKAGER -DDEV_STR=cfl -DMAC_STR=CFL + + +///If Arch is icl, map it to icllp internally to create D__SYCL_TARGET_INTEL_GPU_ + +// TARGET-TRIPLE: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" +// TARGET-TRIPLE: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// CLANG-OFFLOAD-PACKAGER: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_gen-unknown-unknown,arch=[[DEV_STR]],kind=sycl" + + From 7828b8e28cc93328b85239b356f7eff22f900bac Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Wed, 11 Sep 2024 10:52:50 -0700 Subject: [PATCH 03/14] Fix test failures. --- clang/lib/Driver/Driver.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index b71d432d8438f..e051f2ba5468a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1293,7 +1293,8 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, // If the user specified --offload-arch, deduce the offloading // target triple(s) from the set of architecture(s). // Create a toolchain for each valid triple. - else if (C.getInputArgs().hasArg(options::OPT_offload_arch_EQ) && !IsHIP && + else if (HasValidSYCLRuntime && + C.getInputArgs().hasArg(options::OPT_offload_arch_EQ) && !IsHIP && !IsCuda) { const ToolChain *HostTC = C.getSingleOffloadToolChain(); auto AMDTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs()); @@ -7340,13 +7341,14 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, bool IsSYCLOffloadArchEnabled = HasValidSYCLRuntime && C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); - - if (IsSYCLOffloadArchEnabled && - !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false)) { - Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); - return; - } + /* + if (IsSYCLOffloadArchEnabled && + !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false)) { + Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); + return; + } + */ // If '-fintelfpga' is passed, add '-fsycl' to the list of arguments const llvm::opt::OptTable &Opts = getOpts(); From 9acfa69d295ff91117afc710d62928a1e4f348eb Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Wed, 11 Sep 2024 16:17:51 -0700 Subject: [PATCH 04/14] Update test for all Intel CPUs. --- clang/lib/Driver/Driver.cpp | 23 ++---- clang/lib/Driver/ToolChains/SYCL.cpp | 53 ++++++++++++- clang/lib/Driver/ToolChains/SYCL.h | 2 +- .../Driver/sycl-offload-arch-intelgpu.cpp | 74 ++++++++++++++++--- 4 files changed, 126 insertions(+), 26 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index e051f2ba5468a..a4da7bd9b1604 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1022,7 +1022,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, for (const auto &TripleAndArchs : DerivedArchs) OpenMPTriples.insert(TripleAndArchs.first()); - } // end of offload-arch + } for (StringRef Val : OpenMPTriples) { llvm::Triple TT(ToolChain::getOpenMPTriple(Val)); @@ -1337,13 +1337,13 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, } else if (IsIntelGPUOffloadArch(StringToOffloadArchIntel(Arch))) { DerivedArchs["spir64_gen"].insert(Arch); } else { - Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << Arch; + Diag(clang::diag::err_drv_invalid_sycl_target) << Arch; return; } } // If the set is empty then we failed to find a native architecture. if (Archs.empty()) { - Diag(clang::diag::err_drv_failed_to_deduce_target_from_arch) << "native"; + Diag(clang::diag::err_drv_invalid_sycl_target) << "native"; return; } @@ -1351,13 +1351,13 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, SYCLTriples.insert(TripleAndArchs.first()); for (const auto &Val : SYCLTriples) { - llvm::Triple TT(MakeSYCLDeviceTriple(Val.getKey())); - std::string NormalizedName = TT.normalize(); + llvm::Triple SYCLTargetTriple(MakeSYCLDeviceTriple(Val.getKey())); + std::string NormalizedName = SYCLTargetTriple.normalize(); // Make sure we don't have a duplicate triple. auto Duplicate = FoundNormalizedTriples.find(NormalizedName); if (Duplicate != FoundNormalizedTriples.end()) { - Diag(clang::diag::warn_drv_omp_offload_target_duplicate) + Diag(clang::diag::warn_drv_sycl_offload_target_duplicate) << Val.getKey() << Duplicate->second; continue; } @@ -1365,19 +1365,12 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, // Store the current triple so that we can check for duplicates in the // following iterations. FoundNormalizedTriples[NormalizedName] = Val.getKey(); - } - - if (!SYCLTriples.empty()) { - for (const auto &SYCLTriple : SYCLTriples) { - llvm::Triple Triple(MakeSYCLDeviceTriple(SYCLTriple.getKey())); - UniqueSYCLTriplesVec.push_back(Triple); - } + UniqueSYCLTriplesVec.push_back(SYCLTargetTriple); } addSYCLDefaultTriple(C, UniqueSYCLTriplesVec); - } // end of --offload-arch - else { + } else { // If -fsycl is supplied without -fsycl-targets we will assume SPIR-V. // For -fsycl-device-only, we also setup the implied triple as needed. if (HasValidSYCLRuntime) { diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index fbd5a78fbe90f..25cd8d67ac4af 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -33,12 +33,63 @@ struct StringToOffloadArchIntelMap { }; static const StringToOffloadArchIntelMap StringToArchNamesMap[] = { + {"skylake-avx512", OffloadArchIntel::SKYLAKEAVX512}, + {"core-avx2", OffloadArchIntel::COREAVX2}, + {"corei7-avx", OffloadArchIntel::COREI7AVX}, + {"corei7", OffloadArchIntel::COREI7}, + {"westmere", OffloadArchIntel::WESTMERE}, + {"sandybridge", OffloadArchIntel::SANDYBRIDGE}, + {"ivybridge", OffloadArchIntel::IVYBRIDGE}, {"broadwell", OffloadArchIntel::BROADWELL}, {"coffeelake", OffloadArchIntel::COFFEELAKE}, + {"alderlake", OffloadArchIntel::ALDERLAKE}, + {"skylake", OffloadArchIntel::SKYLAKE}, + {"skx", OffloadArchIntel::SKX}, + {"cascadelake", OffloadArchIntel::CASCADELAKE}, {"icelake-client", OffloadArchIntel::ICELAKECLIENT}, + {"icelake-server", OffloadArchIntel::ICELAKESERVER}, + {"sapphirerapids", OffloadArchIntel::SAPPHIRERAPIDS}, + {"graniterapids", OffloadArchIntel::GRANITERAPIDS}, + // Intel GPU mapping. {"bdw", OffloadArchIntel::BDW}, + {"skl", OffloadArchIntel::SKL}, + {"kbl", OffloadArchIntel::KBL}, {"cfl", OffloadArchIntel::CFL}, - {"icl", OffloadArchIntel::ICL}}; + {"apl", OffloadArchIntel::APL}, + {"bxt", OffloadArchIntel::BXT}, + {"glk", OffloadArchIntel::GLK}, + {"whl", OffloadArchIntel::WHL}, + {"aml", OffloadArchIntel::AML}, + {"cml", OffloadArchIntel::CML}, + {"icllp", OffloadArchIntel::ICLLP}, + {"icl", OffloadArchIntel::ICL}, + {"ehl", OffloadArchIntel::EHL}, + {"jsl", OffloadArchIntel::JSL}, + {"tgllp", OffloadArchIntel::TGLLP}, + {"tgl", OffloadArchIntel::TGL}, + {"rkl", OffloadArchIntel::RKL}, + {"adl_s", OffloadArchIntel::ADL_S}, + {"rpl_s", OffloadArchIntel::RPL_S}, + {"adl_p", OffloadArchIntel::ADL_P}, + {"adl_n", OffloadArchIntel::ADL_N}, + {"dg1", OffloadArchIntel::DG1}, + {"acm_g10", OffloadArchIntel::ACM_G10}, + {"dg2_g10", OffloadArchIntel::DG2_G10}, + {"acm_g11", OffloadArchIntel::ACM_G11}, + {"dg2_g10", OffloadArchIntel::DG2_G10}, + {"dg2_g11", OffloadArchIntel::DG2_G11}, + {"acm_g12", OffloadArchIntel::ACM_G12}, + {"dg2_g12", OffloadArchIntel::DG2_G12}, + {"pvc", OffloadArchIntel::PVC}, + {"pvc_vg", OffloadArchIntel::PVC_VG}, + {"mtl_u", OffloadArchIntel::MTL_U}, + {"mtl_s", OffloadArchIntel::MTL_S}, + {"arl_u", OffloadArchIntel::ARL_U}, + {"arl_s", OffloadArchIntel::ARL_S}, + {"mtl_h", OffloadArchIntel::MTL_H}, + {"arl_h", OffloadArchIntel::ARL_H}, + {"bmg_g21", OffloadArchIntel::BMG_G21}, + {"lnl_m", OffloadArchIntel::LNL_M}}; OffloadArchIntel clang::driver::StringToOffloadArchIntel(llvm::StringRef ArchNameAsString) { diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 1fb23f97db65b..b8425dab95a15 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -64,7 +64,7 @@ enum class OffloadArchIntel { ACM_G10, DG2_G10, ACM_G11, - DG2_GLL, + DG2_G11, ACM_G12, DG2_G12, PVC, diff --git a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp b/clang/test/Driver/sycl-offload-arch-intelgpu.cpp index a27d1c15c33ee..95c51f721862e 100644 --- a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp +++ b/clang/test/Driver/sycl-offload-arch-intelgpu.cpp @@ -1,17 +1,73 @@ /// Tests the behaviors of using -fsycl --offload-new-driver -// --offload-arch=. +// --offload-arch=. -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bdw %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE,CLANG-OFFLOAD-PACKAGER -DDEV_STR=bdw -DMAC_STR=BDW +// SYCL AOT compilation to Intel CPUs using --offload-arch -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cfl %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE,CLANG-OFFLOAD-PACKAGER -DDEV_STR=cfl -DMAC_STR=CFL +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=broadwell %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=broadwell + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=coffeelake %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=coffeelake + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=icelake-client %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=icelake-client + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=skylake-avx512 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=skylake-avx512 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=core-avx2 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=core-avx2 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=corei7-avx %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=corei7-avx + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=corei7 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=corei7 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=westmere %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=westmere + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=sandybridge %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=sandybridge + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=ivybridge %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=ivybridge +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=alderlake %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=alderlake -///If Arch is icl, map it to icllp internally to create D__SYCL_TARGET_INTEL_GPU_ +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=skylake %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=skylake -// TARGET-TRIPLE: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" -// TARGET-TRIPLE: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" -// CLANG-OFFLOAD-PACKAGER: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_gen-unknown-unknown,arch=[[DEV_STR]],kind=sycl" +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=skx %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=skx + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cascadelake %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=cascadelake + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=icelake-server %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=icelake-server + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=sapphirerapids %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=sapphirerapids + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=graniterapids %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-CPU,CLANG-OFFLOAD-PACKAGER-CPU -DDEV_STR=graniterapids + +// TARGET-TRIPLE-CPU: clang{{.*}} "-triple" "spir64_x86_64-unknown-unknown" +// TARGET-TRIPLE-CPU: "-D__SYCL_TARGET_INTEL_X86_64__" +// CLANG-OFFLOAD-PACKAGER-CPU: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_x86_64-unknown-unknown,arch=[[DEV_STR]],kind=sycl" + + +// SYCL AOT compilation to Intel GPUs using --offload-arch + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bdw %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=bdw -DMAC_STR=BDW + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cfl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=cfl -DMAC_STR=CFL +// TARGET-TRIPLE-GPU: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" +// TARGET-TRIPLE-GPU: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// CLANG-OFFLOAD-PACKAGER-GPU: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_gen-unknown-unknown,arch=[[DEV_STR]],kind=sycl" From 26dd5ec9d62e961aa72aebb61b27ee9a6be7b5aa Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Thu, 12 Sep 2024 15:16:17 -0700 Subject: [PATCH 05/14] Add SYCL --offload-arch tests for AMD targets. --- .../Driver/sycl-offload-arch-amd-gpu-cpu.cpp | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp diff --git a/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp b/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp new file mode 100644 index 0000000000000..93d718a8d2431 --- /dev/null +++ b/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp @@ -0,0 +1,170 @@ +// SYCL AOT compilation to AMD GPUs and CPUs using --offload-arch + +// AMD GPUs + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx900 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx900 -DMAC_STR=GFX900 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx902 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx902 -DMAC_STR=GFX902 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx904 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx904 -DMAC_STR=GFX904 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx906 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx906 -DMAC_STR=GFX906 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx908 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx908 -DMAC_STR=GFX908 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx909 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx909 -DMAC_STR=GFX909 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx90a -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx90a -DMAC_STR=GFX90A + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx90c -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx90c -DMAC_STR=GFX90C + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx940 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx940 -DMAC_STR=GFX940 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx941 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx941 -DMAC_STR=GFX941 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx942 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx942 -DMAC_STR=GFX942 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1010 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1010 -DMAC_STR=GFX1010 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1011 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1011 -DMAC_STR=GFX1011 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1012 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1012 -DMAC_STR=GFX1012 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1013 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1013 -DMAC_STR=GFX1013 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1013 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1013 -DMAC_STR=GFX1013 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1030 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1030 -DMAC_STR=GFX1030 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1031 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1031 -DMAC_STR=GFX1031 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1032 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1032 -DMAC_STR=GFX1032 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1033 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1033 -DMAC_STR=GFX1033 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1034 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1034 -DMAC_STR=GFX1034 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1035 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1035 -DMAC_STR=GFX1035 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1036 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1036 -DMAC_STR=GFX1036 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1100 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1100 -DMAC_STR=GFX1100 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1101 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1101 -DMAC_STR=GFX1101 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1102 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1102 -DMAC_STR=GFX1102 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1103 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1103 -DMAC_STR=GFX1103 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1150 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1150 -DMAC_STR=GFX1150 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1151 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1151 -DMAC_STR=GFX1151 + +// AMD CPUs + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx600 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx600 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx601 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx601 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx602 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx602 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx700 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx700 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx701 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx701 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx702 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx702 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx702 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx702 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx703 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx703 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx704 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx704 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx705 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx705 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx801 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx801 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx802 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx802 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx803 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx803 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx805 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx805 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx810 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx810 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx9-generic -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx9-generic + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1152 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1152 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1200 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1200 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1201 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1201 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx12-generic -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx12-generic + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=amdgcnspirv -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-SPIRV,CLANG-OFFLOAD-PACKAGER-AMD-SPIRV -DDEV_STR=amdgcnspirv + +// TARGET-TRIPLE-AMD-GPU: clang{{.*}} "-triple" "amdgcn-amd-amdhsa" +// TARGET-TRIPLE-AMD-GPU: "-D__SYCL_TARGET_AMD_GPU_[[MAC_STR]]__" +// CLANG-OFFLOAD-PACKAGER-AMD: clang-offload-packager{{.*}} "--image={{.*}}triple=amdgcn-amd-amdhsa,arch=[[DEV_STR]],kind=sycl" + +// TARGET-TRIPLE-AMD-CPU: clang{{.*}} "-triple" "amdgcn-amd-amdhsa" +// TARGET-TRIPLE-AMD-CPU: "-target-cpu" "[[DEV_STR]]" +// CLANG-OFFLOAD-PACKAGER-AMD-CPU: clang-offload-packager{{.*}} "--image={{.*}}triple=amdgcn-amd-amdhsa,arch=[[DEV_STR]],kind=sycl" + +// TARGET-TRIPLE-AMD-SPIRV: clang{{.*}} "-triple" "spirv64-amd-amdhsa" +// CLANG-OFFLOAD-PACKAGER-AMD-SPIRV: clang-offload-packager{{.*}} "--image={{.*}}triple=spirv64-amd-amdhsa,arch=[[DEV_STR]],kind=sycl,{{.*}}" + +// TARGET-TRIPLE-AMD-GENERIC: clang{{.*}} "-triple" "spirv64-amd-amdhsa" +// CLANG-OFFLOAD-PACKAGER-AMD-GENERIC: clang-offload-packager{{.*}} "--image={{.*}}triple=spirv64-amd-amdhsa,arch=[[DEV_STR]],kind=sycl,{{.*}}" + From b7a3aec06366b37b4cca56f8de3003a348d05d78 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Fri, 20 Sep 2024 14:20:34 -0700 Subject: [PATCH 06/14] Update Intel GPU tests. --- clang/lib/Driver/Driver.cpp | 8 +- clang/lib/Driver/ToolChains/SYCL.cpp | 34 +++++ clang/lib/Driver/ToolChains/SYCL.h | 2 + ...pu.cpp => sycl-offload-arch-intel-cpu.cpp} | 15 +-- .../Driver/sycl-offload-arch-intel-gpu.cpp | 124 ++++++++++++++++++ 5 files changed, 167 insertions(+), 16 deletions(-) rename clang/test/Driver/{sycl-offload-arch-intelgpu.cpp => sycl-offload-arch-intel-cpu.cpp} (82%) create mode 100644 clang/test/Driver/sycl-offload-arch-intel-gpu.cpp diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a4da7bd9b1604..8481126af6e4c 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1333,9 +1333,13 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, getProcessorFromTargetID(*AMDTriple, Arch)))) { DerivedArchs[AMDTriple->getTriple()].insert(Arch); } else if (IsIntelCPUOffloadArch(StringToOffloadArchIntel(Arch))) { - DerivedArchs["spir64_x86_64"].insert(Arch); + DerivedArchs[MakeSYCLDeviceTriple("spir64_x86_64").getTriple()].insert( + Arch); } else if (IsIntelGPUOffloadArch(StringToOffloadArchIntel(Arch))) { - DerivedArchs["spir64_gen"].insert(Arch); + StringRef IntelGPUArch; + IntelGPUArch = mapIntelGPUArchName(Arch).data(); + DerivedArchs[MakeSYCLDeviceTriple("spir64_gen").getTriple()].insert( + IntelGPUArch); } else { Diag(clang::diag::err_drv_invalid_sycl_target) << Arch; return; diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 25cd8d67ac4af..394c66aa4b106 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -103,6 +103,40 @@ clang::driver::StringToOffloadArchIntel(llvm::StringRef ArchNameAsString) { return result->IntelArch; } +StringRef clang::driver::mapIntelGPUArchName(StringRef ArchName) { + StringRef Arch; + Arch = llvm::StringSwitch(ArchName) + .Case("bdw", "bdw") + .Case("skl", "skl") + .Case("kbl", "kbl") + .Case("cfl", "cfl") + .Cases("apl", "bxt", "apl") + .Case("glk", "glk") + .Case("whl", "whl") + .Case("aml", "aml") + .Case("cml", "cml") + .Cases("icllp", "icl", "icllp") + .Cases("ehl", "jsl", "ehl") + .Cases("tgllp", "tgl", "tgllp") + .Case("rkl", "rkl") + .Cases("adl_s", "rpl_s", "adl_s") + .Case("adl_p", "adl_p") + .Case("adl_n", "adl_n") + .Case("dg1", "dg1") + .Cases("acm_g10", "dg2_g10", "acm_g10") + .Cases("acm_g11", "dg2_g11", "acm_g11") + .Cases("acm_g12", "dg2_g12", "acm_g12") + .Case("pvc", "pvc") + .Case("pvc_vg", "pvc_vg") + .Cases("mtl_u", "mtl_s", "arl_u", "arl_s", "mtl_u") + .Case("mtl_h", "mtl_h") + .Case("arl_h", "arl_h") + .Case("bmg_g21", "bmg_g21") + .Case("lnl_m", "lnl_m") + .Default(""); + return Arch; +} + SYCLInstallationDetector::SYCLInstallationDetector(const Driver &D) : D(D), InstallationCandidates() { InstallationCandidates.emplace_back(D.Dir + "/.."); diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index b8425dab95a15..d5776a3943345 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -92,6 +92,8 @@ static inline bool IsIntelGPUOffloadArch(OffloadArchIntel Arch) { OffloadArchIntel StringToOffloadArchIntel(llvm::StringRef ArchNameAsString); +StringRef mapIntelGPUArchName(StringRef ArchName); + class SYCLInstallationDetector { public: SYCLInstallationDetector(const Driver &D); diff --git a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp b/clang/test/Driver/sycl-offload-arch-intel-cpu.cpp similarity index 82% rename from clang/test/Driver/sycl-offload-arch-intelgpu.cpp rename to clang/test/Driver/sycl-offload-arch-intel-cpu.cpp index 95c51f721862e..dbb71da6ed6e7 100644 --- a/clang/test/Driver/sycl-offload-arch-intelgpu.cpp +++ b/clang/test/Driver/sycl-offload-arch-intel-cpu.cpp @@ -1,5 +1,5 @@ /// Tests the behaviors of using -fsycl --offload-new-driver -// --offload-arch=. +// --offload-arch=. // SYCL AOT compilation to Intel CPUs using --offload-arch @@ -58,16 +58,3 @@ // TARGET-TRIPLE-CPU: "-D__SYCL_TARGET_INTEL_X86_64__" // CLANG-OFFLOAD-PACKAGER-CPU: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_x86_64-unknown-unknown,arch=[[DEV_STR]],kind=sycl" - -// SYCL AOT compilation to Intel GPUs using --offload-arch - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bdw %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=bdw -DMAC_STR=BDW - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cfl %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=cfl -DMAC_STR=CFL - -// TARGET-TRIPLE-GPU: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" -// TARGET-TRIPLE-GPU: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" -// CLANG-OFFLOAD-PACKAGER-GPU: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_gen-unknown-unknown,arch=[[DEV_STR]],kind=sycl" - diff --git a/clang/test/Driver/sycl-offload-arch-intel-gpu.cpp b/clang/test/Driver/sycl-offload-arch-intel-gpu.cpp new file mode 100644 index 0000000000000..df7873fade58f --- /dev/null +++ b/clang/test/Driver/sycl-offload-arch-intel-gpu.cpp @@ -0,0 +1,124 @@ +/// Tests the behaviors of using -fsycl --offload-new-driver +// --offload-arch=. + +// SYCL AOT compilation to Intel GPUs using --offload-arch + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bdw %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=bdw -DMAC_STR=BDW + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=skl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=skl -DMAC_STR=SKL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=kbl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=kbl -DMAC_STR=KBL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cfl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=cfl -DMAC_STR=CFL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=apl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=apl -DMAC_STR=APL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bxt %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=apl -DMAC_STR=APL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=glk %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=glk -DMAC_STR=GLK + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=whl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=whl -DMAC_STR=WHL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=aml %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=aml -DMAC_STR=AML + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=cml %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=cml -DMAC_STR=CML + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=icllp %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=icllp -DMAC_STR=ICLLP + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=icl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=icllp -DMAC_STR=ICLLP + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=ehl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=ehl -DMAC_STR=EHL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=jsl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=ehl -DMAC_STR=EHL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=tgllp %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=tgllp -DMAC_STR=TGLLP + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=tgl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=tgllp -DMAC_STR=TGLLP + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=rkl %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=rkl -DMAC_STR=RKL + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=adl_s %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=adl_s -DMAC_STR=ADL_S + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=rpl_s %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=adl_s -DMAC_STR=ADL_S + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=adl_p %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=adl_p -DMAC_STR=ADL_P + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=adl_n %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=adl_n -DMAC_STR=ADL_N + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=dg1 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=dg1 -DMAC_STR=DG1 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=acm_g10 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=acm_g10 -DMAC_STR=ACM_G10 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=dg2_g10 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=acm_g10 -DMAC_STR=ACM_G10 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=acm_g11 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=acm_g11 -DMAC_STR=ACM_G11 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=dg2_g11 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=acm_g11 -DMAC_STR=ACM_G11 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=acm_g12 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=acm_g12 -DMAC_STR=ACM_G12 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=dg2_g12 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU -DDEV_STR=acm_g12 -DMAC_STR=ACM_G12 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=pvc %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=pvc -DMAC_STR=PVC + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=pvc_vg %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=pvc_vg -DMAC_STR=PVC_VG + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=mtl_u %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=mtl_u -DMAC_STR=MTL_U + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=mtl_s %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=mtl_u -DMAC_STR=MTL_U + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=arl_u %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=mtl_u -DMAC_STR=MTL_U + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=arl_s %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=mtl_u -DMAC_STR=MTL_U + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=mtl_h %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=mtl_h -DMAC_STR=MTL_H + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=arl_h %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=arl_h -DMAC_STR=ARL_H + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=bmg_g21 %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=bmg_g21 -DMAC_STR=BMG_G21 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=lnl_m %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-GPU,CLANG-OFFLOAD-PACKAGER-GPU-OPTS -DDEV_STR=lnl_m -DMAC_STR=LNL_M + +// TARGET-TRIPLE-GPU: clang{{.*}} "-triple" "spir64_gen-unknown-unknown" +// TARGET-TRIPLE-GPU: "-D__SYCL_TARGET_INTEL_GPU_[[MAC_STR]]__" +// CLANG-OFFLOAD-PACKAGER-GPU: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_gen-unknown-unknown,arch=[[DEV_STR]],kind=sycl" +// CLANG-OFFLOAD-PACKAGER-GPU-OPTS: clang-offload-packager{{.*}} "--image={{.*}}triple=spir64_gen-unknown-unknown,arch=[[DEV_STR]],kind=sycl{{.*}}" + From aa544276a0119cd1af2a815fae9530078b4c3f5e Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Fri, 20 Sep 2024 16:00:09 -0700 Subject: [PATCH 07/14] Add NVidia GPU tests. --- .../Driver/sycl-offload-arch-nvidia-gpu.cpp | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 clang/test/Driver/sycl-offload-arch-nvidia-gpu.cpp diff --git a/clang/test/Driver/sycl-offload-arch-nvidia-gpu.cpp b/clang/test/Driver/sycl-offload-arch-nvidia-gpu.cpp new file mode 100644 index 0000000000000..dc6684bb646bf --- /dev/null +++ b/clang/test/Driver/sycl-offload-arch-nvidia-gpu.cpp @@ -0,0 +1,52 @@ +/// Tests the behaviors of using --offload-arch for offloading +// SYCL kernels to NVidia GPUs using --offload-new-driver. + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_50 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_50 -DMAC_STR=SM_50 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_52 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_52 -DMAC_STR=SM_52 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_53 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_53 -DMAC_STR=SM_53 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_60 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_60 -DMAC_STR=SM_60 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_61 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_61 -DMAC_STR=SM_61 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_62 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_62 -DMAC_STR=SM_62 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_70 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_70 -DMAC_STR=SM_70 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_72 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_72 -DMAC_STR=SM_72 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_75 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_75 -DMAC_STR=SM_75 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_80 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_80 -DMAC_STR=SM_80 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_86 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_86 -DMAC_STR=SM_86 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_87 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_87 -DMAC_STR=SM_87 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_89 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_89 -DMAC_STR=SM_89 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_90 -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_90 -DMAC_STR=SM_90 + +// RUN: %clangxx --offload-new-driver -fsycl --offload-arch=sm_90a -nocudalib -### %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=CLANG-OFFLOAD-PACKAGER-GPU,MACRO_NVIDIA -DDEV_STR=sm_90a -DMAC_STR=SM_90A + +// MACRO_NVIDIA: clang{{.*}} "-triple" "nvptx64-nvidia-cuda" +// MACRO_NVIDIA: "-D__SYCL_TARGET_NVIDIA_GPU_[[MAC_STR]]__" +// CLANG-OFFLOAD-PACKAGER-GPU: clang-offload-packager{{.*}} "--image={{.*}}triple=nvptx64-nvidia-cuda,arch=[[DEV_STR]],kind=sycl" + From 81fa084dcb6baf85001eb757e4635f7a3800e7b7 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Mon, 23 Sep 2024 12:25:43 -0700 Subject: [PATCH 08/14] Add diagnostic back. --- clang/lib/Driver/Driver.cpp | 26 ++++++++++---------------- clang/lib/Driver/ToolChains/SYCL.cpp | 9 +++++++++ clang/lib/Driver/ToolChains/SYCL.h | 5 +++++ 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 8481126af6e4c..ab46dc1f3ae86 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1087,6 +1087,16 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, C.getInputArgs().hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false) || hasSYCLDeviceOnly(C.getInputArgs()); + bool IsSYCLOffloadArchEnabled = + HasValidSYCLRuntime && + C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); + + if (IsSYCLOffloadArchEnabled && + !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, false)) { + Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); + return; + } Arg *SYCLfpga = C.getInputArgs().getLastArg(options::OPT_fintelfpga); @@ -7331,22 +7341,6 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, handleArguments(C, Args, Inputs, Actions); - bool HasValidSYCLRuntime = - C.getInputArgs().hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, - false) || - hasSYCLDeviceOnly(C.getInputArgs()); - bool IsSYCLOffloadArchEnabled = - HasValidSYCLRuntime && - C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); - /* - if (IsSYCLOffloadArchEnabled && - !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false)) { - Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); - return; - } - */ - // If '-fintelfpga' is passed, add '-fsycl' to the list of arguments const llvm::opt::OptTable &Opts = getOpts(); Arg *SYCLFpgaArg = C.getInputArgs().getLastArg(options::OPT_fintelfpga); diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 394c66aa4b106..9388c3fe319ae 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -27,11 +27,15 @@ using namespace clang::driver::tools; using namespace clang; using namespace llvm::opt; +// Struct that relates an AOT target value with +// Intel CPUs and GPUs. struct StringToOffloadArchIntelMap { const char *ArchName; OffloadArchIntel IntelArch; }; +// Mapping of valid --offload-arch values for Intel CPU and GPU +// AOT targets. static const StringToOffloadArchIntelMap StringToArchNamesMap[] = { {"skylake-avx512", OffloadArchIntel::SKYLAKEAVX512}, {"core-avx2", OffloadArchIntel::COREAVX2}, @@ -91,6 +95,8 @@ static const StringToOffloadArchIntelMap StringToArchNamesMap[] = { {"bmg_g21", OffloadArchIntel::BMG_G21}, {"lnl_m", OffloadArchIntel::LNL_M}}; +// Check if the user provided value for --offload-arch is a valid +// Intel CPU or Intel GPU target. OffloadArchIntel clang::driver::StringToOffloadArchIntel(llvm::StringRef ArchNameAsString) { auto result = std::find_if( @@ -103,6 +109,9 @@ clang::driver::StringToOffloadArchIntel(llvm::StringRef ArchNameAsString) { return result->IntelArch; } +// This is a mapping between the user provided --offload-arch value for Intel +// GPU targets and the spir64_gen device name accepted by OCLOC (the Intel GPU +// AOT compiler). StringRef clang::driver::mapIntelGPUArchName(StringRef ArchName) { StringRef Arch; Arch = llvm::StringSwitch(ArchName) diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index d5776a3943345..b70825cfb86a8 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -90,8 +90,13 @@ static inline bool IsIntelGPUOffloadArch(OffloadArchIntel Arch) { return Arch >= OffloadArchIntel::BDW && Arch <= OffloadArchIntel::LNL_M; } +// Mapping of valid --offload-arch values for Intel CPU and GPU +// AOT targets. OffloadArchIntel StringToOffloadArchIntel(llvm::StringRef ArchNameAsString); +// This is a mapping between the user provided --offload-arch value for Intel +// GPU targets and the spir64_gen device name accepted by OCLOC (the Intel GPU +// AOT compiler). StringRef mapIntelGPUArchName(StringRef ArchName); class SYCLInstallationDetector { From 8e8a0efe9277a72f4e0f2fd1e757aefc4e8bb196 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Mon, 23 Sep 2024 12:43:13 -0700 Subject: [PATCH 09/14] Resolve conflict. --- clang/lib/Driver/Driver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ab46dc1f3ae86..9c8beaa2f174e 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1086,7 +1086,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, bool HasValidSYCLRuntime = C.getInputArgs().hasFlag(options::OPT_fsycl, options::OPT_fno_sycl, false) || - hasSYCLDeviceOnly(C.getInputArgs()); + C.getInputArgs().hasArg(options::OPT_fsycl_device_only); bool IsSYCLOffloadArchEnabled = HasValidSYCLRuntime && C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); From ed5902f5c281964f7bd9b72dfe9a6c0e44ade106 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Wed, 25 Sep 2024 16:58:26 -0700 Subject: [PATCH 10/14] Fix failing test. --- clang/lib/Driver/Driver.cpp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 9c8beaa2f174e..e35ca8f2fdeef 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1091,13 +1091,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, HasValidSYCLRuntime && C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); - if (IsSYCLOffloadArchEnabled && - !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, false)) { - Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); - return; - } - Arg *SYCLfpga = C.getInputArgs().getLastArg(options::OPT_fintelfpga); // Make -fintelfpga flag imply -fsycl. @@ -1368,6 +1361,20 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, llvm::Triple SYCLTargetTriple(MakeSYCLDeviceTriple(Val.getKey())); std::string NormalizedName = SYCLTargetTriple.normalize(); + // SYCL offloading to Intel CPUs and Intel GPUs with ``--offload-arch`` + // is currently enabled only with ``--offload-new-driver`` option. + // Emit a diagnostic if ``--offload-arch`` is invoked without + // ``--offload-new driver`` option. + if (SYCLTargetTriple != NVPTXTriple && SYCLTargetTriple != AMDTriple) { + if (IsSYCLOffloadArchEnabled && + !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, + false)) { + Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); + return; + } + } + // Make sure we don't have a duplicate triple. auto Duplicate = FoundNormalizedTriples.find(NormalizedName); if (Duplicate != FoundNormalizedTriples.end()) { From c718ec911dde3a330a87fa0c90f4742ce80f834f Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Thu, 26 Sep 2024 10:12:08 -0700 Subject: [PATCH 11/14] Fix failing test. --- clang/lib/Driver/Driver.cpp | 28 ++++++------- .../Driver/sycl-offload-arch-amd-gpu-cpu.cpp | 39 ------------------- 2 files changed, 11 insertions(+), 56 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 9b4479282802c..ab46e3c1bfc72 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1078,10 +1078,6 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, false) || C.getInputArgs().hasArg(options::OPT_fsycl_device_only); - bool IsSYCLOffloadArchEnabled = - HasValidSYCLRuntime && - C.getInputArgs().hasArg(options::OPT_offload_arch_EQ); - Arg *SYCLfpga = C.getInputArgs().getLastArg(options::OPT_fintelfpga); // Make -fintelfpga flag imply -fsycl. @@ -1303,6 +1299,16 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, else if (HasValidSYCLRuntime && C.getInputArgs().hasArg(options::OPT_offload_arch_EQ) && !IsHIP && !IsCuda) { + // SYCL offloading to Intel CPUs and Intel GPUs with ``--offload-arch`` + // is currently enabled only with ``--offload-new-driver`` option. + // Emit a diagnostic if ``--offload-arch`` is invoked without + // ``--offload-new driver`` option. + if (!C.getInputArgs().hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, + false)) { + Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); + return; + } const ToolChain *HostTC = C.getSingleOffloadToolChain(); auto AMDTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs()); auto NVPTXTriple = getNVIDIAOffloadTargetTriple(*this, C.getInputArgs(), @@ -1365,19 +1371,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, llvm::Triple SYCLTargetTriple(MakeSYCLDeviceTriple(Val.getKey())); std::string NormalizedName = SYCLTargetTriple.normalize(); - // SYCL offloading to Intel CPUs and Intel GPUs with ``--offload-arch`` - // is currently enabled only with ``--offload-new-driver`` option. - // Emit a diagnostic if ``--offload-arch`` is invoked without - // ``--offload-new driver`` option. - if (SYCLTargetTriple != NVPTXTriple && SYCLTargetTriple != AMDTriple) { - if (IsSYCLOffloadArchEnabled && - !C.getInputArgs().hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, - false)) { - Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); - return; - } - } + // Make sure we don't have a duplicate triple. auto Duplicate = FoundNormalizedTriples.find(NormalizedName); diff --git a/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp b/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp index 93d718a8d2431..2ac61d8bb9a86 100644 --- a/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp +++ b/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp @@ -47,9 +47,6 @@ // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1013 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1013 -DMAC_STR=GFX1013 -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1013 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1013 -DMAC_STR=GFX1013 - // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1030 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1030 -DMAC_STR=GFX1030 @@ -91,15 +88,6 @@ // AMD CPUs -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx600 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx600 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx601 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx601 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx602 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx602 - // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx700 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx700 @@ -109,18 +97,6 @@ // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx702 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx702 -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx702 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx702 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx703 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx703 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx704 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx704 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx705 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx705 - // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx801 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx801 @@ -136,24 +112,12 @@ // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx810 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx810 -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx9-generic -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx9-generic - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1152 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1152 - // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1200 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1200 // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1201 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1201 -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx12-generic -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx12-generic - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=amdgcnspirv -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-SPIRV,CLANG-OFFLOAD-PACKAGER-AMD-SPIRV -DDEV_STR=amdgcnspirv - // TARGET-TRIPLE-AMD-GPU: clang{{.*}} "-triple" "amdgcn-amd-amdhsa" // TARGET-TRIPLE-AMD-GPU: "-D__SYCL_TARGET_AMD_GPU_[[MAC_STR]]__" // CLANG-OFFLOAD-PACKAGER-AMD: clang-offload-packager{{.*}} "--image={{.*}}triple=amdgcn-amd-amdhsa,arch=[[DEV_STR]],kind=sycl" @@ -165,6 +129,3 @@ // TARGET-TRIPLE-AMD-SPIRV: clang{{.*}} "-triple" "spirv64-amd-amdhsa" // CLANG-OFFLOAD-PACKAGER-AMD-SPIRV: clang-offload-packager{{.*}} "--image={{.*}}triple=spirv64-amd-amdhsa,arch=[[DEV_STR]],kind=sycl,{{.*}}" -// TARGET-TRIPLE-AMD-GENERIC: clang{{.*}} "-triple" "spirv64-amd-amdhsa" -// CLANG-OFFLOAD-PACKAGER-AMD-GENERIC: clang-offload-packager{{.*}} "--image={{.*}}triple=spirv64-amd-amdhsa,arch=[[DEV_STR]],kind=sycl,{{.*}}" - From 0f166790fcb92eb9fa7855a5ea815f8baa29c1f4 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Thu, 26 Sep 2024 13:46:23 -0700 Subject: [PATCH 12/14] clang format fix. --- clang/lib/Driver/Driver.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ab46e3c1bfc72..ff4b1ce337eb7 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1303,12 +1303,12 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, // is currently enabled only with ``--offload-new-driver`` option. // Emit a diagnostic if ``--offload-arch`` is invoked without // ``--offload-new driver`` option. - if (!C.getInputArgs().hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, - false)) { - Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); - return; - } + if (!C.getInputArgs().hasFlag(options::OPT_offload_new_driver, + options::OPT_no_offload_new_driver, + false)) { + Diag(clang::diag::err_drv_sycl_offload_arch_new_driver); + return; + } const ToolChain *HostTC = C.getSingleOffloadToolChain(); auto AMDTriple = getHIPOffloadTargetTriple(*this, C.getInputArgs()); auto NVPTXTriple = getNVIDIAOffloadTargetTriple(*this, C.getInputArgs(), From 34002a2e52b383a7be60c9902fc3a5472def6fcc Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Thu, 26 Sep 2024 15:28:11 -0700 Subject: [PATCH 13/14] Fix test. --- .../Driver/sycl-offload-arch-amd-gpu-cpu.cpp | 62 ++++++++----------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp b/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp index 2ac61d8bb9a86..55f847ba50b6d 100644 --- a/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp +++ b/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp @@ -1,7 +1,31 @@ -// SYCL AOT compilation to AMD GPUs and CPUs using --offload-arch +// SYCL AOT compilation to AMD GPUs using --offload-arch and --offload-new-driver // AMD GPUs +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx700 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx700 -DMAC_STR=GFX700 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx701 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx701 -DMAC_STR=GFX701 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx702 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx702 -DMAC_STR=GFX702 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx801 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx801 -DMAC_STR=GFX801 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx802 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx802 -DMAC_STR=GFX802 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx803 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx803 -DMAC_STR=GFX803 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx805 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx805 -DMAC_STR=GFX805 + +// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx810 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx810 -DMAC_STR=GFX810 + // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx900 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx900 -DMAC_STR=GFX900 @@ -86,46 +110,14 @@ // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1151 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ // RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1151 -DMAC_STR=GFX1151 -// AMD CPUs - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx700 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx700 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx701 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx701 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx702 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx702 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx801 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx801 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx802 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx802 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx803 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx803 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx805 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx805 - -// RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx810 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx810 - // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1200 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1200 +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1200 -DMAC_STR=GFX1200 // RUN: %clangxx -### --offload-new-driver -fsycl --offload-arch=gfx1201 -nogpulib -fno-sycl-libspirv %s 2>&1 | \ -// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-CPU,CLANG-OFFLOAD-PACKAGER-AMD-CPU -DDEV_STR=gfx1201 +// RUN: FileCheck %s --check-prefixes=TARGET-TRIPLE-AMD-GPU,CLANG-OFFLOAD-PACKAGER-AMD -DDEV_STR=gfx1201 -DMAC_STR=GFX1201 // TARGET-TRIPLE-AMD-GPU: clang{{.*}} "-triple" "amdgcn-amd-amdhsa" // TARGET-TRIPLE-AMD-GPU: "-D__SYCL_TARGET_AMD_GPU_[[MAC_STR]]__" // CLANG-OFFLOAD-PACKAGER-AMD: clang-offload-packager{{.*}} "--image={{.*}}triple=amdgcn-amd-amdhsa,arch=[[DEV_STR]],kind=sycl" -// TARGET-TRIPLE-AMD-CPU: clang{{.*}} "-triple" "amdgcn-amd-amdhsa" -// TARGET-TRIPLE-AMD-CPU: "-target-cpu" "[[DEV_STR]]" -// CLANG-OFFLOAD-PACKAGER-AMD-CPU: clang-offload-packager{{.*}} "--image={{.*}}triple=amdgcn-amd-amdhsa,arch=[[DEV_STR]],kind=sycl" - -// TARGET-TRIPLE-AMD-SPIRV: clang{{.*}} "-triple" "spirv64-amd-amdhsa" -// CLANG-OFFLOAD-PACKAGER-AMD-SPIRV: clang-offload-packager{{.*}} "--image={{.*}}triple=spirv64-amd-amdhsa,arch=[[DEV_STR]],kind=sycl,{{.*}}" From d14865dfe329282552bff4278057379441bccc99 Mon Sep 17 00:00:00 2001 From: srividya sundaram Date: Thu, 3 Oct 2024 16:28:17 -0700 Subject: [PATCH 14/14] Add AMD and NVidia Mapping in SYCL.cpp --- clang/lib/Driver/Driver.cpp | 8 +- clang/lib/Driver/ToolChains/SYCL.cpp | 185 ++++++++++++------ clang/lib/Driver/ToolChains/SYCL.h | 98 ++++++++-- ...-cpu.cpp => sycl-offload-arch-amd-gpu.cpp} | 0 4 files changed, 208 insertions(+), 83 deletions(-) rename clang/test/Driver/{sycl-offload-arch-amd-gpu-cpu.cpp => sycl-offload-arch-amd-gpu.cpp} (100%) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index ff4b1ce337eb7..0ada2df74b27c 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1338,17 +1338,17 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C, Archs.insert(Arch); } for (StringRef Arch : Archs) { - if (NVPTXTriple && IsNVIDIAOffloadArch(StringToOffloadArch( + if (NVPTXTriple && IsSYCLSupportedNVidiaGPUArch(StringToOffloadArchSYCL( getProcessorFromTargetID(*NVPTXTriple, Arch)))) { DerivedArchs[NVPTXTriple->getTriple()].insert(Arch); } else if (AMDTriple && - IsAMDOffloadArch(StringToOffloadArch( + IsSYCLSupportedAMDGPUArch(StringToOffloadArchSYCL( getProcessorFromTargetID(*AMDTriple, Arch)))) { DerivedArchs[AMDTriple->getTriple()].insert(Arch); - } else if (IsIntelCPUOffloadArch(StringToOffloadArchIntel(Arch))) { + } else if (IsSYCLSupportedIntelCPUArch(StringToOffloadArchSYCL(Arch))) { DerivedArchs[MakeSYCLDeviceTriple("spir64_x86_64").getTriple()].insert( Arch); - } else if (IsIntelGPUOffloadArch(StringToOffloadArchIntel(Arch))) { + } else if (IsSYCLSupportedIntelGPUArch(StringToOffloadArchSYCL(Arch))) { StringRef IntelGPUArch; IntelGPUArch = mapIntelGPUArchName(Arch).data(); DerivedArchs[MakeSYCLDeviceTriple("spir64_gen").getTriple()].insert( diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 86da283804f7b..a5b3e184b1620 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -29,83 +29,138 @@ using namespace llvm::opt; // Struct that relates an AOT target value with // Intel CPUs and GPUs. -struct StringToOffloadArchIntelMap { +struct StringToOffloadArchSYCLMap { const char *ArchName; - OffloadArchIntel IntelArch; + SYCLSupportedOffloadArchs IntelArch; }; -// Mapping of valid --offload-arch values for Intel CPU and GPU -// AOT targets. -static const StringToOffloadArchIntelMap StringToArchNamesMap[] = { - {"skylake-avx512", OffloadArchIntel::SKYLAKEAVX512}, - {"core-avx2", OffloadArchIntel::COREAVX2}, - {"corei7-avx", OffloadArchIntel::COREI7AVX}, - {"corei7", OffloadArchIntel::COREI7}, - {"westmere", OffloadArchIntel::WESTMERE}, - {"sandybridge", OffloadArchIntel::SANDYBRIDGE}, - {"ivybridge", OffloadArchIntel::IVYBRIDGE}, - {"broadwell", OffloadArchIntel::BROADWELL}, - {"coffeelake", OffloadArchIntel::COFFEELAKE}, - {"alderlake", OffloadArchIntel::ALDERLAKE}, - {"skylake", OffloadArchIntel::SKYLAKE}, - {"skx", OffloadArchIntel::SKX}, - {"cascadelake", OffloadArchIntel::CASCADELAKE}, - {"icelake-client", OffloadArchIntel::ICELAKECLIENT}, - {"icelake-server", OffloadArchIntel::ICELAKESERVER}, - {"sapphirerapids", OffloadArchIntel::SAPPHIRERAPIDS}, - {"graniterapids", OffloadArchIntel::GRANITERAPIDS}, +// Mapping of supported SYCL offloading architectures. +static const StringToOffloadArchSYCLMap StringToArchNamesMap[] = { + // Intel CPU mapping. + {"skylake-avx512", SYCLSupportedOffloadArchs::SKYLAKEAVX512}, + {"core-avx2", SYCLSupportedOffloadArchs::COREAVX2}, + {"corei7-avx", SYCLSupportedOffloadArchs::COREI7AVX}, + {"corei7", SYCLSupportedOffloadArchs::COREI7}, + {"westmere", SYCLSupportedOffloadArchs::WESTMERE}, + {"sandybridge", SYCLSupportedOffloadArchs::SANDYBRIDGE}, + {"ivybridge", SYCLSupportedOffloadArchs::IVYBRIDGE}, + {"broadwell", SYCLSupportedOffloadArchs::BROADWELL}, + {"coffeelake", SYCLSupportedOffloadArchs::COFFEELAKE}, + {"alderlake", SYCLSupportedOffloadArchs::ALDERLAKE}, + {"skylake", SYCLSupportedOffloadArchs::SKYLAKE}, + {"skx", SYCLSupportedOffloadArchs::SKX}, + {"cascadelake", SYCLSupportedOffloadArchs::CASCADELAKE}, + {"icelake-client", SYCLSupportedOffloadArchs::ICELAKECLIENT}, + {"icelake-server", SYCLSupportedOffloadArchs::ICELAKESERVER}, + {"sapphirerapids", SYCLSupportedOffloadArchs::SAPPHIRERAPIDS}, + {"graniterapids", SYCLSupportedOffloadArchs::GRANITERAPIDS}, // Intel GPU mapping. - {"bdw", OffloadArchIntel::BDW}, - {"skl", OffloadArchIntel::SKL}, - {"kbl", OffloadArchIntel::KBL}, - {"cfl", OffloadArchIntel::CFL}, - {"apl", OffloadArchIntel::APL}, - {"bxt", OffloadArchIntel::BXT}, - {"glk", OffloadArchIntel::GLK}, - {"whl", OffloadArchIntel::WHL}, - {"aml", OffloadArchIntel::AML}, - {"cml", OffloadArchIntel::CML}, - {"icllp", OffloadArchIntel::ICLLP}, - {"icl", OffloadArchIntel::ICL}, - {"ehl", OffloadArchIntel::EHL}, - {"jsl", OffloadArchIntel::JSL}, - {"tgllp", OffloadArchIntel::TGLLP}, - {"tgl", OffloadArchIntel::TGL}, - {"rkl", OffloadArchIntel::RKL}, - {"adl_s", OffloadArchIntel::ADL_S}, - {"rpl_s", OffloadArchIntel::RPL_S}, - {"adl_p", OffloadArchIntel::ADL_P}, - {"adl_n", OffloadArchIntel::ADL_N}, - {"dg1", OffloadArchIntel::DG1}, - {"acm_g10", OffloadArchIntel::ACM_G10}, - {"dg2_g10", OffloadArchIntel::DG2_G10}, - {"acm_g11", OffloadArchIntel::ACM_G11}, - {"dg2_g10", OffloadArchIntel::DG2_G10}, - {"dg2_g11", OffloadArchIntel::DG2_G11}, - {"acm_g12", OffloadArchIntel::ACM_G12}, - {"dg2_g12", OffloadArchIntel::DG2_G12}, - {"pvc", OffloadArchIntel::PVC}, - {"pvc_vg", OffloadArchIntel::PVC_VG}, - {"mtl_u", OffloadArchIntel::MTL_U}, - {"mtl_s", OffloadArchIntel::MTL_S}, - {"arl_u", OffloadArchIntel::ARL_U}, - {"arl_s", OffloadArchIntel::ARL_S}, - {"mtl_h", OffloadArchIntel::MTL_H}, - {"arl_h", OffloadArchIntel::ARL_H}, - {"bmg_g21", OffloadArchIntel::BMG_G21}, - {"lnl_m", OffloadArchIntel::LNL_M}}; + {"bdw", SYCLSupportedOffloadArchs::BDW}, + {"skl", SYCLSupportedOffloadArchs::SKL}, + {"kbl", SYCLSupportedOffloadArchs::KBL}, + {"cfl", SYCLSupportedOffloadArchs::CFL}, + {"apl", SYCLSupportedOffloadArchs::APL}, + {"bxt", SYCLSupportedOffloadArchs::BXT}, + {"glk", SYCLSupportedOffloadArchs::GLK}, + {"whl", SYCLSupportedOffloadArchs::WHL}, + {"aml", SYCLSupportedOffloadArchs::AML}, + {"cml", SYCLSupportedOffloadArchs::CML}, + {"icllp", SYCLSupportedOffloadArchs::ICLLP}, + {"icl", SYCLSupportedOffloadArchs::ICL}, + {"ehl", SYCLSupportedOffloadArchs::EHL}, + {"jsl", SYCLSupportedOffloadArchs::JSL}, + {"tgllp", SYCLSupportedOffloadArchs::TGLLP}, + {"tgl", SYCLSupportedOffloadArchs::TGL}, + {"rkl", SYCLSupportedOffloadArchs::RKL}, + {"adl_s", SYCLSupportedOffloadArchs::ADL_S}, + {"rpl_s", SYCLSupportedOffloadArchs::RPL_S}, + {"adl_p", SYCLSupportedOffloadArchs::ADL_P}, + {"adl_n", SYCLSupportedOffloadArchs::ADL_N}, + {"dg1", SYCLSupportedOffloadArchs::DG1}, + {"acm_g10", SYCLSupportedOffloadArchs::ACM_G10}, + {"dg2_g10", SYCLSupportedOffloadArchs::DG2_G10}, + {"acm_g11", SYCLSupportedOffloadArchs::ACM_G11}, + {"dg2_g10", SYCLSupportedOffloadArchs::DG2_G10}, + {"dg2_g11", SYCLSupportedOffloadArchs::DG2_G11}, + {"acm_g12", SYCLSupportedOffloadArchs::ACM_G12}, + {"dg2_g12", SYCLSupportedOffloadArchs::DG2_G12}, + {"pvc", SYCLSupportedOffloadArchs::PVC}, + {"pvc_vg", SYCLSupportedOffloadArchs::PVC_VG}, + {"mtl_u", SYCLSupportedOffloadArchs::MTL_U}, + {"mtl_s", SYCLSupportedOffloadArchs::MTL_S}, + {"arl_u", SYCLSupportedOffloadArchs::ARL_U}, + {"arl_s", SYCLSupportedOffloadArchs::ARL_S}, + {"mtl_h", SYCLSupportedOffloadArchs::MTL_H}, + {"arl_h", SYCLSupportedOffloadArchs::ARL_H}, + {"bmg_g21", SYCLSupportedOffloadArchs::BMG_G21}, + {"lnl_m", SYCLSupportedOffloadArchs::LNL_M}, + // AMD GPU Mapping + {"gfx700", SYCLSupportedOffloadArchs::GFX700}, + {"gfx701", SYCLSupportedOffloadArchs::GFX701}, + {"gfx702", SYCLSupportedOffloadArchs::GFX702}, + {"gfx801", SYCLSupportedOffloadArchs::GFX801}, + {"gfx802", SYCLSupportedOffloadArchs::GFX802}, + {"gfx803", SYCLSupportedOffloadArchs::GFX803}, + {"gfx805", SYCLSupportedOffloadArchs::GFX805}, + {"gfx810", SYCLSupportedOffloadArchs::GFX810}, + {"gfx900", SYCLSupportedOffloadArchs::GFX900}, + {"gfx902", SYCLSupportedOffloadArchs::GFX902}, + {"gfx904", SYCLSupportedOffloadArchs::GFX904}, + {"gfx906", SYCLSupportedOffloadArchs::GFX906}, + {"gfx908", SYCLSupportedOffloadArchs::GFX908}, + {"gfx909", SYCLSupportedOffloadArchs::GFX909}, + {"gfx90a", SYCLSupportedOffloadArchs::GFX90A}, + {"gfx90c", SYCLSupportedOffloadArchs::GFX90C}, + {"gfx940", SYCLSupportedOffloadArchs::GFX940}, + {"gfx941", SYCLSupportedOffloadArchs::GFX941}, + {"gfx942", SYCLSupportedOffloadArchs::GFX942}, + {"gfx1010", SYCLSupportedOffloadArchs::GFX1010}, + {"gfx1011", SYCLSupportedOffloadArchs::GFX1011}, + {"gfx1012", SYCLSupportedOffloadArchs::GFX1012}, + {"gfx1013", SYCLSupportedOffloadArchs::GFX1013}, + {"gfx1030", SYCLSupportedOffloadArchs::GFX1030}, + {"gfx1031", SYCLSupportedOffloadArchs::GFX1031}, + {"gfx1032", SYCLSupportedOffloadArchs::GFX1032}, + {"gfx1033", SYCLSupportedOffloadArchs::GFX1033}, + {"gfx1034", SYCLSupportedOffloadArchs::GFX1034}, + {"gfx1035", SYCLSupportedOffloadArchs::GFX1035}, + {"gfx1036", SYCLSupportedOffloadArchs::GFX1036}, + {"gfx1100", SYCLSupportedOffloadArchs::GFX1100}, + {"gfx1101", SYCLSupportedOffloadArchs::GFX1101}, + {"gfx1102", SYCLSupportedOffloadArchs::GFX1102}, + {"gfx1103", SYCLSupportedOffloadArchs::GFX1103}, + {"gfx1150", SYCLSupportedOffloadArchs::GFX1150}, + {"gfx1151", SYCLSupportedOffloadArchs::GFX1151}, + {"gfx1200", SYCLSupportedOffloadArchs::GFX1200}, + {"gfx1201", SYCLSupportedOffloadArchs::GFX1201}, + // NVidia GPU Mapping. + {"sm_50", SYCLSupportedOffloadArchs::SM_50}, + {"sm_52", SYCLSupportedOffloadArchs::SM_52}, + {"sm_53", SYCLSupportedOffloadArchs::SM_53}, + {"sm_60", SYCLSupportedOffloadArchs::SM_60}, + {"sm_61", SYCLSupportedOffloadArchs::SM_61}, + {"sm_62", SYCLSupportedOffloadArchs::SM_62}, + {"sm_70", SYCLSupportedOffloadArchs::SM_70}, + {"sm_72", SYCLSupportedOffloadArchs::SM_72}, + {"sm_75", SYCLSupportedOffloadArchs::SM_75}, + {"sm_80", SYCLSupportedOffloadArchs::SM_80}, + {"sm_86", SYCLSupportedOffloadArchs::SM_86}, + {"sm_87", SYCLSupportedOffloadArchs::SM_87}, + {"sm_89", SYCLSupportedOffloadArchs::SM_89}, + {"sm_90", SYCLSupportedOffloadArchs::SM_90}, + {"sm_90a", SYCLSupportedOffloadArchs::SM_90A}}; // Check if the user provided value for --offload-arch is a valid // Intel CPU or Intel GPU target. -OffloadArchIntel -clang::driver::StringToOffloadArchIntel(llvm::StringRef ArchNameAsString) { +SYCLSupportedOffloadArchs +clang::driver::StringToOffloadArchSYCL(llvm::StringRef ArchNameAsString) { auto result = std::find_if( std::begin(StringToArchNamesMap), std::end(StringToArchNamesMap), - [ArchNameAsString](const StringToOffloadArchIntelMap &map) { + [ArchNameAsString](const StringToOffloadArchSYCLMap &map) { return ArchNameAsString == map.ArchName; }); if (result == std::end(StringToArchNamesMap)) - return OffloadArchIntel::UNKNOWN; + return SYCLSupportedOffloadArchs::UNKNOWN; return result->IntelArch; } diff --git a/clang/lib/Driver/ToolChains/SYCL.h b/clang/lib/Driver/ToolChains/SYCL.h index 2dc91cb0bdd98..54c4b23d6309f 100644 --- a/clang/lib/Driver/ToolChains/SYCL.h +++ b/clang/lib/Driver/ToolChains/SYCL.h @@ -16,10 +16,10 @@ namespace clang { namespace driver { -// List of supported Intel values for CPUs -// and GPUs. -enum class OffloadArchIntel { - // CPUs +// List of architectures (Intel CPU, Intel GPU, AMD GPU, NVidia GPU) +// that support SYCL offloading. +enum class SYCLSupportedOffloadArchs { + // Intel CPUs UNKNOWN, SKYLAKEAVX512, COREAVX2, @@ -38,7 +38,7 @@ enum class OffloadArchIntel { ICELAKESERVER, SAPPHIRERAPIDS, GRANITERAPIDS, - // GPUs + // Intel GPUs BDW, SKL, KBL, @@ -76,23 +76,93 @@ enum class OffloadArchIntel { MTL_H, ARL_H, BMG_G21, - LNL_M + LNL_M, + // AMD GPUs + GFX700, + GFX701, + GFX702, + GFX801, + GFX802, + GFX803, + GFX805, + GFX810, + GFX900, + GFX902, + GFX904, + GFX906, + GFX908, + GFX909, + GFX90A, + GFX90C, + GFX940, + GFX941, + GFX942, + GFX1010, + GFX1011, + GFX1012, + GFX1013, + GFX1030, + GFX1031, + GFX1032, + GFX1033, + GFX1034, + GFX1035, + GFX1036, + GFX1100, + GFX1101, + GFX1102, + GFX1103, + GFX1150, + GFX1151, + GFX1200, + GFX1201, + // NVidia GPUs. + SM_50, + SM_52, + SM_53, + SM_60, + SM_61, + SM_62, + SM_70, + SM_72, + SM_75, + SM_80, + SM_86, + SM_87, + SM_89, + SM_90, + SM_90A }; +// Check if the given Arch value is a valid SYCL supported AMD GPU. +static inline bool IsSYCLSupportedAMDGPUArch(SYCLSupportedOffloadArchs Arch) { + return Arch >= SYCLSupportedOffloadArchs::GFX700 && + Arch <= SYCLSupportedOffloadArchs::GFX1201; +} + +// Check if the given Arch value is a valid SYCL supported NVidia GPU. +static inline bool +IsSYCLSupportedNVidiaGPUArch(SYCLSupportedOffloadArchs Arch) { + return Arch >= SYCLSupportedOffloadArchs::SM_50 && + Arch <= SYCLSupportedOffloadArchs::SM_90A; +} + // Check if the given Arch value is a valid Intel CPU. -static inline bool IsIntelCPUOffloadArch(OffloadArchIntel Arch) { - return Arch >= OffloadArchIntel::SKYLAKEAVX512 && - Arch < OffloadArchIntel::BDW; +static inline bool IsSYCLSupportedIntelCPUArch(SYCLSupportedOffloadArchs Arch) { + return Arch >= SYCLSupportedOffloadArchs::SKYLAKEAVX512 && + Arch < SYCLSupportedOffloadArchs::BDW; } // Check if the given Arch value is a valid Intel GPU. -static inline bool IsIntelGPUOffloadArch(OffloadArchIntel Arch) { - return Arch >= OffloadArchIntel::BDW && Arch <= OffloadArchIntel::LNL_M; +static inline bool IsSYCLSupportedIntelGPUArch(SYCLSupportedOffloadArchs Arch) { + return Arch >= SYCLSupportedOffloadArchs::BDW && + Arch <= SYCLSupportedOffloadArchs::LNL_M; } -// Mapping of valid --offload-arch values for Intel CPU and GPU -// AOT targets. -OffloadArchIntel StringToOffloadArchIntel(llvm::StringRef ArchNameAsString); +// Check if the user provided value for --offload-arch is a valid +// Intel CPU or Intel GPU target. +SYCLSupportedOffloadArchs +StringToOffloadArchSYCL(llvm::StringRef ArchNameAsString); // This is a mapping between the user provided --offload-arch value for Intel // GPU targets and the spir64_gen device name accepted by OCLOC (the Intel GPU diff --git a/clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp b/clang/test/Driver/sycl-offload-arch-amd-gpu.cpp similarity index 100% rename from clang/test/Driver/sycl-offload-arch-amd-gpu-cpu.cpp rename to clang/test/Driver/sycl-offload-arch-amd-gpu.cpp