From 27512df4eede05cf9aa24970d2bcc7b90533b8b8 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 31 Dec 2024 14:59:17 +0800 Subject: [PATCH 01/10] [SYCL] Select Native Bfloat16 devicelib in AOT Signed-off-by: jinge90 --- clang/lib/Driver/ToolChains/SYCL.cpp | 55 +++++++++++++++++++--------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index ed254e01bd41e..b5c321a398263 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -13,11 +13,12 @@ #include "clang/Driver/DriverDiagnostic.h" #include "clang/Driver/InputInfo.h" #include "clang/Driver/Options.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/Option/Option.h" +#include "llvm/SYCLLowerIR/DeviceConfigFile.hpp" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" -#include "llvm/SYCLLowerIR/DeviceConfigFile.hpp" #include #include @@ -299,6 +300,10 @@ bool SYCL::shouldDoPerObjectFileLinking(const Compilation &C) { // Return whether to use native bfloat16 library. static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, bool &UseNative) { + + static llvm::SmallSet GPUArchsWithNBF16{ + "intel_gpu_pvc", "intel_gpu_acm_g10", "intel_gpu_acm_g11", + "intel_gpu_acm_g12", "intel_gpu_bmg_g21"}; const llvm::opt::ArgList &Args = C.getArgs(); bool NeedLibs = false; @@ -324,32 +329,47 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, } } - UseNative = false; - - // Check for intel_gpu_pvc as the target - if (Arg *SYCLTarget = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { - if (SYCLTarget->getValues().size() == 1) { - StringRef SYCLTargetStr = SYCLTarget->getValue(); - if (SYCLTargetStr == "intel_gpu_pvc") - UseNative = true; - } - } - - auto checkBF = [](StringRef Device) { - return Device.starts_with("pvc") || Device.starts_with("ats"); - }; + // We need to select fallback/native bfloat16 devicelib in AOT compilation + // targetting for Intel GPU devices. Users have 2 ways to apply AOT, + // 1). clang++ -fsycl -fsycl-targets=spir64_gen -Xs "-device pvc,...," + // 2). clang++ -fsycl -fsycl-targets=intel_gpu_pvc,... + // We assume that users will only apply either 1) or 2) and won't mix the + // 2 ways in their compiling command. std::string Params; for (const auto &Arg : TargArgs) { Params += " "; Params += Arg; } + + auto checkBF = [](StringRef Device) { + return Device.starts_with("pvc") || Device.starts_with("ats") || + Device.starts_with("dg2") || Device.starts_with("bmg"); + }; + size_t DevicesPos = Params.find("-device "); - if (!UseNative && DevicesPos != std::string::npos) { + // "-device xxx" is used to specify AOT target device. + if (DevicesPos != std::string::npos) { UseNative = true; std::istringstream Devices(Params.substr(DevicesPos + 8)); for (std::string S; std::getline(Devices, S, ',');) UseNative &= checkBF(S); + return NeedLibs; + } else { + // -fsycl-targets=intel_gpu_xxx is used to specify AOT target device. + // Multiple Intel GPU devices can be specified, native bfloat16 devicelib + // can be involved only when all GPU deivces specified support native + // bfloat16 native conversion. + UseNative = true; + if (Arg *SYCLTarget = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { + for (auto TargetsV : SYCLTarget->getValues()) { + if (!GPUArchsWithNBF16.contains(StringRef(TargetsV))) { + UseNative = false; + break; + } + } + } + return NeedLibs; } } return NeedLibs; @@ -505,7 +525,8 @@ SYCL::getDeviceLibraries(const Compilation &C, const llvm::Triple &TargetTriple, } if (TargetTriple.isNVPTX() && IgnoreSingleLibs) - LibraryList.push_back(Args.MakeArgString("devicelib-nvptx64-nvidia-cuda.bc")); + LibraryList.push_back( + Args.MakeArgString("devicelib-nvptx64-nvidia-cuda.bc")); if (TargetTriple.isAMDGCN() && IgnoreSingleLibs) LibraryList.push_back(Args.MakeArgString("devicelib-amdgcn-amd-amdhsa.bc")); From 223f5e06cf7723b2fc9eefbb0d6756b9a9c9eced Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 31 Dec 2024 21:49:01 +0800 Subject: [PATCH 02/10] [SYCL][Driver] Select Native bfloat16 when all AOT targets specified support native bfloat16 conversion --- clang/lib/Driver/ToolChains/SYCL.cpp | 9 +- .../test/Driver/sycl-device-lib-bfloat16.cpp | 90 +++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 691f962eb7dac..6a280309467e3 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -347,6 +347,11 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, Device.starts_with("dg2") || Device.starts_with("bmg"); }; + auto checkSpirvJIT = [](StringRef Target) { + return Target.starts_with("spir64-") || Target.starts_with("spirv64-") || + (Target == "spir64") || (Target == "spirv64"); + }; + size_t DevicesPos = Params.find("-device "); // "-device xxx" is used to specify AOT target device. if (DevicesPos != std::string::npos) { @@ -361,9 +366,11 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, // can be involved only when all GPU deivces specified support native // bfloat16 native conversion. UseNative = true; + if (Arg *SYCLTarget = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { for (auto TargetsV : SYCLTarget->getValues()) { - if (!GPUArchsWithNBF16.contains(StringRef(TargetsV))) { + if (!checkSpirvJIT(StringRef(TargetsV)) && + !GPUArchsWithNBF16.contains(StringRef(TargetsV))) { UseNative = false; break; } diff --git a/clang/test/Driver/sycl-device-lib-bfloat16.cpp b/clang/test/Driver/sycl-device-lib-bfloat16.cpp index 097f1754ba3c5..0960c0b8b6e1c 100644 --- a/clang/test/Driver/sycl-device-lib-bfloat16.cpp +++ b/clang/test/Driver/sycl-device-lib-bfloat16.cpp @@ -68,6 +68,79 @@ // RUN: --sysroot=%S/Inputs/SYCL -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK + +// Test test AOT-DG2 compilation uses native libs + native libs. +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE + +// Test test AOT-PVC + AOT-DG2 compilation uses native libs + native libs. +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NATIVE + +// Test test AOT-PVC + AOT-DG1 compilation uses native libs + native libs. +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK + + +// Test test AOT-PVC + JIT compilation uses native libs + no libs +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spirv64 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64-unknown-unknown \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spirv64-unknown-unknown \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE + +// Test test AOT-DG1 + JIT compilation uses native libs + no libs +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,spir64 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,spirv64 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,spir64-unknown-unknown \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,spirv64-unknown-unknown \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE + +// Test test AOT-PVC + JIT compilation + AOT-DG2 uses native libs + no libs + native libs +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64,intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE-NATIVE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spirv64,intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE-NATIVE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64-unknown-unknown,intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE-NATIVE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spirv64-unknown-unknown,intel_gpu_acm_g10 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE-NATIVE + +// Test test AOT-PVC + JIT compilation + AOT-DG1 uses fallback libs + no libs + fallback libs +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64,intel_gpu_dg1 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE-FALLBACK +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spirv64,intel_gpu_dg1 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE-FALLBACK +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64-unknown-unknown,intel_gpu_dg1 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE-FALLBACK +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spirv64-unknown-unknown,intel_gpu_dg1 \ +// RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ +// RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE-FALLBACK + // BFLOAT16-NOT: llvm-link{{.*}} "{{.*}}libsycl-{{fallback|native}}-bfloat16.bc" // BFLOAT16-NATIVE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" @@ -85,3 +158,20 @@ // BFLOAT16-FALLBACK-FALLBACK: llvm-link{{.*}} "{{.*}}libsycl-fallback-bfloat16.bc" // BFLOAT16-FALLBACK-FALLBACK: "{{.*}}libsycl-fallback-bfloat16.bc" + +// BFLOAT16-NATIVE-NATIVE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" +// BFLOAT16-NATIVE-NATIVE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" + +// BFLOAT16-NATIVE-NONE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" +// BFLOAT16-NATIVE-NONE-NOT: llvm-link{{.*}} "{{.*}}-bfloat16.bc" + +// BFLOAT16-FALLBACK-NONE: llvm-link{{.*}} "{{.*}}libsycl-fallback-bfloat16.bc" +// BFLOAT16-FALLBACK-NONE-NOT: llvm-link{{.*}} "{{.*}}-bfloat16.bc" + +// BFLOAT16-NATIVE-NONE-NATIVE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" +// BFLOAT16-NATIVE-NONE-NATIVE-NOT: llvm-link{{.*}} "{{.*}}-bfloat16.bc" +// BFLOAT16-NATIVE-NONE-NATIVE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" + +// BFLOAT16-FALLBACK-NONE-FALLBACK: llvm-link{{.*}} "{{.*}}libsycl-fallback-bfloat16.bc" +// BFLOAT16-FALLBACK-NONE-FALLBACK-NOT: llvm-link{{.*}} "{{.*}}-bfloat16.bc" +// BFLOAT16-FALLBACK-NONE-FALLBACK: llvm-link{{.*}} "{{.*}}libsycl-fallback-bfloat16.bc" From 21fb49e7cf26f3a9ebcee3159f10c0003f7b95ff Mon Sep 17 00:00:00 2001 From: jinge90 Date: Fri, 3 Jan 2025 13:39:45 +0800 Subject: [PATCH 03/10] Update clang/test/Driver/sycl-device-lib-bfloat16.cpp Co-authored-by: Michael Toguchi --- clang/test/Driver/sycl-device-lib-bfloat16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-device-lib-bfloat16.cpp b/clang/test/Driver/sycl-device-lib-bfloat16.cpp index 0960c0b8b6e1c..41449e57505c7 100644 --- a/clang/test/Driver/sycl-device-lib-bfloat16.cpp +++ b/clang/test/Driver/sycl-device-lib-bfloat16.cpp @@ -79,7 +79,7 @@ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NATIVE -// Test test AOT-PVC + AOT-DG1 compilation uses native libs + native libs. +// Test AOT-PVC + AOT-DG1 compilation uses native libs + native libs. // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,intel_gpu_acm_g10 \ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK From b1fe3b349e0d054521a8c578f80677d72f55a7ec Mon Sep 17 00:00:00 2001 From: jinge90 Date: Fri, 3 Jan 2025 13:39:55 +0800 Subject: [PATCH 04/10] Update clang/test/Driver/sycl-device-lib-bfloat16.cpp Co-authored-by: Michael Toguchi --- clang/test/Driver/sycl-device-lib-bfloat16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-device-lib-bfloat16.cpp b/clang/test/Driver/sycl-device-lib-bfloat16.cpp index 41449e57505c7..43f9fc47c80de 100644 --- a/clang/test/Driver/sycl-device-lib-bfloat16.cpp +++ b/clang/test/Driver/sycl-device-lib-bfloat16.cpp @@ -85,7 +85,7 @@ // RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK -// Test test AOT-PVC + JIT compilation uses native libs + no libs +// Test AOT-PVC + JIT compilation uses native libs + no libs // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64 \ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NONE From 3c8b6d7920a02f32faa0da610ae020ad410e92d3 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Fri, 3 Jan 2025 13:40:19 +0800 Subject: [PATCH 05/10] Update clang/test/Driver/sycl-device-lib-bfloat16.cpp Co-authored-by: Michael Toguchi --- clang/test/Driver/sycl-device-lib-bfloat16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-device-lib-bfloat16.cpp b/clang/test/Driver/sycl-device-lib-bfloat16.cpp index 43f9fc47c80de..71490ebfae619 100644 --- a/clang/test/Driver/sycl-device-lib-bfloat16.cpp +++ b/clang/test/Driver/sycl-device-lib-bfloat16.cpp @@ -69,7 +69,7 @@ // RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK -// Test test AOT-DG2 compilation uses native libs + native libs. +// Test AOT-DG2 compilation uses native libs + native libs. // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_acm_g10 \ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE From d6dd9e2bcc16af6bb1cb292d1a3e8b26a6fde37c Mon Sep 17 00:00:00 2001 From: jinge90 Date: Fri, 3 Jan 2025 13:40:29 +0800 Subject: [PATCH 06/10] Update clang/test/Driver/sycl-device-lib-bfloat16.cpp Co-authored-by: Michael Toguchi --- clang/test/Driver/sycl-device-lib-bfloat16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/test/Driver/sycl-device-lib-bfloat16.cpp b/clang/test/Driver/sycl-device-lib-bfloat16.cpp index 71490ebfae619..36222e5971d2a 100644 --- a/clang/test/Driver/sycl-device-lib-bfloat16.cpp +++ b/clang/test/Driver/sycl-device-lib-bfloat16.cpp @@ -74,7 +74,7 @@ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE -// Test test AOT-PVC + AOT-DG2 compilation uses native libs + native libs. +// Test AOT-PVC + AOT-DG2 compilation uses native libs + native libs. // RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,intel_gpu_acm_g10 \ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NATIVE From 45ae7e4394d2cc5e76a163ba6bb09e00c8f53d81 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Sun, 12 Jan 2025 00:20:09 +0800 Subject: [PATCH 07/10] Support mix use of '-device xxx' and fsycl-targets= Signed-off-by: jinge90 --- clang/lib/Driver/ToolChains/SYCL.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 6a280309467e3..baead14d85100 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -333,8 +333,8 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, // targetting for Intel GPU devices. Users have 2 ways to apply AOT, // 1). clang++ -fsycl -fsycl-targets=spir64_gen -Xs "-device pvc,...," // 2). clang++ -fsycl -fsycl-targets=intel_gpu_pvc,... - // We assume that users will only apply either 1) or 2) and won't mix the - // 2 ways in their compiling command. + // 3). clang++ -fsycl -fsycl-targets=spir64_gen,intel_gpu_pvc,... + // -Xsycl-target-backend=spir64_gen "-device dg2" std::string Params; for (const auto &Arg : TargArgs) { @@ -353,13 +353,34 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, }; size_t DevicesPos = Params.find("-device "); - // "-device xxx" is used to specify AOT target device. + // "-device xxx" is used to specify AOT target device, so user must apply + // -Xs "-device xxx" or -Xsycl-target-backend=spir64_gen "-device xxx" if (DevicesPos != std::string::npos) { UseNative = true; std::istringstream Devices(Params.substr(DevicesPos + 8)); for (std::string S; std::getline(Devices, S, ',');) UseNative &= checkBF(S); + + // When "-device XXX" is applied to speicify GPU type, user can still + // add -fsycl-targets=intel_gpu_pvc..., native bfloat16 devicelib can + // only be linked when all GPU types specified support. + // We need to filter CPU and FPGA target here and only focus on GPU + // device. + if (Arg *SYCLTarget = Args.getLastArg(options::OPT_fsycl_targets_EQ)) { + for (auto TargetsV : SYCLTarget->getValues()) { + if (!checkSpirvJIT(StringRef(TargetsV)) && + !StringRef(TargetsV).starts_with("spir64_gen") && + !StringRef(TargetsV).starts_with("spir64_x86_64") && + !StringRef(TargetsV).starts_with("spir64_fpga") && + !GPUArchsWithNBF16.contains(StringRef(TargetsV))) { + UseNative = false; + break; + } + } + } + return NeedLibs; + } else { // -fsycl-targets=intel_gpu_xxx is used to specify AOT target device. // Multiple Intel GPU devices can be specified, native bfloat16 devicelib From b3b2a388e97ebb67085dff4cf0712c017ab4f2a1 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Fri, 17 Jan 2025 16:07:31 +0800 Subject: [PATCH 08/10] Update clang/lib/Driver/ToolChains/SYCL.cpp Co-authored-by: Michael Toguchi --- clang/lib/Driver/ToolChains/SYCL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index baead14d85100..60ad5ca7104b7 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -361,7 +361,7 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, for (std::string S; std::getline(Devices, S, ',');) UseNative &= checkBF(S); - // When "-device XXX" is applied to speicify GPU type, user can still + // When "-device XXX" is applied to specify GPU type, user can still // add -fsycl-targets=intel_gpu_pvc..., native bfloat16 devicelib can // only be linked when all GPU types specified support. // We need to filter CPU and FPGA target here and only focus on GPU From 23dc1deadf6723dbf59569f68d951f47df0f6c6d Mon Sep 17 00:00:00 2001 From: jinge90 Date: Mon, 20 Jan 2025 11:25:33 +0800 Subject: [PATCH 09/10] add test for -Xsycl-target-backend Signed-off-by: jinge90 --- clang/test/Driver/sycl-device-lib-bfloat16.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/clang/test/Driver/sycl-device-lib-bfloat16.cpp b/clang/test/Driver/sycl-device-lib-bfloat16.cpp index 36222e5971d2a..43993fbe7c021 100644 --- a/clang/test/Driver/sycl-device-lib-bfloat16.cpp +++ b/clang/test/Driver/sycl-device-lib-bfloat16.cpp @@ -141,6 +141,22 @@ // RUN: --sysroot=%S/Inputs/SYCL %s -### 2>&1 \ // RUN: | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-NONE-FALLBACK +// Test test AOT-PVC + AOT-DG1 specified via different options, uses fallback libs +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64_gen \ +// RUN: --sysroot=%S/Inputs/SYCL -Xsycl-target-backend=spir64_gen "-device dg1" \ +// RUN: %s -### 2>&1 | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_dg1,spir64_gen \ +// RUN: --sysroot=%S/Inputs/SYCL -Xsycl-target-backend=spir64_gen "-device pvc" \ +// RUN: %s -### 2>&1 | FileCheck %s -check-prefix=BFLOAT16-FALLBACK-FALLBACK + +// Test test AOT-PVC + AOT-BMG specified via different options, uses native libs +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_bmg_g21,spir64_gen \ +// RUN: --sysroot=%S/Inputs/SYCL -Xsycl-target-backend=spir64_gen "-device pvc" \ +// RUN: %s -### 2>&1 | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NATIVE +// RUN: %clangxx -fsycl -fsycl-targets=intel_gpu_pvc,spir64_gen \ +// RUN: --sysroot=%S/Inputs/SYCL -Xsycl-target-backend=spir64_gen "-device bmg-g21-a0" \ +// RUN: %s -### 2>&1 | FileCheck %s -check-prefix=BFLOAT16-NATIVE-NATIVE + // BFLOAT16-NOT: llvm-link{{.*}} "{{.*}}libsycl-{{fallback|native}}-bfloat16.bc" // BFLOAT16-NATIVE: llvm-link{{.*}} "{{.*}}libsycl-native-bfloat16.bc" From c049ddd022c150d338a81d0adf4f862a55b08c91 Mon Sep 17 00:00:00 2001 From: jinge90 Date: Tue, 21 Jan 2025 16:20:46 +0800 Subject: [PATCH 10/10] add intel_gpu_dg2_* Signed-off-by: jinge90 --- clang/lib/Driver/ToolChains/SYCL.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/SYCL.cpp b/clang/lib/Driver/ToolChains/SYCL.cpp index 60ad5ca7104b7..4c2aa9938cad9 100644 --- a/clang/lib/Driver/ToolChains/SYCL.cpp +++ b/clang/lib/Driver/ToolChains/SYCL.cpp @@ -302,8 +302,9 @@ static bool selectBfloatLibs(const llvm::Triple &Triple, const Compilation &C, bool &UseNative) { static llvm::SmallSet GPUArchsWithNBF16{ - "intel_gpu_pvc", "intel_gpu_acm_g10", "intel_gpu_acm_g11", - "intel_gpu_acm_g12", "intel_gpu_bmg_g21"}; + "intel_gpu_pvc", "intel_gpu_acm_g10", "intel_gpu_acm_g11", + "intel_gpu_acm_g12", "intel_gpu_dg2_10", "intel_gpu_dg2_11", + "intel_dg2_g12", "intel_gpu_bmg_g21"}; const llvm::opt::ArgList &Args = C.getArgs(); bool NeedLibs = false;