clang 24.0.0git
OffloadArch.cpp
Go to the documentation of this file.
1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
9
10#include "llvm/ADT/SmallVector.h"
11#include "llvm/ADT/StringRef.h"
12#include "llvm/TargetParser/AMDGPUTargetParser.h"
13#include "llvm/TargetParser/IntelGPUTargetParser.h"
14#include "llvm/TargetParser/NVPTXTargetParser.h"
15#include "llvm/TargetParser/Triple.h"
16#include <cassert>
17
18namespace clang {
19
21 return getNVPTX(llvm::NVPTX::parseArch("sm_52"));
22}
23
25 return getAMDGPU(llvm::AMDGPU::parseArchAMDGCN("gfx906"));
26}
27
28OffloadArch OffloadArch::getIntelIGCA(llvm::IntelGPU::IGCATarget T) {
29 assert(T.isValid() && "T is not a valid IGCA target");
30 return {TargetArch::IntelIGCA, T.pack()};
31}
32
33llvm::IntelGPU::IGCATarget OffloadArch::igcaTarget() const {
34 assert(isIntelIGCA() && "cannot get IGCA target from a non-IGCA OffloadArch");
35 return llvm::IntelGPU::IGCATarget::unpack(Kind);
36}
37
39 switch (A.targetArch()) {
41 return "";
43 return "unknown";
45 return llvm::NVPTX::getArchName(A.nvptxKind()).data();
47 return llvm::AMDGPU::getArchNameAMDGCN(A.amdgpuKind()).data();
49 return "amdgcnspirv";
51 return "graniterapids";
53 return llvm::IntelGPU::getArchName(A.intelGPUKind()).data();
55 return llvm::IntelGPU::getIGCATargetName(A.igcaTarget()).data();
57 return "generic";
58 }
59 return "unknown";
60}
61
63 switch (A.targetArch()) {
65 return llvm::NVPTX::getVirtualArch(A.nvptxKind()).data();
68 return "compute_amdgcn";
70 return "unknown";
72 return llvm::IntelGPU::getIGCATargetName(A.igcaTarget()).data();
77 return "";
78 }
79 return "unknown";
80}
81
82OffloadArch StringToOffloadArch(llvm::StringRef S) {
83 // The empty string denotes the "unused" architecture.
84 if (S.empty())
86
87 // Non-GPU-table pseudo/sentinel architectures.
88 if (S == "amdgcnspirv")
90 if (S == "generic")
92 // Intel CPU offload has a single processor and no TargetParser list.
93 if (S == "graniterapids")
95
96 // Otherwise defer to the vendor TargetParser GPU lists.
97 if (llvm::NVPTX::GPUKind NV = llvm::NVPTX::parseArch(S))
98 return OffloadArch::getNVPTX(NV);
99 if (llvm::AMDGPU::GPUKind AK = llvm::AMDGPU::parseArchAMDGCN(S))
100 return OffloadArch::getAMDGPU(AK);
101 if (llvm::IntelGPU::GPUKind IK = llvm::IntelGPU::parseArch(S))
102 return OffloadArch::getIntelGPU(IK);
103 if (llvm::IntelGPU::IGCATarget IT = llvm::IntelGPU::parseIGCATarget(S))
104 return OffloadArch::getIntelIGCA(IT);
106}
107
108OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch) {
109 llvm::AMDGPU::GPUKind AK = llvm::AMDGPU::getGPUKindFromSubArch(SubArch);
110 if (AK == llvm::AMDGPU::GK_NONE)
112 return OffloadArch::getAMDGPU(AK);
113}
114
115llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID) {
116 if (!ID.isAMDGPU())
117 return llvm::Triple::NoSubArch;
118 return llvm::AMDGPU::getSubArch(ID.amdgpuKind());
119}
120
121llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
122 OffloadArch ID) {
123 if (ID.isAMDGCNSPIRV())
124 return llvm::Triple(llvm::Triple::spirv64, llvm::Triple::NoSubArch,
125 llvm::Triple::AMD, llvm::Triple::AMDHSA);
126
127 if (ID.isNVPTX()) {
128 llvm::Triple::ArchType Arch = DefaultToolchainTriple.isArch64Bit()
129 ? llvm::Triple::nvptx64
130 : llvm::Triple::nvptx;
131 return llvm::Triple(Arch, llvm::Triple::NoSubArch, llvm::Triple::NVIDIA,
132 llvm::Triple::CUDA);
133 }
134
135 if (ID.isAMDGPU())
136 return llvm::Triple(llvm::Triple::amdgpu, llvm::Triple::NoSubArch,
137 llvm::Triple::AMD, llvm::Triple::AMDHSA);
138
139 return {};
140}
141
142} // namespace clang
A processor an offloading action can target.
Definition OffloadArch.h:36
static constexpr OffloadArch getUnused()
Definition OffloadArch.h:76
static constexpr OffloadArch getAMDGCNSPIRV()
Definition OffloadArch.h:78
static constexpr OffloadArch getGeneric()
Definition OffloadArch.h:81
static OffloadArch CudaDefault()
Default architectures used when the user does not specify one.
static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K)
Definition OffloadArch.h:60
llvm::IntelGPU::IGCATarget igcaTarget() const
Which IGCA target this is; only valid when isIntelIGCA().
static OffloadArch getIntelIGCA(llvm::IntelGPU::IGCATarget T)
An Intel IGCA target, e.g. igca_20ca; T must be valid.
llvm::IntelGPU::GPUKind intelGPUKind() const
Which Intel GPU this is; only meaningful when isIntelGPU().
static OffloadArch HIPDefault()
static constexpr OffloadArch getUnknown()
Definition OffloadArch.h:77
bool isIntelIGCA() const
Definition OffloadArch.h:94
llvm::NVPTX::GPUKind nvptxKind() const
static OffloadArch getIntelGPU(llvm::IntelGPU::GPUKind K)
An Intel GPU, named by its entry in the TargetParser device list.
Definition OffloadArch.h:67
llvm::AMDGPU::GPUKind amdgpuKind() const
TargetArch targetArch() const
Definition OffloadArch.h:87
static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K)
Definition OffloadArch.h:63
static constexpr OffloadArch getIntelCPU()
Intel CPU offload, which has a single target, so no kind is needed.
Definition OffloadArch.h:73
Top level wrappers for InstallAPI frontend operations.
llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID)
OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch)
const FunctionProtoType * T
const char * OffloadArchToVirtualArchString(OffloadArch A)
OffloadArch StringToOffloadArch(llvm::StringRef S)
const char * OffloadArchToString(OffloadArch A)
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple, OffloadArch ID)