C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
18.88 MB
147 页
0 评论
语言 | 格式 | 评分 |
---|---|---|
中文(简体) | .pptx | 3 |
摘要 | ||
文档深入探讨了C++高性能并行编程中的访存优化策略,重点分析了内存访问规律、缓存行预取以及内存分配对性能的影响。通过矩阵乘法的实战案例,揭示了不连续内存访问导致的性能损失,并提出了通过合理分块和顺序访问来优化缓存性能的方法。同时,文档也探讨了并行编程中的计算瓶颈和内存瓶颈,指出并行只能加速计算部分,对内存访问的优化效果有限。最后,通过实测数据,展示了优化后的加速比达到24倍的成果。 | ||
AI总结 | ||
### 总结
1. **访存优化分析**
- i-2 和 i+2 跨步的访存模式表现不理想,可能还有优化空间,但因时间限制未深入。
- **矩阵乘法实战案例**:
- **访存规律**:
- a(i, j) 的访问地址固定,不利于优化。
- b(i, t) 访问模式跳跃,导致缓存性能差。
- c(t, j) 的连续访问模式较好。
- **问题根源**:b(i, t) 和 a(i, j) 的不连续访问导致矢量化失败,CPU无法启动指令级并行(ILP)。
- **优化措施**:
- 结合两种方法,使用 stream_ps 防止写回污染缓存。
- **最终加速比**:达到了24倍。
2. **内存分配与分页**
- **测试结果**:
- `vector` 写入两次时间一致(正常现象)。
- `malloc` 写入两次,第一次比第二次慢。
- `new int[n]` 与 `malloc` 性能一致,第一次写入较慢。
3. **硬件缓存预取与分块优化**
- 硬件自动识别线性访存规律(如顺序、逆序、连续、跨步),难以处理随机访存,导致 CPU 空转。
- **解决方案**:增大分块大小(如4KB,即64个缓存行),使得一次随机访问后伴随多次顺序访问,便于 CPU 预取缓存行,减少等待时间。
4. **内存带宽与计算瓶颈**
- **cpu-bound 与 memory-bound**:
- **计算瓶颈(cpu-bound)**:并行加速效果显著(如包含大量计算的循环体)。
- **内存瓶颈(memory-bound)**:并行无法加速,优化重点。
- **fill Stops**:纯访存操作和计算操作速度差异显著,可能因写回策略不同导致赋值1比赋值0慢一倍。
5. **其他资源**
- 课件和代码GitHub地址:[https://github.com/parallel101/course](https://github.com/parallel101/course)
- 相关视频:[https://www.bilibili.com/video/BV1fa411r7zp](https://www.bilibili.com/video/BV1fa411r7zp) |
P1
P2
P3
P4
P5
P6
P7
下载文档到本地,方便使用
- 可预览页数已用完,剩余
140 页请下载阅读 -
文档评分