Skip to content

[Driver][SYCL] Allow for known aliases to be used for -fsycl-targets #3984

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions clang/lib/Driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -897,7 +897,7 @@ void Driver::CreateOffloadingDeviceToolChains(Compilation &C,
if (SYCLTargetsValues) {
if (SYCLTargetsValues->getNumValues()) {
for (StringRef Val : SYCLTargetsValues->getValues()) {
llvm::Triple TT(Val);
llvm::Triple TT(MakeSYCLDeviceTriple(Val));
if (!isValidSYCLTriple(TT)) {
Diag(clang::diag::err_drv_invalid_sycl_target) << Val;
continue;
Expand Down Expand Up @@ -1846,12 +1846,18 @@ void Driver::PrintHelp(bool ShowHidden) const {
}

llvm::Triple Driver::MakeSYCLDeviceTriple(StringRef TargetArch) const {
llvm::Triple TT;
TT.setArchName(TargetArch);
TT.setVendor(llvm::Triple::UnknownVendor);
TT.setOS(llvm::Triple::UnknownOS);
TT.setEnvironment(llvm::Triple::SYCLDevice);
return TT;
ArrayRef<StringRef> SYCLAlias = {"spir", "spir64", "spir64_fpga",
"spir64_x86_64", "spir64_gen"};
if (std::find(SYCLAlias.begin(), SYCLAlias.end(), TargetArch) !=
SYCLAlias.end()) {
llvm::Triple TT;
TT.setArchName(TargetArch);
TT.setVendor(llvm::Triple::UnknownVendor);
TT.setOS(llvm::Triple::UnknownOS);
TT.setEnvironment(llvm::Triple::SYCLDevice);
return TT;
}
return llvm::Triple(TargetArch);
}

// Print the help from any of the given tools which are used for AOT
Expand Down Expand Up @@ -4565,7 +4571,7 @@ class OffloadingActionBuilder final {
if (SYCLTargets) {
llvm::StringMap<StringRef> FoundNormalizedTriples;
for (const char *Val : SYCLTargets->getValues()) {
llvm::Triple TT(Val);
llvm::Triple TT(C.getDriver().MakeSYCLDeviceTriple(Val));
std::string NormalizedName = TT.normalize();

// Make sure we don't have a duplicate triple.
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Driver/ToolChains/SYCL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ void SYCLToolChain::TranslateTargetOpt(const llvm::opt::ArgList &Args,
OptNoTriple = A->getOption().matches(Opt);
if (A->getOption().matches(Opt_EQ)) {
// Passing device args: -X<Opt>=<triple> -opt=val.
if (A->getValue() != getTripleString())
if (getDriver().MakeSYCLDeviceTriple(A->getValue()) != getTriple())
// Provided triple does not match current tool chain.
continue;
} else if (!OptNoTriple)
Expand Down
31 changes: 25 additions & 6 deletions clang/test/Driver/sycl-offload.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,16 +96,24 @@

/// Check no error for -fsycl-targets with good triple
// RUN: %clang -### -fsycl-targets=spir-unknown-unknown-sycldevice -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64 -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64_fpga -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64_x86_64 -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64_gen-unknown-unknown-sycldevice -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang -### -fsycl-targets=spir64_gen -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// RUN: %clang_cl -### -fsycl-targets=spir-unknown-unknown-sycldevice -fsycl %s 2>&1 \
// RUN: | FileCheck -check-prefix=CHK-SYCL-FPGA-TRIPLE %s
// CHK-SYCL-FPGA-TRIPLE-NOT: error: SYCL target is invalid
// RUN: | FileCheck -check-prefix=CHK-SYCL-TARGET %s
// CHK-SYCL-TARGET-NOT: error: SYCL target is invalid

/// Check error for -fsycl-[add|link]-targets with bad triple
// RUN: %clang -### -fsycl-add-targets=spir64_bad-unknown-unknown-sycldevice:dummy.spv -fsycl %s 2>&1 \
Expand Down Expand Up @@ -302,6 +310,8 @@
// RUN: touch %t.o
// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t.o 2>&1 \
// RUN: | FileCheck -DINPUT=%t.o -check-prefix=CHK-UBACTIONS %s
// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -o %t.out -lsomelib -fsycl-targets=spir64 %t.o 2>&1 \
// RUN: | FileCheck -DINPUT=%t.o -check-prefix=CHK-UBACTIONS %s
// RUN: mkdir -p %t_dir
// RUN: touch %t_dir/dummy
// RUN: %clang -### -ccc-print-phases -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -o %t.out -lsomelib -fsycl-targets=spir64-unknown-unknown-sycldevice %t_dir/dummy 2>&1 \
Expand Down Expand Up @@ -625,10 +635,16 @@
/// Ahead of Time compilation for fpga, gen, cpu
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga-unknown-unknown-sycldevice %s 2>&1 \
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-FPGA
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_fpga %s 2>&1 \
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-FPGA
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_gen-unknown-unknown-sycldevice %s 2>&1 \
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_gen %s 2>&1 \
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-GEN
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %s 2>&1 \
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU
// RUN: %clang -target x86_64-unknown-linux-gnu -ccc-print-phases -fsycl-use-footer -fsycl -fno-sycl-device-lib=all -fsycl-targets=spir64_x86_64 %s 2>&1 \
// RUN: | FileCheck %s -check-prefixes=CHK-PHASES-AOT,CHK-PHASES-CPU
// CHK-PHASES-AOT: 0: input, "[[INPUT:.+\.c]]", c++, (host-sycl)
// CHK-PHASES-AOT: 1: preprocessor, {0}, c++-cpp-output, (host-sycl)
// CHK-PHASES-AOT: 2: append-footer, {1}, c++, (host-sycl)
Expand Down Expand Up @@ -804,6 +820,9 @@
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64-unknown-unknown-sycldevice,spir64_gen-unknown-unknown-sycldevice \
// RUN: -Xsycl-target-backend=spir64_gen-unknown-unknown-sycldevice "-device skl -cl-opt-disable" -Xsycl-target-linker=spir64-unknown-unknown-sycldevice "-cl-denorms-are-zero" %s 2>&1 \
// RUN: | FileCheck -check-prefixes=CHK-TOOLS-MULT-OPTS,CHK-TOOLS-MULT-OPTS-NEG %s
// RUN: %clang -### -target x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64,spir64_gen \
// RUN: -Xsycl-target-backend=spir64_gen "-device skl -cl-opt-disable" -Xsycl-target-linker=spir64 "-cl-denorms-are-zero" %s 2>&1 \
// RUN: | FileCheck -check-prefixes=CHK-TOOLS-MULT-OPTS,CHK-TOOLS-MULT-OPTS-NEG %s
// CHK-TOOLS-MULT-OPTS: clang-offload-wrapper{{.*}} "-link-opts=-cl-denorms-are-zero"{{.*}} "-target=spir64"
// CHK-TOOLS-MULT-OPTS: ocloc{{.*}} "-device" "skl"{{.*}} "-cl-opt-disable"
// CHK-TOOLS-MULT-OPTS-NEG-NOT: clang-offload-wrapper{{.*}} "-compile-opts=-device skl -cl-opt-disable"{{.*}} "-target=spir64"
Expand Down
12 changes: 7 additions & 5 deletions sycl/doc/GetStartedGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -490,19 +490,21 @@ clang++ -fsycl -fsycl-targets=nvptx64-nvidia-cuda-sycldevice \
```

To build simple-sycl-app ahead of time for GPU, CPU or Accelerator devices,
specify the target architecture:
specify the target architecture. The examples provided use a supported
alias for the target, representing a full triple. Additional details can
be found in the [Users Manual](UsersManual.md#generic-options).

```-fsycl-targets=spir64_gen-unknown-unknown-sycldevice``` for GPU,
```-fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice``` for CPU,
```-fsycl-targets=spir64_fpga-unknown-unknown-sycldevice``` for Accelerator.
```-fsycl-targets=spir64_gen``` for GPU,
```-fsycl-targets=spir64_x86_64``` for CPU,
```-fsycl-targets=spir64_fpga``` for Accelerator.

Multiple target architectures are supported.

E.g., this command builds simple-sycl-app for GPU and CPU devices in
ahead of time mode:

```bash
clang++ -fsycl -fsycl-targets=spir64_gen-unknown-unknown-sycldevice,spir64_x86_64-unknown-unknown-sycldevice simple-sycl-app.cpp -o simple-sycl-app-aot.exe
clang++ -fsycl -fsycl-targets=spir64_gen,spir64_x86_64 simple-sycl-app.cpp -o simple-sycl-app-aot.exe
```

Additionally, user can pass specific options of AOT compiler to
Expand Down
2 changes: 2 additions & 0 deletions sycl/doc/UsersManual.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ and not recommended to use in production environment.
Intel FPGA;
* spir64_gen-unknown-unknown-sycldevice - generate code ahead of time for
Intel Processor Graphics;
Shorter aliases of the above triples can also be used:
* spir64, spir64_x86_64, spir64_fpga, spir64_gen
Available in special build configuration:
* nvptx64-nvidia-cuda-sycldevice - generate code ahead of time for CUDA
target;
Expand Down