計畫網頁

建置 LLVM

Sample programs for the LLVM PTX back-end

  1. CMake and the NVidia CUDA toolkit
  2. Clang/LLVM which was built with the PTX back-end
  3. 編譯 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
  4. 編譯 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
  5. 測試。請在執行檔所在目錄執行,否則會抓不到對映的 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

lib/Target/PTX

  1. PTXTargetMachine.* : 為 include/llvm/Target/TargetMachine.h 中 LLVMTargetMachine 的子類。
  2. PTXRegisterInfo.* : 定義目標平台暫存器。
  3. PTXInstrInfo.* 和 PTXInstrFormats.td : 定義目標平台指令集。
  4. PTXISelDAGToDAG.* 和 PTXISelLowering.* : 如何從 DAG 轉成目標平台指令。
  5. PTXAsmPrinter.* : 輸出目標平台匯編代碼。
  6. PTXSubtarget.* : 目標平台變種。
  7. PTXMFInfoExtract.cpp 和 PTXFPRoundingModePass.cpp : 有些情況需要寫額外的 pass。

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 Fundamentalsouts 代表該指令的結果要存到哪,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

外部連結

登录