名片:
作者简介:乐于分享知识的大二在校生
本系列专栏: (点击直达)编译原理
致读者:欢迎评论与私信,对于博客内容的疑问都会尽量回复哒!!!
本文序:
⛰️本文介绍:本文是整个编译原理专栏的相关知识的补充(注:因编者时间有限,所以有一些图片来源于网络,为了尊重原作者,所以选择保留水印)
⚓本文食用方法:本文介绍了CUDA,NVCC和LLVM。如果您对于该专栏有兴趣,可以查看主页,了解更多UWU
❤️如果本文对您有所帮助的话,请三连鸭UWU
一:CUDA与NVCC(Compute Unified Device Architecture)
2.1 定义与背景
- CUDA 不是一种编译器,而是一个异构计算平台和编程模型,其核心目的是利用 GPU 加速计算。不过,CUDA 生态中包含一个专用的编译器(NVCC)
- 它扩展了 C/C++ 等语言,允许开发者直接编写 GPU 上运行的代码。
2.2 核心组件
- 编程模型
- Kernels:GPU 上并行执行的函数,通过
<<<...>>>
语法启动。
- 线程层次:线程(Thread)→ 线程块(Block)→ 网格(Grid),支持多维并行。
- 工具链
- NVCC(NVIDIA CUDA Compiler):将 CUDA 代码编译为 GPU 可执行的二进制文件(PTX 和二进制指令)。
- CUDA Runtime API:管理 GPU 设备、内存和任务调度。
- 库与生态系统
- cuBLAS/cuDNN:加速线性代数和深度学习计算。
- Thrust:类似 STL 的并行算法库。
- NVIDIA 硬件支持:依赖 NVIDIA GPU(如 Tesla、GeForce、Quadro 系列)。
二:LLVM(Low Level Virtual Machine)
2.1 定义与背景
- LLVM 是一个开源的编译器基础设施项目,提供模块化的编译器组件,支持多种编程语言和硬件架构。
- 核心思想:通过中间表示(IR)将编译过程分为前端、优化器和后端,实现高度可扩展性。
2.2 核心组件
- 前端
- 将不同语言(如 C/C++、Rust、Swift)的源代码转换为统一的 LLVM IR。
- 例如:Clang(C/C++ 前端)、Rustc(Rust 前端)。
- 中间表示(IR)
- 一种低级的、与硬件无关的指令集,兼具人类可读性(文本格式)和机器可操作性(二进制格式)。
- 优化器对 IR 进行静态分析和优化(如循环展开、内联函数)。
- 后端
- 将优化后的 IR 转换为目标平台的机器码(如 x86、ARM、GPU)。
- 支持多种指令集和架构。
2.3 应用场景
- 编译器开发:快速构建新语言的编译器(如 Swift 语言基于 LLVM)。
- 跨平台支持:同一份 IR 可生成不同硬件(CPU/GPU)的代码。
- 静态分析与优化:代码性能分析、安全漏洞检测。
- JIT 编译:动态生成机器码(如 Python 的 Numba、Julia 语言)。
三:CUDA vs LLVM:
两种途径编译得到cuda的代码(ptx汇编语言程序)
- 通过CUDA C实现函数,使用nvcc编译它们,得到ptx代码。
- 用不同的语言编写代码,从中生成LLVM IR,并使用NVPTX后端将其编译为ptx.