[Clang][NFC] Move OffloadArch enum to a generic location (#137070)
Currently, the OffloadArch enum is defined Cuda.h. This PR moves the definition to a more generic location in OffloadArch.h/cpp.
This commit is contained in:
@@ -9,6 +9,8 @@
|
||||
#ifndef LLVM_CLANG_BASIC_CUDA_H
|
||||
#define LLVM_CLANG_BASIC_CUDA_H
|
||||
|
||||
#include "clang/Basic/OffloadArch.h"
|
||||
|
||||
namespace llvm {
|
||||
class StringRef;
|
||||
class Twine;
|
||||
@@ -54,98 +56,6 @@ const char *CudaVersionToString(CudaVersion V);
|
||||
// Input is "Major.Minor"
|
||||
CudaVersion CudaStringToVersion(const llvm::Twine &S);
|
||||
|
||||
enum class OffloadArch {
|
||||
UNUSED,
|
||||
UNKNOWN,
|
||||
// TODO: Deprecate and remove GPU architectures older than sm_52.
|
||||
SM_20,
|
||||
SM_21,
|
||||
SM_30,
|
||||
// This has a name conflict with sys/mac.h on AIX, rename it as a workaround.
|
||||
SM_32_,
|
||||
SM_35,
|
||||
SM_37,
|
||||
SM_50,
|
||||
SM_52,
|
||||
SM_53,
|
||||
SM_60,
|
||||
SM_61,
|
||||
SM_62,
|
||||
SM_70,
|
||||
SM_72,
|
||||
SM_75,
|
||||
SM_80,
|
||||
SM_86,
|
||||
SM_87,
|
||||
SM_89,
|
||||
SM_90,
|
||||
SM_90a,
|
||||
SM_100,
|
||||
SM_100a,
|
||||
SM_101,
|
||||
SM_101a,
|
||||
SM_120,
|
||||
SM_120a,
|
||||
GFX600,
|
||||
GFX601,
|
||||
GFX602,
|
||||
GFX700,
|
||||
GFX701,
|
||||
GFX702,
|
||||
GFX703,
|
||||
GFX704,
|
||||
GFX705,
|
||||
GFX801,
|
||||
GFX802,
|
||||
GFX803,
|
||||
GFX805,
|
||||
GFX810,
|
||||
GFX9_GENERIC,
|
||||
GFX900,
|
||||
GFX902,
|
||||
GFX904,
|
||||
GFX906,
|
||||
GFX908,
|
||||
GFX909,
|
||||
GFX90a,
|
||||
GFX90c,
|
||||
GFX9_4_GENERIC,
|
||||
GFX942,
|
||||
GFX950,
|
||||
GFX10_1_GENERIC,
|
||||
GFX1010,
|
||||
GFX1011,
|
||||
GFX1012,
|
||||
GFX1013,
|
||||
GFX10_3_GENERIC,
|
||||
GFX1030,
|
||||
GFX1031,
|
||||
GFX1032,
|
||||
GFX1033,
|
||||
GFX1034,
|
||||
GFX1035,
|
||||
GFX1036,
|
||||
GFX11_GENERIC,
|
||||
GFX1100,
|
||||
GFX1101,
|
||||
GFX1102,
|
||||
GFX1103,
|
||||
GFX1150,
|
||||
GFX1151,
|
||||
GFX1152,
|
||||
GFX1153,
|
||||
GFX12_GENERIC,
|
||||
GFX1200,
|
||||
GFX1201,
|
||||
AMDGCNSPIRV,
|
||||
Generic, // A processor model named 'generic' if the target backend defines a
|
||||
// public one.
|
||||
LAST,
|
||||
|
||||
CudaDefault = OffloadArch::SM_52,
|
||||
HIPDefault = OffloadArch::GFX906,
|
||||
};
|
||||
|
||||
enum class CUDAFunctionTarget {
|
||||
Device,
|
||||
Global,
|
||||
@@ -154,21 +64,6 @@ enum class CUDAFunctionTarget {
|
||||
InvalidTarget
|
||||
};
|
||||
|
||||
static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
|
||||
return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
|
||||
}
|
||||
|
||||
static inline bool IsAMDOffloadArch(OffloadArch A) {
|
||||
// Generic processor model is for testing only.
|
||||
return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
|
||||
}
|
||||
|
||||
const char *OffloadArchToString(OffloadArch A);
|
||||
const char *OffloadArchToVirtualArchString(OffloadArch A);
|
||||
|
||||
// The input should have the form "sm_20".
|
||||
OffloadArch StringToOffloadArch(llvm::StringRef S);
|
||||
|
||||
/// Get the earliest CudaVersion that supports the given OffloadArch.
|
||||
CudaVersion MinVersionForOffloadArch(OffloadArch A);
|
||||
|
||||
|
||||
128
clang/include/clang/Basic/OffloadArch.h
Normal file
128
clang/include/clang/Basic/OffloadArch.h
Normal file
@@ -0,0 +1,128 @@
|
||||
//===--- OffloadArch.h - Definition of offloading architectures --- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_BASIC_OFFLOADARCH_H
|
||||
#define LLVM_CLANG_BASIC_OFFLOADARCH_H
|
||||
|
||||
namespace llvm {
|
||||
class StringRef;
|
||||
} // namespace llvm
|
||||
|
||||
namespace clang {
|
||||
|
||||
enum class OffloadArch {
|
||||
UNUSED,
|
||||
UNKNOWN,
|
||||
// TODO: Deprecate and remove GPU architectures older than sm_52.
|
||||
SM_20,
|
||||
SM_21,
|
||||
SM_30,
|
||||
// This has a name conflict with sys/mac.h on AIX, rename it as a workaround.
|
||||
SM_32_,
|
||||
SM_35,
|
||||
SM_37,
|
||||
SM_50,
|
||||
SM_52,
|
||||
SM_53,
|
||||
SM_60,
|
||||
SM_61,
|
||||
SM_62,
|
||||
SM_70,
|
||||
SM_72,
|
||||
SM_75,
|
||||
SM_80,
|
||||
SM_86,
|
||||
SM_87,
|
||||
SM_89,
|
||||
SM_90,
|
||||
SM_90a,
|
||||
SM_100,
|
||||
SM_100a,
|
||||
SM_101,
|
||||
SM_101a,
|
||||
SM_120,
|
||||
SM_120a,
|
||||
GFX600,
|
||||
GFX601,
|
||||
GFX602,
|
||||
GFX700,
|
||||
GFX701,
|
||||
GFX702,
|
||||
GFX703,
|
||||
GFX704,
|
||||
GFX705,
|
||||
GFX801,
|
||||
GFX802,
|
||||
GFX803,
|
||||
GFX805,
|
||||
GFX810,
|
||||
GFX9_GENERIC,
|
||||
GFX900,
|
||||
GFX902,
|
||||
GFX904,
|
||||
GFX906,
|
||||
GFX908,
|
||||
GFX909,
|
||||
GFX90a,
|
||||
GFX90c,
|
||||
GFX9_4_GENERIC,
|
||||
GFX942,
|
||||
GFX950,
|
||||
GFX10_1_GENERIC,
|
||||
GFX1010,
|
||||
GFX1011,
|
||||
GFX1012,
|
||||
GFX1013,
|
||||
GFX10_3_GENERIC,
|
||||
GFX1030,
|
||||
GFX1031,
|
||||
GFX1032,
|
||||
GFX1033,
|
||||
GFX1034,
|
||||
GFX1035,
|
||||
GFX1036,
|
||||
GFX11_GENERIC,
|
||||
GFX1100,
|
||||
GFX1101,
|
||||
GFX1102,
|
||||
GFX1103,
|
||||
GFX1150,
|
||||
GFX1151,
|
||||
GFX1152,
|
||||
GFX1153,
|
||||
GFX12_GENERIC,
|
||||
GFX1200,
|
||||
GFX1201,
|
||||
AMDGCNSPIRV,
|
||||
Generic, // A processor model named 'generic' if the target backend defines a
|
||||
// public one.
|
||||
LAST,
|
||||
|
||||
CudaDefault = OffloadArch::SM_52,
|
||||
HIPDefault = OffloadArch::GFX906,
|
||||
};
|
||||
|
||||
static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
|
||||
return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
|
||||
}
|
||||
|
||||
static inline bool IsAMDOffloadArch(OffloadArch A) {
|
||||
// Generic processor model is for testing only.
|
||||
return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
|
||||
}
|
||||
|
||||
const char *OffloadArchToString(OffloadArch A);
|
||||
const char *OffloadArchToVirtualArchString(OffloadArch A);
|
||||
|
||||
// Convert a string to an OffloadArch enum value. Returns
|
||||
// OffloadArch::UNKNOWN if the string is not recognized.
|
||||
OffloadArch StringToOffloadArch(llvm::StringRef S);
|
||||
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_BASIC_OFFLOADARCH_H
|
||||
@@ -76,6 +76,7 @@ add_clang_library(clangBasic
|
||||
MakeSupport.cpp
|
||||
Module.cpp
|
||||
ObjCRuntime.cpp
|
||||
OffloadArch.cpp
|
||||
OpenCLOptions.cpp
|
||||
OpenMPKinds.cpp
|
||||
OperatorPrecedence.cpp
|
||||
|
||||
@@ -73,123 +73,6 @@ CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
|
||||
return CudaVersion::UNKNOWN;
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct OffloadArchToStringMap {
|
||||
OffloadArch arch;
|
||||
const char *arch_name;
|
||||
const char *virtual_arch_name;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
#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"}
|
||||
static const OffloadArchToStringMap arch_names[] = {
|
||||
// clang-format off
|
||||
{OffloadArch::UNUSED, "", ""},
|
||||
SM2(20, "compute_20"), SM2(21, "compute_20"), // Fermi
|
||||
SM(30), {OffloadArch::SM_32_, "sm_32", "compute_32"}, SM(35), SM(37), // Kepler
|
||||
SM(50), SM(52), SM(53), // Maxwell
|
||||
SM(60), SM(61), SM(62), // Pascal
|
||||
SM(70), SM(72), // Volta
|
||||
SM(75), // Turing
|
||||
SM(80), SM(86), // Ampere
|
||||
SM(87), // Jetson/Drive AGX Orin
|
||||
SM(89), // Ada Lovelace
|
||||
SM(90), // Hopper
|
||||
SM(90a), // Hopper
|
||||
SM(100), // Blackwell
|
||||
SM(100a), // Blackwell
|
||||
SM(101), // Blackwell
|
||||
SM(101a), // Blackwell
|
||||
SM(120), // Blackwell
|
||||
SM(120a), // Blackwell
|
||||
GFX(600), // gfx600
|
||||
GFX(601), // gfx601
|
||||
GFX(602), // gfx602
|
||||
GFX(700), // gfx700
|
||||
GFX(701), // gfx701
|
||||
GFX(702), // gfx702
|
||||
GFX(703), // gfx703
|
||||
GFX(704), // gfx704
|
||||
GFX(705), // gfx705
|
||||
GFX(801), // gfx801
|
||||
GFX(802), // gfx802
|
||||
GFX(803), // gfx803
|
||||
GFX(805), // gfx805
|
||||
GFX(810), // gfx810
|
||||
{OffloadArch::GFX9_GENERIC, "gfx9-generic", "compute_amdgcn"},
|
||||
GFX(900), // gfx900
|
||||
GFX(902), // gfx902
|
||||
GFX(904), // gfx903
|
||||
GFX(906), // gfx906
|
||||
GFX(908), // gfx908
|
||||
GFX(909), // gfx909
|
||||
GFX(90a), // gfx90a
|
||||
GFX(90c), // gfx90c
|
||||
{OffloadArch::GFX9_4_GENERIC, "gfx9-4-generic", "compute_amdgcn"},
|
||||
GFX(942), // gfx942
|
||||
GFX(950), // gfx950
|
||||
{OffloadArch::GFX10_1_GENERIC, "gfx10-1-generic", "compute_amdgcn"},
|
||||
GFX(1010), // gfx1010
|
||||
GFX(1011), // gfx1011
|
||||
GFX(1012), // gfx1012
|
||||
GFX(1013), // gfx1013
|
||||
{OffloadArch::GFX10_3_GENERIC, "gfx10-3-generic", "compute_amdgcn"},
|
||||
GFX(1030), // gfx1030
|
||||
GFX(1031), // gfx1031
|
||||
GFX(1032), // gfx1032
|
||||
GFX(1033), // gfx1033
|
||||
GFX(1034), // gfx1034
|
||||
GFX(1035), // gfx1035
|
||||
GFX(1036), // gfx1036
|
||||
{OffloadArch::GFX11_GENERIC, "gfx11-generic", "compute_amdgcn"},
|
||||
GFX(1100), // gfx1100
|
||||
GFX(1101), // gfx1101
|
||||
GFX(1102), // gfx1102
|
||||
GFX(1103), // gfx1103
|
||||
GFX(1150), // gfx1150
|
||||
GFX(1151), // gfx1151
|
||||
GFX(1152), // gfx1152
|
||||
GFX(1153), // gfx1153
|
||||
{OffloadArch::GFX12_GENERIC, "gfx12-generic", "compute_amdgcn"},
|
||||
GFX(1200), // gfx1200
|
||||
GFX(1201), // gfx1201
|
||||
{OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"},
|
||||
{OffloadArch::Generic, "generic", ""},
|
||||
// clang-format on
|
||||
};
|
||||
#undef SM
|
||||
#undef SM2
|
||||
#undef GFX
|
||||
|
||||
const char *OffloadArchToString(OffloadArch A) {
|
||||
auto result = std::find_if(
|
||||
std::begin(arch_names), std::end(arch_names),
|
||||
[A](const OffloadArchToStringMap &map) { return A == map.arch; });
|
||||
if (result == std::end(arch_names))
|
||||
return "unknown";
|
||||
return result->arch_name;
|
||||
}
|
||||
|
||||
const char *OffloadArchToVirtualArchString(OffloadArch A) {
|
||||
auto result = std::find_if(
|
||||
std::begin(arch_names), std::end(arch_names),
|
||||
[A](const OffloadArchToStringMap &map) { return A == map.arch; });
|
||||
if (result == std::end(arch_names))
|
||||
return "unknown";
|
||||
return result->virtual_arch_name;
|
||||
}
|
||||
|
||||
OffloadArch StringToOffloadArch(llvm::StringRef S) {
|
||||
auto result = std::find_if(
|
||||
std::begin(arch_names), std::end(arch_names),
|
||||
[S](const OffloadArchToStringMap &map) { return S == map.arch_name; });
|
||||
if (result == std::end(arch_names))
|
||||
return OffloadArch::UNKNOWN;
|
||||
return result->arch;
|
||||
}
|
||||
|
||||
CudaVersion MinVersionForOffloadArch(OffloadArch A) {
|
||||
if (A == OffloadArch::UNKNOWN)
|
||||
return CudaVersion::UNKNOWN;
|
||||
|
||||
126
clang/lib/Basic/OffloadArch.cpp
Normal file
126
clang/lib/Basic/OffloadArch.cpp
Normal file
@@ -0,0 +1,126 @@
|
||||
#include "clang/Basic/OffloadArch.h"
|
||||
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
namespace {
|
||||
struct OffloadArchToStringMap {
|
||||
OffloadArch Arch;
|
||||
const char *ArchName;
|
||||
const char *VirtualArchName;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
#define SM(sm) {OffloadArch::SM_##sm, "sm_" #sm, "compute_" #sm}
|
||||
#define GFX(gpu) {OffloadArch::GFX##gpu, "gfx" #gpu, "compute_amdgcn"}
|
||||
static const OffloadArchToStringMap ArchNames[] = {
|
||||
// clang-format off
|
||||
{OffloadArch::UNUSED, "", ""},
|
||||
SM(20), {OffloadArch::SM_21, "sm_21", "compute_20"}, // Fermi
|
||||
SM(30), {OffloadArch::SM_32_, "sm_32", "compute_32"}, SM(35), SM(37), // Kepler
|
||||
SM(50), SM(52), SM(53), // Maxwell
|
||||
SM(60), SM(61), SM(62), // Pascal
|
||||
SM(70), SM(72), // Volta
|
||||
SM(75), // Turing
|
||||
SM(80), SM(86), // Ampere
|
||||
SM(87), // Jetson/Drive AGX Orin
|
||||
SM(89), // Ada Lovelace
|
||||
SM(90), // Hopper
|
||||
SM(90a), // Hopper
|
||||
SM(100), // Blackwell
|
||||
SM(100a), // Blackwell
|
||||
SM(101), // Blackwell
|
||||
SM(101a), // Blackwell
|
||||
SM(120), // Blackwell
|
||||
SM(120a), // Blackwell
|
||||
GFX(600), // gfx600
|
||||
GFX(601), // gfx601
|
||||
GFX(602), // gfx602
|
||||
GFX(700), // gfx700
|
||||
GFX(701), // gfx701
|
||||
GFX(702), // gfx702
|
||||
GFX(703), // gfx703
|
||||
GFX(704), // gfx704
|
||||
GFX(705), // gfx705
|
||||
GFX(801), // gfx801
|
||||
GFX(802), // gfx802
|
||||
GFX(803), // gfx803
|
||||
GFX(805), // gfx805
|
||||
GFX(810), // gfx810
|
||||
{OffloadArch::GFX9_GENERIC, "gfx9-generic", "compute_amdgcn"},
|
||||
GFX(900), // gfx900
|
||||
GFX(902), // gfx902
|
||||
GFX(904), // gfx903
|
||||
GFX(906), // gfx906
|
||||
GFX(908), // gfx908
|
||||
GFX(909), // gfx909
|
||||
GFX(90a), // gfx90a
|
||||
GFX(90c), // gfx90c
|
||||
{OffloadArch::GFX9_4_GENERIC, "gfx9-4-generic", "compute_amdgcn"},
|
||||
GFX(942), // gfx942
|
||||
GFX(950), // gfx950
|
||||
{OffloadArch::GFX10_1_GENERIC, "gfx10-1-generic", "compute_amdgcn"},
|
||||
GFX(1010), // gfx1010
|
||||
GFX(1011), // gfx1011
|
||||
GFX(1012), // gfx1012
|
||||
GFX(1013), // gfx1013
|
||||
{OffloadArch::GFX10_3_GENERIC, "gfx10-3-generic", "compute_amdgcn"},
|
||||
GFX(1030), // gfx1030
|
||||
GFX(1031), // gfx1031
|
||||
GFX(1032), // gfx1032
|
||||
GFX(1033), // gfx1033
|
||||
GFX(1034), // gfx1034
|
||||
GFX(1035), // gfx1035
|
||||
GFX(1036), // gfx1036
|
||||
{OffloadArch::GFX11_GENERIC, "gfx11-generic", "compute_amdgcn"},
|
||||
GFX(1100), // gfx1100
|
||||
GFX(1101), // gfx1101
|
||||
GFX(1102), // gfx1102
|
||||
GFX(1103), // gfx1103
|
||||
GFX(1150), // gfx1150
|
||||
GFX(1151), // gfx1151
|
||||
GFX(1152), // gfx1152
|
||||
GFX(1153), // gfx1153
|
||||
{OffloadArch::GFX12_GENERIC, "gfx12-generic", "compute_amdgcn"},
|
||||
GFX(1200), // gfx1200
|
||||
GFX(1201), // gfx1201
|
||||
{OffloadArch::AMDGCNSPIRV, "amdgcnspirv", "compute_amdgcn"},
|
||||
{OffloadArch::Generic, "generic", ""},
|
||||
// clang-format on
|
||||
};
|
||||
#undef SM
|
||||
#undef GFX
|
||||
|
||||
const char *OffloadArchToString(OffloadArch A) {
|
||||
auto Result =
|
||||
llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {
|
||||
return A == Map.Arch;
|
||||
});
|
||||
if (Result == std::end(ArchNames))
|
||||
return "unknown";
|
||||
return Result->ArchName;
|
||||
}
|
||||
|
||||
const char *OffloadArchToVirtualArchString(OffloadArch A) {
|
||||
auto Result =
|
||||
llvm::find_if(ArchNames, [A](const OffloadArchToStringMap &Map) {
|
||||
return A == Map.Arch;
|
||||
});
|
||||
if (Result == std::end(ArchNames))
|
||||
return "unknown";
|
||||
return Result->VirtualArchName;
|
||||
}
|
||||
|
||||
OffloadArch StringToOffloadArch(llvm::StringRef S) {
|
||||
auto Result =
|
||||
llvm::find_if(ArchNames, [S](const OffloadArchToStringMap &Map) {
|
||||
return S == Map.ArchName;
|
||||
});
|
||||
if (Result == std::end(ArchNames))
|
||||
return OffloadArch::UNKNOWN;
|
||||
return Result->Arch;
|
||||
}
|
||||
|
||||
} // namespace clang
|
||||
Reference in New Issue
Block a user