- 内存延迟:一个内存访问所需的时间
- 内存带宽:每秒可以得到的数据
Stalls与多线程
Stalls指的是处理器不能处理一条指令,因为该指令依赖于之前指令的结果。
ld r0 mem[r2]
ld r1 mem[r3]
add r0,r0,r1 // cannot execute before upper two instructions
现代处理器会通过预读数据,使得在执行指令时数据已经存在于缓存中,从而减轻stalls的影响。
另一种方式是通过调度的形式,在遇到stalls时执行不同的线程。
执行完其他任务并调度回原来的线程时,指令所需的数据已经处理完毕,就可以继续处理指令流了。
该做法提升了CPU的利用率,可以看成带宽增加。但是对于每一个线程,由于所需的数据可能在调度前就已经完成了,但是由于此时正在处理其他线程,因此单一线程的处理速度会降低。
- 优点
- 处理器资源更高的利用率
- 更高的带宽
- 减少内存延迟影响
- 缺点
- 对于线程上下文而言,需要额外的存储
- 但线程运行速率下降
- 调度开销
- 对于每个线程来说更加依赖内存通信,因为缓存空间减少了
对于SIMD来说,如果通过并发频繁对内存进行数据访问,那么其性能表现将比预期差。