Skip to content

[Clang][SYCL] Add AOT compilation support for Intel GPUs in clang-sycl-linker #133194

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

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 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
66 changes: 66 additions & 0 deletions clang/include/clang/Basic/Cuda.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,63 @@ enum class OffloadArch {
AMDGCNSPIRV,
Generic, // A processor model named 'generic' if the target backend defines a
// public one.
// Intel CPUs
SKYLAKEAVX512,
COREAVX2,
COREI7AVX,
COREI7,
WESTMERE,
SANDYBRIDGE,
IVYBRIDGE,
BROADWELL,
COFFEELAKE,
ALDERLAKE,
SKYLAKE,
SKX,
CASCADELAKE,
ICELAKECLIENT,
ICELAKESERVER,
SAPPHIRERAPIDS,
GRANITERAPIDS,
// Intel 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_G11,
ACM_G12,
DG2_G12,
PVC,
PVC_VG,
MTL_U,
MTL_S,
ARL_U,
ARL_S,
MTL_H,
ARL_H,
BMG_G21,
LNL_M,
LAST,

CudaDefault = OffloadArch::SM_52,
Expand All @@ -163,6 +220,15 @@ static inline bool IsAMDOffloadArch(OffloadArch A) {
return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
}

static inline bool IsIntelCPUArch(OffloadArch Arch) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For sake of completion, can you please add IsIntelOffloadArch as well?

Thanks

return Arch >= OffloadArch::SKYLAKEAVX512 &&
Arch <= OffloadArch::GRANITERAPIDS;
}

static inline bool IsIntelGPUArch(OffloadArch Arch) {
return Arch >= OffloadArch::BDW && Arch <= OffloadArch::LNL_M;
}

const char *OffloadArchToString(OffloadArch A);
const char *OffloadArchToVirtualArchString(OffloadArch A);

Expand Down
59 changes: 59 additions & 0 deletions clang/lib/Basic/Cuda.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ struct OffloadArchToStringMap {
#define SM2(sm, ca) {OffloadArch::SM_##sm, "sm_" #sm, ca}
#define SM(sm) SM2(sm, "compute_" #sm)
#define GFX(gpu) {OffloadArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn"}
#define INTEL(name, value) {OffloadArch::value, #name, ""}
static const OffloadArchToStringMap arch_names[] = {
// clang-format off
{OffloadArch::UNUSED, "", ""},
Expand Down Expand Up @@ -156,12 +157,70 @@ static const OffloadArchToStringMap arch_names[] = {
GFX(1200), // gfx1200
GFX(1201), // gfx1201
{OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"},
// Intel CPUs
INTEL(skylake-avx512, SKYLAKEAVX512),
INTEL(core-avx2, COREAVX2),
INTEL(corei7-avx, COREI7AVX),
INTEL(corei7, COREI7),
INTEL(westmere, WESTMERE),
INTEL(sandybridge, SANDYBRIDGE),
INTEL(ivybridge, IVYBRIDGE),
INTEL(broadwell, BROADWELL),
INTEL(coffeelake, COFFEELAKE),
INTEL(alderlake, ALDERLAKE),
INTEL(skylake, SKYLAKE),
INTEL(skx, SKX),
INTEL(cascadelake, CASCADELAKE),
INTEL(icelake-client, ICELAKECLIENT),
INTEL(icelakeserver, ICELAKESERVER),
INTEL(sapphirerapids, SAPPHIRERAPIDS),
INTEL(graniterapids, GRANITERAPIDS),
// Intel GPUs
INTEL(bdw, BDW),
INTEL(skl, SKL),
INTEL(kbl, KBL),
INTEL(cfl, CFL),
INTEL(apl, APL),
INTEL(bxt, BXT),
INTEL(glk, GLK),
INTEL(whl, WHL),
INTEL(aml, AML),
INTEL(cml, CML),
INTEL(icllp, ICLLP),
INTEL(icl, ICL),
INTEL(ehl, EHL),
INTEL(jsl, JSL),
INTEL(tgllp, TGLLP),
INTEL(tgl, TGL),
INTEL(rkl, RKL),
INTEL(adl_s, ADL_S),
INTEL(rpl_s, RPL_S),
INTEL(adl_p, ADL_P),
INTEL(adl_n, ADL_N),
INTEL(dg1, DG1),
INTEL(acm_g10, ACM_G10),
INTEL(dg2_g10, DG2_G10),
INTEL(acm_g11, ACM_G11),
INTEL(dg2_g11, DG2_G11),
INTEL(acm_g12, ACM_G12),
INTEL(dg2_g12, DG2_G12),
INTEL(pvc, PVC),
INTEL(pvc_vg, PVC_VG),
INTEL(mtl_u, MTL_U),
INTEL(mtl_s, MTL_S),
INTEL(arl_u, ARL_U),
INTEL(arl_s, ARL_S),
INTEL(mtl_h, MTL_H),
INTEL(arl_h, ARL_H),
INTEL(bmg_g21, BMG_G21),
INTEL(lnl_m, LNL_M),
{OffloadArch::Generic, "generic", ""},
// clang-format on
};
#undef SM
#undef SM2
#undef GFX
#undef INTEL

const char *OffloadArchToString(OffloadArch A) {
auto result = std::find_if(
Expand Down
55 changes: 55 additions & 0 deletions clang/lib/Basic/Targets/NVPTX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,61 @@ void NVPTXTargetInfo::getTargetDefines(const LangOptions &Opts,
case OffloadArch::GFX1201:
case OffloadArch::AMDGCNSPIRV:
case OffloadArch::Generic:
case OffloadArch::SKYLAKEAVX512:
case OffloadArch::COREAVX2:
case OffloadArch::COREI7AVX:
case OffloadArch::COREI7:
case OffloadArch::WESTMERE:
case OffloadArch::SANDYBRIDGE:
case OffloadArch::IVYBRIDGE:
case OffloadArch::BROADWELL:
case OffloadArch::COFFEELAKE:
case OffloadArch::ALDERLAKE:
case OffloadArch::SKYLAKE:
case OffloadArch::SKX:
case OffloadArch::CASCADELAKE:
case OffloadArch::ICELAKECLIENT:
case OffloadArch::ICELAKESERVER:
case OffloadArch::SAPPHIRERAPIDS:
case OffloadArch::GRANITERAPIDS:
case OffloadArch::BDW:
case OffloadArch::SKL:
case OffloadArch::KBL:
case OffloadArch::CFL:
case OffloadArch::APL:
case OffloadArch::BXT:
case OffloadArch::GLK:
case OffloadArch::WHL:
case OffloadArch::AML:
case OffloadArch::CML:
case OffloadArch::ICLLP:
case OffloadArch::ICL:
case OffloadArch::EHL:
case OffloadArch::JSL:
case OffloadArch::TGLLP:
case OffloadArch::TGL:
case OffloadArch::RKL:
case OffloadArch::ADL_S:
case OffloadArch::RPL_S:
case OffloadArch::ADL_P:
case OffloadArch::ADL_N:
case OffloadArch::DG1:
case OffloadArch::ACM_G10:
case OffloadArch::DG2_G10:
case OffloadArch::ACM_G11:
case OffloadArch::DG2_G11:
case OffloadArch::ACM_G12:
case OffloadArch::DG2_G12:
case OffloadArch::PVC:
case OffloadArch::PVC_VG:
case OffloadArch::MTL_U:
case OffloadArch::MTL_S:
case OffloadArch::ARL_U:
case OffloadArch::ARL_S:
case OffloadArch::MTL_H:
case OffloadArch::ARL_H:
case OffloadArch::BMG_G21:
case OffloadArch::LNL_M:
case OffloadArch::LAST:
break;
case OffloadArch::UNKNOWN:
Expand Down
55 changes: 55 additions & 0 deletions clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2335,6 +2335,61 @@ void CGOpenMPRuntimeGPU::processRequiresDirective(const OMPRequiresDecl *D) {
case OffloadArch::GFX1201:
case OffloadArch::AMDGCNSPIRV:
case OffloadArch::Generic:
case OffloadArch::SKYLAKEAVX512:
case OffloadArch::COREAVX2:
case OffloadArch::COREI7AVX:
case OffloadArch::COREI7:
case OffloadArch::WESTMERE:
case OffloadArch::SANDYBRIDGE:
case OffloadArch::IVYBRIDGE:
case OffloadArch::BROADWELL:
case OffloadArch::COFFEELAKE:
case OffloadArch::ALDERLAKE:
case OffloadArch::SKYLAKE:
case OffloadArch::SKX:
case OffloadArch::CASCADELAKE:
case OffloadArch::ICELAKECLIENT:
case OffloadArch::ICELAKESERVER:
case OffloadArch::SAPPHIRERAPIDS:
case OffloadArch::GRANITERAPIDS:
case OffloadArch::BDW:
case OffloadArch::SKL:
case OffloadArch::KBL:
case OffloadArch::CFL:
case OffloadArch::APL:
case OffloadArch::BXT:
case OffloadArch::GLK:
case OffloadArch::WHL:
case OffloadArch::AML:
case OffloadArch::CML:
case OffloadArch::ICLLP:
case OffloadArch::ICL:
case OffloadArch::EHL:
case OffloadArch::JSL:
case OffloadArch::TGLLP:
case OffloadArch::TGL:
case OffloadArch::RKL:
case OffloadArch::ADL_S:
case OffloadArch::RPL_S:
case OffloadArch::ADL_P:
case OffloadArch::ADL_N:
case OffloadArch::DG1:
case OffloadArch::ACM_G10:
case OffloadArch::DG2_G10:
case OffloadArch::ACM_G11:
case OffloadArch::DG2_G11:
case OffloadArch::ACM_G12:
case OffloadArch::DG2_G12:
case OffloadArch::PVC:
case OffloadArch::PVC_VG:
case OffloadArch::MTL_U:
case OffloadArch::MTL_S:
case OffloadArch::ARL_U:
case OffloadArch::ARL_S:
case OffloadArch::MTL_H:
case OffloadArch::ARL_H:
case OffloadArch::BMG_G21:
case OffloadArch::LNL_M:
case OffloadArch::UNUSED:
case OffloadArch::UNKNOWN:
break;
Expand Down
36 changes: 36 additions & 0 deletions clang/test/Driver/clang-sycl-linker-test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,39 @@
// RUN: not clang-sycl-linker --dry-run -triple=spirv64 %t_1.bc %t_2.bc --library-path=%T --device-libs=lib1.bc,lib2.bc,lib3.bc -o a.spv 2>&1 \
// RUN: | FileCheck %s --check-prefix=DEVLIBSERR2
// DEVLIBSERR2: '{{.*}}lib3.bc' SYCL device library file is not found
//
// Test AOT compilation for an Intel GPU.
// RUN: clang-sycl-linker --dry-run -arch pvc %t_1.bc %t_2.bc -o a.out 2>&1 \
// RUN: | FileCheck %s --check-prefix=AOT-INTEL-GPU
// AOT-INTEL-GPU: "{{.*}}llvm-link{{.*}}" {{.*}}.bc {{.*}}.bc -o [[LLVMLINKOUT:.*]].bc --suppress-warnings
// AOT-INTEL-GPU-NEXT: "{{.*}}llvm-spirv{{.*}}" {{.*}}-o [[SPIRVTRANSLATIONOUT:.*]] [[LLVMLINKOUT]].bc
// AOT-INTEL-GPU-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-device pvc {{.*}}-output a.out -file [[SPIRVTRANSLATIONOUT]]
//
// Test AOT compilation for an Intel GPU with additional options.
// RUN: clang-sycl-linker --dry-run -arch pvc %t_1.bc %t_2.bc -o a.out 2>&1 \
// RUN: --ocloc-options="-a -b" \
// RUN: | FileCheck %s --check-prefix=AOT-INTEL-GPU-2
// AOT-INTEL-GPU-2: "{{.*}}llvm-link{{.*}}" {{.*}}.bc {{.*}}.bc -o [[LLVMLINKOUT:.*]].bc --suppress-warnings
// AOT-INTEL-GPU-2-NEXT: "{{.*}}llvm-spirv{{.*}}" {{.*}}-o [[SPIRVTRANSLATIONOUT:.*]] [[LLVMLINKOUT]].bc
// AOT-INTEL-GPU-2-NEXT: "{{.*}}ocloc{{.*}}" {{.*}}-device pvc -a -b {{.*}}-output a.out -file [[SPIRVTRANSLATIONOUT]]
//
// Test AOT compilation for an Intel CPU.
// RUN: clang-sycl-linker --dry-run -arch corei7 %t_1.bc %t_2.bc -o a.out 2>&1 \
// RUN: | FileCheck %s --check-prefix=AOT-INTEL-CPU
// AOT-INTEL-CPU: "{{.*}}llvm-link{{.*}}" {{.*}}.bc {{.*}}.bc -o [[LLVMLINKOUT:.*]].bc --suppress-warnings
// AOT-INTEL-CPU-NEXT: "{{.*}}llvm-spirv{{.*}}" {{.*}}-o [[SPIRVTRANSLATIONOUT:.*]] [[LLVMLINKOUT]].bc
// AOT-INTEL-CPU-NEXT: "{{.*}}opencl-aot{{.*}}" {{.*}}--device=cpu {{.*}}-o a.out [[SPIRVTRANSLATIONOUT]]
//
// Test AOT compilation for an Intel CPU with additional options.
// RUN: clang-sycl-linker --dry-run -arch corei7 %t_1.bc %t_2.bc -o a.out 2>&1 \
// RUN: --opencl-aot-options="-a -b" \
// RUN: | FileCheck %s --check-prefix=AOT-INTEL-CPU-2
// AOT-INTEL-CPU-2: "{{.*}}llvm-link{{.*}}" {{.*}}.bc {{.*}}.bc -o [[LLVMLINKOUT:.*]].bc --suppress-warnings
// AOT-INTEL-CPU-2-NEXT: "{{.*}}llvm-spirv{{.*}}" {{.*}}-o [[SPIRVTRANSLATIONOUT:.*]] [[LLVMLINKOUT]].bc
// AOT-INTEL-CPU-2-NEXT: "{{.*}}opencl-aot{{.*}}" {{.*}}--device=cpu -a -b {{.*}}-o a.out [[SPIRVTRANSLATIONOUT]]
//
// Check that the output file must be specified.
// RUN: not clang-sycl-linker --dry-run %t_1.bc %t_2.bc 2>& 1 \
// RUN: | FileCheck %s --check-prefix=NOOUTPUT
// NOOUTPUT: Output file is not specified
//
Loading