• 内存延迟:一个内存访问所需的时间
  • 内存带宽:每秒可以得到的数据

Stalls与多线程

Stalls指的是处理器不能处理一条指令,因为该指令依赖于之前指令的结果。

  1. ld r0 mem[r2]
  2. ld r1 mem[r3]
  3. add r0,r0,r1 // cannot execute before upper two instructions

现代处理器会通过预读数据,使得在执行指令时数据已经存在于缓存中,从而减轻stalls的影响。

另一种方式是通过调度的形式,在遇到stalls时执行不同的线程。

执行完其他任务并调度回原来的线程时,指令所需的数据已经处理完毕,就可以继续处理指令流了。

6.png

该做法提升了CPU的利用率,可以看成带宽增加。但是对于每一个线程,由于所需的数据可能在调度前就已经完成了,但是由于此时正在处理其他线程,因此单一线程的处理速度会降低。

  • 优点
    • 处理器资源更高的利用率
    • 更高的带宽
    • 减少内存延迟影响
  • 缺点
    • 对于线程上下文而言,需要额外的存储
    • 但线程运行速率下降
    • 调度开销
    • 对于每个线程来说更加依赖内存通信,因为缓存空间减少了

对于SIMD来说,如果通过并发频繁对内存进行数据访问,那么其性能表现将比预期差。