1. 引言/Preface¶
1.1. 目的/Purpose¶
文档主要介绍TopsCC基础工具集中clang / llc / lld / fatbinary / llvm-mc / llvm-objdump / llvm-dis的需求说明
1.2. 术语/Glossary¶
Name |
Description |
---|---|
|
燧原AI 加速卡 |
|
燧原编程平台 |
|
C/C++ 编译器 |
|
编译器 |
|
链接器 |
|
生成包含设备端和主机端运行程序的二进制文件 |
|
汇编器 |
|
反汇编器 |
|
查看目标文件或可执行文件的组成信息 |
1.3. 版本/Revision History¶
Version |
Date |
Author |
Note |
---|---|---|---|
v0.1.0 |
Apil. 13, 2023 |
Baoqi Liu |
创建文档结构 |
v0.1.1 |
Aug. 15, 2023 |
Zhongjun Zhang |
补充clang/topscc选项 |
1.4. 参考/Reference¶
[CUDA Compiler Driver NVCC] (https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html)
[CUDA Binary Utilities] (https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html)
2. 概述/Overview¶
2.1. 系统结构图/Architecture¶
2.2. 功能概述/Function Description¶
本文档的这一部分提供有关以下工具的命令行选项的常见详细信息:
clang / llc / lld / fatbinary / llvm-mc / llvm-objdump / llvm-dis
上面工具参考以下规则:
每个命令行选项都有一个长名称和一个短名称。
长名称之前必须有两个连字符。例如,
--include-path
短名称之前必须有一个连字符。例如,
-I
识别三种类型的命令选项:布尔选项、单值选项和列表选项。
布尔选项:没有参数
单值选项:参数只能指定一个
列表选项:参数可以指定多个
Boolean option : disasm --print-raw <file>
Single value : disasm --arch GCU200 <file>
List options : llvm-objdump --function "foo,bar,foobar" <file>
单值选项和列表选项必须有参数,参数必须在选项名称后跟一个或多个空格或等号字符。
单字符短名称时,选项的值也可以紧跟在选项本身之后,而不用空格或等号字符分隔。
列表选项的各个值可以在选项的单个实例中用逗号分隔,或者选项可以重复,或者这两种情况的任意组合。
-o file
-o=file
-Idir1,dir2 -I=dir3 -I dir4,dir5
2.3. 安装方法/Installation¶
用户首先需要获取并下载TopsCC安装包,并在自定义路径下安装。
支持的系统:Ubuntu 16.04.z(z<=6)、Ubuntu 18.04.z(z<=6)、Ubuntu 20.04.z(z<=5)、Redhat linux 8.6
第一步:获取并下载 TopsCC 安装包
$ wget https://.../topscc.run
第二步:在自定义路径下安装 TopsCC
$ topscc.run /your/install/dir/
默认将安装至 /opt/topscc/
目录下
第三步: 设置环境变量
安装完成后,为方便后续使用TopsCC,需要将
所指定安装目录
/your/install/dir/bin
加入到环境变量PATH
中
$ export PATH=/your/install/dir/bin:$PATH
3. 详细设计/Detail Design¶
3.1. clang¶
命令行接口/Command Interface¶
选项(长) |
选项(短) |
功能要求 |
默认值 |
注释 |
---|---|---|---|---|
|
|
帮助 |
||
|
|
运行预编译阶段 |
||
|
运行预编译、编译阶段 |
生成程序集文件 |
||
|
运行预编译、编译、汇编阶段 |
生成目标.o文件如果没有选择任何阶段参数选项的默认参数 |
||
|
优化等级-O0 不做优化,通常用于debug-O3 执行大部分优化 |
|||
|
根据target生成特定code |
dtu |
||
|
根据mcpu生成特定code,支持:gcu200/gcu210/gcu300 |
N/A |
||
|
|
指定include 文件路径 |
||
|
|
指定输出文件路径 |
||
|
|
使用llvm ir bitcode作为输出 |
||
|
将每个func放在自己的段 (ELF Only) |
|||
|
往llc中传递参数 |
|||
|
禁止函数inline |
使用范例/Use Case¶
USAGE: clang [options] file…
Example: clang --target=dtu -mcpu=gcu300 -O3 -S test.cpp -o test.s
3.2. topscc¶
命令行接口/Command Interface¶
选项(长) |
选项(短) |
功能要求 |
默认值 |
注释 |
---|---|---|---|---|
|
|
显示topscc版本号 |
||
|
|
topscc支持的c++标准,目前支持c++11, c++14, c++17 |
c++11 |
|
|
|
topscc编译出指定架构的目标代码,支持:gcu200,gcu210, gcu300 |
gcu200 |
生成特定架构的代码 |
|
|
生成预处理后的代码,后缀以topsi结尾,内部包含host和device代码 |
||
|
|
生成汇编代码,其中混合了host和device代码 |
||
|
|
生成机器码,其中包含host和device机器码 |
||
|
|
topscc对设备端代码的处理,默认是整体程序模式,用户需要保证所有设备端代码位于单一源码文件中,但加rdc选项可以将设备代码存储于多个不同的源码文件中,更利于软件项目管理 |
||
|
|
将包含设备端的代码编译成动态库 |
||
|
|
将编译过程中产生的中间文件保存在当前目录中,方便定位问题 |
||
|
|
定义宏 |
||
|
|
消除宏定义 |
||
|
|
最高级别优化选项 |
|
|
|
|
指定库文件搜索路径 |
||
|
|
打印编程时出现的warning |
||
|
|
增加调试信息 |
||
|
|
查看topscc支持的选项 |
||
|
|
根据target生成特定code,支持gcu200/gcu210/gcu300 |
gcu200 |
|
|
|
指定include文件路径 |
使用范例/Use Case¶
USAGE: clang [options] file…
Example: topscc a.cpp -arch gcu210 -ltops -o a.out
3.3. llc¶
命令行接口/Command Interface¶
长选项 |
短选项 |
功能要求 |
---|---|---|
|
指定硬件架构 |
|
|
生成具体GCU型号的指令 |
|
|
|
显示可用选项 |
|
包含搜索路径 |
|
|
优化级别。[-O0, -O1, -O2, or -O3] |
|
|
将每个func放在自己的段 (ELF Only) |
使用范例/Use Case¶
USAGE: llc [options]
Example: llc --march=dtu -mcpu=gcu200 test.ll -o test.s
OPTIONS:
Color Options:
–color - Use colors in output (default=autodetect)
General options:
Generic Options:
3.4. lld¶
命令行接口/Command Interface¶
长选项 |
短选项 |
功能要求 |
---|---|---|
/ |
|
链接tops runtime库 |
/ |
|
输出路径 |
|
|
包含库文件搜索路径 |
|
编译成共享库 |
|
|
|
查看可用选项 |
使用范例/Use Case¶
USAGE: ./ld.lld [options] file…
3.5. fatbinary¶
命令行接口/Command Interface¶
使用范例/Use Case¶
Usage : fatbinary [options]
Option:
–help (-h)
Print this help information on this tool.
–version Print version information on this tool.
3.6. llvm-mc¶
llvm-mc
汇编器,将汇编代码转换成机器码。
命令行接口/Command Interface¶
长选项 |
短选项 |
可选值 |
功能要求 |
---|---|---|---|
|
|
dtu |
指定GCU架构 |
|
|
+gcu200, +gcu210, +gcu300 |
生成架构特定的GCU指令 |
|
asm, obj |
选择输出文件格式 |
|
|
指定包含文件路径 |
||
|
指定输出文件 |
||
|
显示指令编码 |
使用范例/Use Case¶
USAGE: llvm-mc [options]
Example:
llvm-mc test.s --arch=dtu -mattr=+gcu300 -filetype=obj -o test.o
3.7. llvm-objdump¶
llvm-objdump
从二进制文件(独立的和嵌入在主机二进制文件中的文件)中提取信息,并以可读的格式呈现它们。
命令行接口/Command Interface¶
// 下面是cuda cuobjdump的选项,参考并形成topscc的objdump选项
选项(长) |
选项(短) |
描述 |
---|---|---|
|
|
转储所有 fatbin 部分。默认情况下只会转储可执行 fatbin 的内容(如果存在),否则如果没有可执行 fatbin 则可重定位 fatbin。 |
|
|
反汇编特定GCU架构的文件,可选值:gcu200/gcu300 |
|
|
反汇编机器指令 |
|
|
反汇编时不忽略0值 |
|
使用十六进制格式显示立即数 |
|
|
|
打印有关此工具的此帮助信息。 |
|
|
打印有关此工具的版本信息。 |
使用范例/Use Case¶
llvm-objdump Options:
USAGE: llvm-objdump [options]
Example: llvm-objdump -mcpu=gcu300 -dz test.o -o test.dump
3.8. llvm-dis¶
llvm-dis
从独立的bitcode文件中提取信息并以人类可读的格式呈现它们。disasm
的输出包括每个内核的
汇编代码、ELF 数据部分等。
命令行接口/Command Interface¶
选项(长) |
选项(短) |
描述 |
---|---|---|
|
加载模块而不具体化元数据,则仅具体化元数据 |
|
|
指定输出文件名 |
使用范例/Use Case¶
USAGE: llvm-dis [options]
Example: llvm-dis test.bc -o test.ll