CUDA Performance Analysis
学习视频参考(视频有提供ppt):https://www.bilibili.com/video/BV13w411o7cu/?from=search&seid=13327380806166965269&spm_id_from=333.337.0.0&vd_source=98d46c524d240bd89f118ad90be17aef
学习视频参考(视频有提供ppt):https://www.bilibili.com/video/BV13w411o7cu/?from=search&seid=13327380806166965269&spm_id_from=333.337.0.0&vd_source=98d46c524d240bd89f118ad90be17aef
本篇文章作为阅读 科研论 后的一些总结与个人思考
确保不断演化的模型能够在新型硬件上高效运行
目前主流深度学习编译器工作流程:
基于 SIMT 的计算范式在前期同构的加速器硬件上(例如只存在 Cuda Core)表现良好,但在配置异构单元的硬件上,加速收益比逐渐降低
程序运行的基本步骤:
_start -> __libc_start_main -> main
| 分类 | 方法/函数 | 头文件 | 用途 | 示例代码 | 适用场景 |
|---|---|---|---|---|---|
| C++ 流式读写 | std::ifstream | 文本/二进制读 | cpp std::ifstream fin(“a.txt”); fin » x; | 类型安全的高层读写 | |
| std::ofstream | 文本/二进制写 | cpp std::ofstream fout(“a.txt”); fout « x; | |||
| std::fstream | 文本/二进制读写 | cpp std::fstream file(“a.bin”, std::ios::binary|std::ios::in|out); | 需要随机访问的二进制文件 | ||
| C 标准库 | fopen() + fread()/fwrite() | <stdio.h> | 二进制读写 | c FILE* f = fopen(“a.bin”, “rb”); fread(&x, sizeof(int), 1, f); | 跨平台二进制操作 |
| fopen() + fscanf()/fprintf() | <stdio.h> | 格式化文本读写 | c fprintf(f, “%d”, x); | 结构化文本文件 | |
| fgets()/fputs() | <stdio.h> | 行式文本读写 | c fgets(buf, 100, f); | 逐行处理文本 | |
| POSIX 系统调用 | open() + read()/write() | <fcntl.h> | 低层二进制读写 | c int fd = open(“a.bin”, O_RDWR); read(fd, &x, sizeof(x)); | 需要精细控制(如非阻塞IO) |
| mmap() | <sys/mman.h> | 内存映射文件 | c void* p = mmap(…, fd, …); | 大文件随机访问 | |
| 内存文件 | fmemopen() (POSIX) | <stdio.h> | 将内存模拟为文件 | c FILE* memf = fmemopen(buf, size, “r+”); | 内存数据流处理 |
| std::stringstream | C++ 内存流 |
有时候涉及到文件流和字符串流综合运用的场景
graph TD
A[Processor] --> B[Top Core]
B --> C[Big Core]
B --> D[SPM Controller]
C --> E[Frontend]
C --> F[Backend]
E --> G[指令解码/分发]
F --> H[执行单元阵列]
H --> I[标量执行单元]
H --> J[向量执行单元]
H --> K[特殊功能单元]graph TD
A[Processor] --> B[Top Core]
B --> C[Big Core]
B --> D[SPM Controller]
C --> E[Frontend]
C --> F[Backend]
E --> G[指令解码/分发]
F --> H[执行单元阵列]
H --> I[标量执行单元]
H --> J[向量执行单元]
H --> K[特殊功能单元]| 模块 | 功能描述 | 适用场景 |
|---|---|---|
| Frontend | 指令获取、解码、分发(支持VLIW超长指令字) | 多发射/多流水线架构(如VLIW) |
| Backend | 执行单元阵列管理,包含标量/向量/特殊功能单元 | 简单顺序或单发射流水线 |
| SPM Controller | 共享内存(ScratchPad Memory)管理,支持多端口并行访问 | |
| DMA Engine | 高速数据传输(DRAM <-> SPM) | |
| FSM & Ctrl | 状态机控制模块,处理异常、中断和调试接口 |
指令的排布需要考虑流水线的模式,RAW 等冲突是可能存在的,例如 SMOVI 指令后可能需要跟一个 SNOP 以等待写回阶段的完成,后面的连续指令才能正常访问寄存器的值