Skip to content

Commit 4240ef0

Browse files
[SYCL] Add check for valid SYCL triple for NVidia GPUs. (#14673)
`-fsycl-targets` enables AOT compilations for specified device targets. For NVidia GPU targets, per [oneAPI DPCPP documentation](https://intel.github.io/llvm-docs/UsersManual.html#generic-options), the valid target triple string is `nvptx64-nvidia-cuda` This PR, checks if the target triple string provided for NVidia targets is a valid one. **Example**: ``` clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda-invalidEnv syclfile.cpp clang++: error: SYCL target is invalid: 'nvptx64-nvidia-cuda-invalidEnv' ```
1 parent b38ec2a commit 4240ef0

File tree

5 files changed

+32
-8
lines changed

5 files changed

+32
-8
lines changed

clang/lib/Driver/Driver.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -806,8 +806,10 @@ Driver::OpenMPRuntimeKind Driver::getOpenMPRuntime(const ArgList &Args) const {
806806
}
807807

808808
static bool isValidSYCLTriple(llvm::Triple T) {
809-
// NVPTX is valid for SYCL.
810-
if (T.isNVPTX())
809+
// 'nvptx64-nvidia-cuda' is the valid SYCL triple for NVidia GPUs.
810+
if (T.getArch() == llvm::Triple::nvptx64 &&
811+
T.getVendor() == llvm::Triple::NVIDIA &&
812+
T.getOS() == llvm::Triple::CUDA && !T.hasEnvironment())
811813
return true;
812814

813815
// AMDGCN is valid for SYCL
@@ -2407,11 +2409,14 @@ void Driver::PrintHelp(bool ShowHidden) const {
24072409
llvm::Triple Driver::MakeSYCLDeviceTriple(StringRef TargetArch) const {
24082410
SmallVector<StringRef, 5> SYCLAlias = {
24092411
"spir", "spir64", "spir64_fpga", "spir64_x86_64",
2410-
"spir64_gen", "spirv32", "spirv64"};
2412+
"spir64_gen", "spirv32", "spirv64", "nvptx64"};
24112413
if (std::find(SYCLAlias.begin(), SYCLAlias.end(), TargetArch) !=
24122414
SYCLAlias.end()) {
24132415
llvm::Triple TT;
24142416
TT.setArchName(TargetArch);
2417+
// Return the full SYCL target triple string for NVidia GPU targets.
2418+
if (TT.getArch() == llvm::Triple::nvptx64)
2419+
return llvm::Triple("nvptx64-nvidia-cuda");
24152420
TT.setVendor(llvm::Triple::UnknownVendor);
24162421
TT.setOS(llvm::Triple::UnknownOS);
24172422
return TT;

clang/test/Driver/sycl-libspirv.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// UNSUPPORTED: system-windows
33

44
// RUN: %clangxx -### -std=c++11 -target x86_64-unknown-linux-gnu -fsycl \
5-
// RUN: -fsycl-targets=nvptx64-nvidia-nvcl --cuda-path=%S/Inputs/CUDA/usr/local/cuda \
5+
// RUN: -fsycl-targets=nvptx64-nvidia-cuda --cuda-path=%S/Inputs/CUDA/usr/local/cuda \
66
// RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/libspirv.bc %s 2>&1 \
77
// RUN: | FileCheck %s
88
// CHECK: {{.*}} "-mlink-builtin-bitcode" "{{.*}}libspirv.bc" {{.*}}

clang/test/Driver/sycl-offload-old-model.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@
659659
/// ###########################################################################
660660

661661
// Check if valid bound arch behaviour occurs when compiling for spir-v,nvidia-gpu, and amd-gpu
662-
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --no-offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64,nvptx-nvidia-cuda,amdgcn-amd-amdhsa -Xsycl-target-backend=nvptx-nvidia-cuda --offload-arch=sm_75 -Xsycl-target-backend=amdgcn-amd-amdhsa --offload-arch=gfx908 -ccc-print-phases %s 2>&1 \
662+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --no-offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64,nvptx64-nvidia-cuda,amdgcn-amd-amdhsa -Xsycl-target-backend=nvptx64-nvidia-cuda --offload-arch=sm_75 -Xsycl-target-backend=amdgcn-amd-amdhsa --offload-arch=gfx908 -ccc-print-phases %s 2>&1 \
663663
// RUN: | FileCheck -check-prefix=CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD %s
664664
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 0: input, "[[INPUT:.+\.c]]", c++, (host-sycl)
665665
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 1: preprocessor, {0}, c++-cpp-output, (host-sycl)
@@ -692,7 +692,7 @@
692692
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 28: foreach, {24, 27}, cuda-fatbin, (device-sycl, sm_75)
693693
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 29: file-table-tform, {23, 28}, tempfiletable, (device-sycl, sm_75)
694694
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 30: clang-offload-wrapper, {29}, object, (device-sycl, sm_75)
695-
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 31: offload, "device-sycl (nvptx-nvidia-cuda:sm_75)" {30}, object
695+
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 31: offload, "device-sycl (nvptx64-nvidia-cuda:sm_75)" {30}, object
696696
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 32: linker, {4}, ir, (device-sycl, gfx908)
697697
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 33: sycl-post-link, {32}, ir, (device-sycl, gfx908)
698698
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 34: file-table-tform, {33}, ir, (device-sycl, gfx908)

clang/test/Driver/sycl-offload.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@
390390
/// ###########################################################################
391391

392392
// Check if valid bound arch behaviour occurs when compiling for spir-v,nvidia-gpu, and amd-gpu
393-
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64,nvptx-nvidia-cuda,amdgcn-amd-amdhsa -Xsycl-target-backend=nvptx-nvidia-cuda --offload-arch=sm_75 -Xsycl-target-backend=amdgcn-amd-amdhsa --offload-arch=gfx908 -ccc-print-phases %s 2>&1 \
393+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl --offload-new-driver -fno-sycl-instrument-device-code -fno-sycl-device-lib=all -fsycl-targets=spir64,nvptx64-nvidia-cuda,amdgcn-amd-amdhsa -Xsycl-target-backend=nvptx64-nvidia-cuda --offload-arch=sm_75 -Xsycl-target-backend=amdgcn-amd-amdhsa --offload-arch=gfx908 -ccc-print-phases %s 2>&1 \
394394
// RUN: | FileCheck -check-prefix=CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD %s
395395
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 0: input, "[[INPUT:.+\.c]]", c++, (host-sycl)
396396
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 1: preprocessor, {0}, c++-cpp-output, (host-sycl)
@@ -409,7 +409,7 @@
409409
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 14: preprocessor, {13}, c++-cpp-output, (device-sycl, sm_75)
410410
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 15: compiler, {14}, ir, (device-sycl, sm_75)
411411
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 16: backend, {15}, ir, (device-sycl, sm_75)
412-
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 17: offload, "device-sycl (nvptx-nvidia-cuda:sm_75)" {16}, ir
412+
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 17: offload, "device-sycl (nvptx64-nvidia-cuda:sm_75)" {16}, ir
413413
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 18: clang-offload-packager, {7, 12, 17}, image, (device-sycl)
414414
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 19: offload, "host-sycl (x86_64-unknown-linux-gnu)" {2}, "device-sycl (x86_64-unknown-linux-gnu)" {18}, ir
415415
// CHK-PHASE-MULTI-TARG-SPIRV-NVIDIA-AMD: 20: backend, {19}, assembler, (host-sycl)

clang/test/Driver/sycl-oneapi-gpu-nvidia.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,25 @@
4343
// RUN: FileCheck %s --check-prefix=BAD_NVIDIA_INPUT
4444
// BAD_NVIDIA_INPUT: error: SYCL target is invalid: 'nvidia_gpu_bad'
4545

46+
// Check if the partial SYCL triple for NVidia GPUs translate to the full string.
47+
// RUN: %clangxx -fsycl -nocudalib -fsycl-targets=nvptx64 -### %s 2>&1 | \
48+
// RUN: FileCheck %s --check-prefixes=NVIDIA-TRIPLE
49+
// NVIDIA-TRIPLE: clang{{.*}} "-triple" "nvptx64-nvidia-cuda"
50+
51+
// Check if SYCL triples with 'Environment' component are rejected for NVidia GPUs.
52+
// RUN: not %clangxx -c -fsycl -fsycl-targets=nvptx64-nvidia-cuda-sycl -### %s 2>&1 | \
53+
// RUN: FileCheck %s --check-prefix=BAD_TARGET_TRIPLE_ENV
54+
// RUN: not %clang_cl -c -fsycl -fsycl-targets=nvptx64-nvidia-cuda-sycl -### %s 2>&1 | \
55+
// RUN: FileCheck %s --check-prefix=BAD_TARGET_TRIPLE_ENV
56+
// BAD_TARGET_TRIPLE_ENV: error: SYCL target is invalid: 'nvptx64-nvidia-cuda-sycl'
57+
58+
// Check for invalid SYCL triple for NVidia GPUs.
59+
// RUN: not %clangxx -c -fsycl -fsycl-targets=nvptx-nvidia-cuda -### %s 2>&1 | \
60+
// RUN: FileCheck %s --check-prefix=BAD_TARGET_TRIPLE
61+
// RUN: not %clang_cl -c -fsycl -fsycl-targets=nvptx-nvidia-cuda -### %s 2>&1 | \
62+
// RUN: FileCheck %s --check-prefix=BAD_TARGET_TRIPLE
63+
// BAD_TARGET_TRIPLE: error: SYCL target is invalid: 'nvptx-nvidia-cuda'
64+
4665
/// Test for proper creation of fat object
4766
// RUN: %clangxx -c -fsycl -nocudalib -fsycl-targets=nvidia_gpu_sm_50 \
4867
// RUN: -fsycl-libspirv-path=%S/Inputs/SYCL/libspirv.bc \

0 commit comments

Comments
 (0)