CPU和GPU

CPU

img

提升CPU利用率1

  • 在计算\(a + b\)之前,需要准备数据
    • 主内存->L3缓存->L2缓存->L1缓存->CPU寄存器
    • L1访问延时:0.5ns
    • L2访问延时:7ns(\(14\times L1访问延时\)
    • L3访问延时:100ns(\(200\times L2访问延时\)
  • 提升空间和时间的内存本地性
    • 时间:重用数据使得保持它们在缓存里
    • 空间:减少读写数据使得可以预读取

样例分析

  • 如果一个矩阵是按行存储,访问一行会比访问一列要快
    • CPU一次读取64字节(缓存线)
    • CPU会“聪明地”提前读取下一个缓存线

img

提升CPU利用率2

  • 高端CPU有几十个核
    • EC2 P3.16xlarge:2 Intel Xeon CPUs, 32 物理核
  • 并行来利用所有核
    • 超线程不一定提升性能,因为它们共享寄存器

样例分析

  • 上面比下面慢
for i in range(len(a)):
    c[i] = a[i] + b[i]
c = a + b
  • 上面调用了len(a)+操作,而下面只调用了一次
  • 右边很容易并行(例如下面的C++代码)
#pragma omp for 
for (i=0; i<a.size(); i++){
    c[i] =a[i] + b[i];
}

GPU

img

提升GPU利用率1

  • 并行
    • 使用数千个线程
  • 内存本地性
    • 缓存更小,架构更加简单
  • 少用控制语句
    • 支持有限
    • 同步开销很大

CPU vs GPU

一般/高端

img

总结

  • CPU:可以处理通用计算。性能优化考虑数据读写效率和多线程
  • GPU:使用更多的小核和更好的内存带宽,适合能大规模并行的计算任务
posted @ 2024-08-07 20:03  codersgl  阅读(12)  评论(0编辑  收藏  举报