計畫網頁
建置 LLVM
Sample programs for the LLVM PTX back-end
- CMake and the NVidia CUDA toolkit
- Clang/LLVM which was built with the PTX back-end
- 編譯 LLVM 和 Clang。
$ ssh tesla $ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm $ cd llvm/tools $ svn co http://llvm.org/svn/llvm-project/clang/trunk clang $ mkdir build; cd build $ ../llvm/configure --prefix=$INSTALL --enable-targets=host,ptx $ make
- 編譯 ptx sample。注意! 範例已用 OpenCL 改寫。請在機器上安裝 OpenCL。
$ git clone git://github.com/jholewinski/llvm-ptx-samples.git $ cd llvm-ptx-samples # 抓下 libclc $ git submodule init && git submodule update $ mkdir build $ cd build $ cmake .. $ make
- 測試。請在執行檔所在目錄執行,否則會抓不到對映的 PTX 檔。
$ cd build/bin $ ./ocl-blur2d ------------------------------ * Source Kernel ------------------------------ Number of Iterations: 16 Total Time: 7.05218 sec Average Time: 0.440761 sec ------------------------------ * Binary Kernel ------------------------------ Number of Iterations: 16 Total Time: 7.05264 sec Average Time: 0.44079 sec
測試
詳細請見 LLVM Testing Infrastructure Guide。
$ cd build $ ./Debug+Asserts/bin/llvm-lit ${LLVM_SOURCE}/test/test/CodeGen/PTX/xxx.ll
開發手冊
- 執行以下指令可得知 PTX 版本演進。
$ cd llvm/lib/Target/PTX $ svn log
- PTXSubtarget.h 裡面的 Shader Model 代表 CUDA 定義的 compute capability。
SM 1.0 ~ G80 SM 1.3 ~ G200 SM 2.0 ~ GF100 SM 2.1 ~ GF10x
TODO
Add subtarget PTX23Add .address_size support- Add ftz support
-
- add, sub, mul, fma. mad, div, abs, neg, min, max, rcp, rcp.approx.ftz.f64, sqrt, rsqrt, sin, cos, lg2, ex2
- set, setp, slct
- cvt
- Generate rcp instruction
lib/Target/PTX
- PTXTargetMachine.* : 為
include/llvm/Target/TargetMachine.h
中 LLVMTargetMachine 的子類。 - PTXRegisterInfo.* : 定義目標平台暫存器。
- PTXInstrInfo.* 和 PTXInstrFormats.td : 定義目標平台指令集。
- PTXISelDAGToDAG.* 和 PTXISelLowering.* : 如何從 DAG 轉成目標平台指令。
- PTXAsmPrinter.* : 輸出目標平台匯編代碼。
- PTXSubtarget.* : 目標平台變種。
- PTXMFInfoExtract.cpp 和 PTXFPRoundingModePass.cpp : 有些情況需要寫額外的 pass。
-
- PTXMachineFunctionInfo.*
InstrInfo.td
請參考 Tutorial: Building a backend in 24 hours 21 頁。
def ii64 : InstPTX<(outs RC:$d), (ins MEMii64:$a), !strconcat(opstr, !strconcat(typestr, "\t$d, [$a]")), [(set RC:$d, (pat_load ADDRii64:$a))]>, Requires<[Use64BitAddresses]>;
詳細格式請見 TableGen Fundamentals。outs
代表該指令的結果要存到哪,ins
代表該指令的運算元。strconcat
用來將後面字串連結起來 (TableGen values and expressions)。
如果要新增指令,請參考 include/llvm/Target/TargetSelectionDAG.td
。該檔定義指令是使用 SDNode 或是 PatFrag1)。
不同版本硬體提供不同特性是使用 Subtarget Support 描述。SubtargetFeature
定義在 include/llvm/Target/Target.td
。
def FeaturePTX23 : SubtargetFeature<"ptx23", "PTXVersion", "PTX_VERSION_2_3", "Use PTX Language Version 2.3", [FeaturePTX22]>;
FMA (Fused-Multiply Add) 會有 ulp rounding error (Unit in the last place)。
def FeatureFMA : SubtargetFeature<"fma","SupportsFMA", "true", "Support Fused-Multiply Add">;
LLVM 不直接支援 not %x
,改用 xor %x, 1
。為避免把 xor %x, 1
對應到 xor
,需要 custom lowering,參考 X86ISelLowering.cpp。
Q & A
Submitted Patch
- Add subtarget PTX23
- Add .address_size directive