forked from OSchip/llvm-project
[NVPTX] Add more precise PTX/SM target attributes
Each SM and PTX version is modeled as a subtarget feature/CPU. Additionally, PTX 3.1 is added as the default PTX version to be out-of-the-box compatible with CUDA 5.0. Available CPUs for this target: sm_10 - Select the sm_10 processor. sm_11 - Select the sm_11 processor. sm_12 - Select the sm_12 processor. sm_13 - Select the sm_13 processor. sm_20 - Select the sm_20 processor. sm_21 - Select the sm_21 processor. sm_30 - Select the sm_30 processor. sm_35 - Select the sm_35 processor. Available features for this target: ptx30 - Use PTX version 3.0. ptx31 - Use PTX version 3.1. sm_10 - Target SM 1.0. sm_11 - Target SM 1.1. sm_12 - Target SM 1.2. sm_13 - Target SM 1.3. sm_20 - Target SM 2.0. sm_21 - Target SM 2.1. sm_30 - Target SM 3.0. sm_35 - Target SM 3.5. llvm-svn: 167699
This commit is contained in:
parent
f963a8ffcc
commit
1812ee9a5b
|
@ -24,7 +24,30 @@ include "NVPTXInstrInfo.td"
|
||||||
// - Need at least one feature to avoid generating zero sized array by
|
// - Need at least one feature to avoid generating zero sized array by
|
||||||
// TableGen in NVPTXGenSubtarget.inc.
|
// TableGen in NVPTXGenSubtarget.inc.
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
def FeatureDummy : SubtargetFeature<"dummy", "dummy", "true", "">;
|
|
||||||
|
// SM Versions
|
||||||
|
def SM10 : SubtargetFeature<"sm_10", "SmVersion", "10",
|
||||||
|
"Target SM 1.0">;
|
||||||
|
def SM11 : SubtargetFeature<"sm_11", "SmVersion", "11",
|
||||||
|
"Target SM 1.1">;
|
||||||
|
def SM12 : SubtargetFeature<"sm_12", "SmVersion", "12",
|
||||||
|
"Target SM 1.2">;
|
||||||
|
def SM13 : SubtargetFeature<"sm_13", "SmVersion", "13",
|
||||||
|
"Target SM 1.3">;
|
||||||
|
def SM20 : SubtargetFeature<"sm_20", "SmVersion", "20",
|
||||||
|
"Target SM 2.0">;
|
||||||
|
def SM21 : SubtargetFeature<"sm_21", "SmVersion", "21",
|
||||||
|
"Target SM 2.1">;
|
||||||
|
def SM30 : SubtargetFeature<"sm_30", "SmVersion", "30",
|
||||||
|
"Target SM 3.0">;
|
||||||
|
def SM35 : SubtargetFeature<"sm_35", "SmVersion", "35",
|
||||||
|
"Target SM 3.5">;
|
||||||
|
|
||||||
|
// PTX Versions
|
||||||
|
def PTX30 : SubtargetFeature<"ptx30", "PTXVersion", "30",
|
||||||
|
"Use PTX version 3.0">;
|
||||||
|
def PTX31 : SubtargetFeature<"ptx31", "PTXVersion", "31",
|
||||||
|
"Use PTX version 3.1">;
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// NVPTX supported processors.
|
// NVPTX supported processors.
|
||||||
|
@ -33,7 +56,14 @@ def FeatureDummy : SubtargetFeature<"dummy", "dummy", "true", "">;
|
||||||
class Proc<string Name, list<SubtargetFeature> Features>
|
class Proc<string Name, list<SubtargetFeature> Features>
|
||||||
: Processor<Name, NoItineraries, Features>;
|
: Processor<Name, NoItineraries, Features>;
|
||||||
|
|
||||||
def : Proc<"sm_10", [FeatureDummy]>;
|
def : Proc<"sm_10", [SM10]>;
|
||||||
|
def : Proc<"sm_11", [SM11]>;
|
||||||
|
def : Proc<"sm_12", [SM12]>;
|
||||||
|
def : Proc<"sm_13", [SM13]>;
|
||||||
|
def : Proc<"sm_20", [SM20]>;
|
||||||
|
def : Proc<"sm_21", [SM21]>;
|
||||||
|
def : Proc<"sm_30", [SM30]>;
|
||||||
|
def : Proc<"sm_35", [SM35]>;
|
||||||
|
|
||||||
|
|
||||||
def NVPTXInstrInfo : InstrInfo {
|
def NVPTXInstrInfo : InstrInfo {
|
||||||
|
|
|
@ -910,7 +910,8 @@ void NVPTXAsmPrinter::emitHeader (Module &M, raw_ostream &O) {
|
||||||
O << "//\n";
|
O << "//\n";
|
||||||
O << "\n";
|
O << "\n";
|
||||||
|
|
||||||
O << ".version 3.0\n";
|
unsigned PTXVersion = nvptxSubtarget.getPTXVersion();
|
||||||
|
O << ".version " << (PTXVersion / 10) << "." << (PTXVersion % 10) << "\n";
|
||||||
|
|
||||||
O << ".target ";
|
O << ".target ";
|
||||||
O << nvptxSubtarget.getTargetName();
|
O << nvptxSubtarget.getTargetName();
|
||||||
|
|
|
@ -34,16 +34,18 @@ DriverInterface(cl::desc("Choose driver interface:"),
|
||||||
|
|
||||||
NVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
|
NVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
const std::string &FS, bool is64Bit)
|
const std::string &FS, bool is64Bit)
|
||||||
:NVPTXGenSubtargetInfo(TT, "", FS), // Don't pass CPU to subtarget,
|
: NVPTXGenSubtargetInfo(TT, CPU, FS),
|
||||||
// because we don't register all
|
Is64Bit(is64Bit),
|
||||||
// nvptx targets.
|
PTXVersion(0),
|
||||||
Is64Bit(is64Bit) {
|
SmVersion(10) {
|
||||||
|
|
||||||
drvInterface = DriverInterface;
|
drvInterface = DriverInterface;
|
||||||
|
|
||||||
// Provide the default CPU if none
|
// Provide the default CPU if none
|
||||||
std::string defCPU = "sm_10";
|
std::string defCPU = "sm_10";
|
||||||
|
|
||||||
|
ParseSubtargetFeatures((CPU.empty() ? defCPU : CPU), FS);
|
||||||
|
|
||||||
// Get the TargetName from the FS if available
|
// Get the TargetName from the FS if available
|
||||||
if (FS.empty() && CPU.empty())
|
if (FS.empty() && CPU.empty())
|
||||||
TargetName = defCPU;
|
TargetName = defCPU;
|
||||||
|
@ -52,6 +54,12 @@ NVPTXSubtarget::NVPTXSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
else
|
else
|
||||||
llvm_unreachable("we are not using FeatureStr");
|
llvm_unreachable("we are not using FeatureStr");
|
||||||
|
|
||||||
// Set up the SmVersion
|
// We default to PTX 3.1, but we cannot just default to it in the initializer
|
||||||
SmVersion = atoi(TargetName.c_str()+3);
|
// since the attribute parser checks if the given option is >= the default.
|
||||||
|
// So if we set ptx31 as the default, the ptx30 attribute would never match.
|
||||||
|
// Instead, we use 0 as the default and manually set 31 if the default is
|
||||||
|
// used.
|
||||||
|
if (PTXVersion == 0) {
|
||||||
|
PTXVersion = 31;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,13 +25,18 @@
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
class NVPTXSubtarget : public NVPTXGenSubtargetInfo {
|
class NVPTXSubtarget : public NVPTXGenSubtargetInfo {
|
||||||
|
|
||||||
unsigned int SmVersion;
|
|
||||||
std::string TargetName;
|
std::string TargetName;
|
||||||
NVPTX::DrvInterface drvInterface;
|
NVPTX::DrvInterface drvInterface;
|
||||||
bool dummy; // For the 'dummy' feature, see NVPTX.td
|
bool dummy; // For the 'dummy' feature, see NVPTX.td
|
||||||
bool Is64Bit;
|
bool Is64Bit;
|
||||||
|
|
||||||
|
// PTX version x.y is represented as 10*x+y, e.g. 3.1 == 31
|
||||||
|
unsigned PTXVersion;
|
||||||
|
|
||||||
|
// SM version x.y is represented as 10*x+y, e.g. 3.1 == 31
|
||||||
|
unsigned int SmVersion;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// This constructor initializes the data members to match that
|
/// This constructor initializes the data members to match that
|
||||||
/// of the specified module.
|
/// of the specified module.
|
||||||
|
@ -69,6 +74,8 @@ public:
|
||||||
NVPTX::DrvInterface getDrvInterface() const { return drvInterface; }
|
NVPTX::DrvInterface getDrvInterface() const { return drvInterface; }
|
||||||
std::string getTargetName() const { return TargetName; }
|
std::string getTargetName() const { return TargetName; }
|
||||||
|
|
||||||
|
unsigned getPTXVersion() const { return PTXVersion; }
|
||||||
|
|
||||||
void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
|
void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
|
||||||
|
|
||||||
std::string getDataLayout() const {
|
std::string getDataLayout() const {
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -mattr=ptx30 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -mattr=ptx30 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .version 3.0
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_20 -mattr=ptx31 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 -mattr=ptx31 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .version 3.1
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_10 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_10 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_10
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_11 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_11 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_11
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_12 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_12 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_12
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_13 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_13 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_13
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_20 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_20
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_21 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_21 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_21
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_30 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_30 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_30
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
; RUN: llc < %s -march=nvptx -mcpu=sm_35 | FileCheck %s
|
||||||
|
; RUN: llc < %s -march=nvptx64 -mcpu=sm_35 | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK: .target sm_35
|
||||||
|
|
Loading…
Reference in New Issue