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/NVPTXTargetParser.h"
14#include "llvm/TargetParser/Triple.h"
15
16namespace clang {
17
19 return getNVPTX(llvm::NVPTX::parseArch("sm_52"));
20}
21
23 return getAMDGPU(llvm::AMDGPU::parseArchAMDGCN("gfx906"));
24}
25
27 switch (A.targetArch()) {
29 return "";
31 return "unknown";
33 return llvm::NVPTX::getArchName(A.nvptxKind()).data();
35 return llvm::AMDGPU::getArchNameAMDGCN(A.amdgpuKind()).data();
37 return "amdgcnspirv";
39 return "graniterapids";
41 return "bmg_g21";
43 return "generic";
44 }
45 return "unknown";
46}
47
49 switch (A.targetArch()) {
51 return llvm::NVPTX::getVirtualArch(A.nvptxKind()).data();
54 return "compute_amdgcn";
56 return "unknown";
61 return "";
62 }
63 return "unknown";
64}
65
66OffloadArch StringToOffloadArch(llvm::StringRef S) {
67 // The empty string denotes the "unused" architecture.
68 if (S.empty())
70
71 // Non-GPU-table pseudo/sentinel architectures.
72 if (S == "amdgcnspirv")
74 if (S == "generic")
76 if (S == "graniterapids")
79 if (S == "bmg_g21")
82
83 // Otherwise defer to the vendor TargetParser GPU lists.
84 if (llvm::NVPTX::GPUKind NV = llvm::NVPTX::parseArch(S))
85 return OffloadArch::getNVPTX(NV);
86 if (llvm::AMDGPU::GPUKind AK = llvm::AMDGPU::parseArchAMDGCN(S))
87 return OffloadArch::getAMDGPU(AK);
89}
90
92#define NVPTX_GPU(NAME, KIND, VIRTUAL, SM_ID, MIN_VER, MAX_VER, SUFFIX) \
93 Values.push_back(NAME);
94#include "llvm/TargetParser/NVPTXTargetParser.def"
95 llvm::AMDGPU::fillValidArchListAMDGCN(Values, llvm::Triple::NoSubArch);
96}
97
98OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch) {
99 llvm::AMDGPU::GPUKind AK = llvm::AMDGPU::getGPUKindFromSubArch(SubArch);
100 if (AK == llvm::AMDGPU::GK_NONE)
102 return OffloadArch::getAMDGPU(AK);
103}
104
105llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID) {
106 if (!ID.isAMDGPU())
107 return llvm::Triple::NoSubArch;
108 return llvm::AMDGPU::getSubArch(ID.amdgpuKind());
109}
110
111llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
112 OffloadArch ID) {
113 if (ID.isAMDGCNSPIRV())
114 return llvm::Triple(llvm::Triple::spirv64, llvm::Triple::NoSubArch,
115 llvm::Triple::AMD, llvm::Triple::AMDHSA);
116
117 if (ID.isNVPTX()) {
118 llvm::Triple::ArchType Arch = DefaultToolchainTriple.isArch64Bit()
119 ? llvm::Triple::nvptx64
120 : llvm::Triple::nvptx;
121 return llvm::Triple(Arch, llvm::Triple::NoSubArch, llvm::Triple::NVIDIA,
122 llvm::Triple::CUDA);
123 }
124
125 if (ID.isAMDGPU())
126 return llvm::Triple(llvm::Triple::amdgpu, llvm::Triple::NoSubArch,
127 llvm::Triple::AMD, llvm::Triple::AMDHSA);
128
129 return {};
130}
131
132} // namespace clang
A processor an offloading action can target.
Definition OffloadArch.h:32
static constexpr OffloadArch getUnused()
Definition OffloadArch.h:70
static constexpr OffloadArch getAMDGCNSPIRV()
Definition OffloadArch.h:72
static constexpr OffloadArch getGeneric()
Definition OffloadArch.h:75
static OffloadArch CudaDefault()
Default architectures used when the user does not specify one.
static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K)
Definition OffloadArch.h:61
static OffloadArch HIPDefault()
static constexpr OffloadArch getUnknown()
Definition OffloadArch.h:71
static constexpr OffloadArch getIntel(TargetArch V, IntelArch A)
Definition OffloadArch.h:67
llvm::NVPTX::GPUKind nvptxKind() const
Definition OffloadArch.h:94
llvm::AMDGPU::GPUKind amdgpuKind() const
Definition OffloadArch.h:97
TargetArch targetArch() const
Definition OffloadArch.h:81
static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K)
Definition OffloadArch.h:64
Top level wrappers for InstallAPI frontend operations.
llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID)
OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch)
const char * OffloadArchToVirtualArchString(OffloadArch A)
OffloadArch StringToOffloadArch(llvm::StringRef S)
const char * OffloadArchToString(OffloadArch A)
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple, OffloadArch ID)
void fillValidOffloadArchList(llvm::SmallVectorImpl< llvm::StringRef > &Values)
Append the canonical names of all NVIDIA and AMDGPU GPUs.