机器学习 / A LEAF IN THE GARDEN
深度学习硬件
机器学习 · 动手深度学习。来自 Daily Learning 的学习笔记。
CPU
分区
- 集成显卡
- CPU 核心
- 内存 I/O
- 三级缓存
内存访问
计算前需要准备数据
数据传输很耗时,所以要提升内存本地性
- 时间: 重用数据,使它们保持在缓存中
- 空间: 按序读写数据,使得可以预读取
eg.
矩阵,按行访问可以预读取,比按列访问快很多
并行
- 并行来利用 CPU 的多个核心
- 超线程共享寄存器,不一定提升性能
eg.
串行:
for i in range(len(a)): c[i] = a[i] + b[i]并行:
c = a + bnumpy、torch 等框架底层并行度较高,不要傻傻用 for loop
GPU
GPU 核心数远大于 CPU,但核心更简单,适合大规模并行计算,每个单元计算任务量小。
CPU vs GPU
不知道哪来的数据,但大体是这个意思
| CPU | GPU | |
|---|---|---|
| 核心数 | 6-64 | 2K-10K |
| TFLOPS | 0.2-1 | 10-150 |
| 内存 | 16GB-1TB | 16GB-128GB |
| 内存带宽 | 30-100 GB /s | 400GB - 1TB /s |
提升 GPU 利用率
- 并行: 使用数千数万个线程
- 内存本地性: 缓存更小,架构更简单
- 少用控制语句(if/loop): 同步开销大
带宽
不要频繁在 CPU 和 GPU 之间传输数据。
- CPU-内存: 30 GB/s
- GPU-内存: 480 GB/s
- CPU-GPU: 16 GB/s(PCIe 3.0)
带宽有限制,且同步开销大
高性能计算编程
- CPU: C++ 或 Fortran 等高性能语言
- GPU
- Nvidia 上用 CUDA
- 其他用 OpenCL