frame
xla是tensorflow自带的一个可以支持llvm自定义后端的编译器。
nvvm IR是NVDIA在LLVM IR上做的built-in扩展,CPU和GPU两个target处理应该走了不同的分支,GPU优化时生成了llvm.fma.intrinsic。
GAS
https://llvm.org/docs/NVPTXUsage.html
declare i32 @llvm.nvvm.read.ptx.sreg.tid.x()
declare i32 @llvm.nvvm.read.ptx.sreg.tid.y()
declare i32 @llvm.nvvm.read.ptx.sreg.tid.z()
declare i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
declare i32 @llvm.nvvm.read.ptx.sreg.ntid.y()
declare i32 @llvm.nvvm.read.ptx.sreg.ntid.z()
declare i32 @llvm.nvvm.read.ptx.sreg.ctaid.x()
declare i32 @llvm.nvvm.read.ptx.sreg.ctaid.y()
declare i32 @llvm.nvvm.read.ptx.sreg.ctaid.z()
declare i32 @llvm.nvvm.read.ptx.sreg.nctaid.x()
declare i32 @llvm.nvvm.read.ptx.sreg.nctaid.y()
declare i32 @llvm.nvvm.read.ptx.sreg.nctaid.z()
declare i32 @llvm.nvvm.read.ptx.sreg.warpsize()
GPU版本的CPU版本的target不同,一个是X86,另一个是NVDIA-CUDA。CPU版本用的是正常的IR,而GPU版本使用了llvm.nvvm.read.ptx.sreg.ctaid.x等built-in函数。(tensorflow的XLA编译器(相当于clang),根据不同的选项/target,生成了不同的LLVM IR,我们是否也要进行到这一步)
我们是不是也是用XLA生成某些特殊的IR,如llvm.nvvm.read.ptx.sreg.ctaid.x等built-in函数,在后端再对其进行处理。
nvvm IR是NVDIA在LLVM IR上做的built-in扩展
NVCC是cuda提供的C/C++编译器。
https://zhuanlan.zhihu.com/p/91334380
CUDA Toolkit由以下组件组成:
- Compiler: CUDA-C和CUDA-C++编译器
NVCC位于bin/目录中。它建立在NVVM优化器之上,而NVVM优化器本身构建在LLVM编译器基础结构之上。因此开发人员可以使用nvm/目录下的Compiler SDK来直接针对NVVM进行开发。