我很难为这个问题制定一个标题,我不认为我做得很好,所以如果有人有更好的想法,编辑按钮就是你的了。
考虑到内存操作在绝对最好的情况下花费3-4个周期,而且可能更多,而且读取比内存总线“窄”的数据不是次优的,汇编语言当前生成的结构不是也是次优的吗?
注册操作花费的时间要少得多,那么为什么程序集不获取表达式之前评估表达式并快速执行表达式所需的所有数据,从而减少线程切换,并允许处理器执行其他线程。
get data 1 - 4 cycles
perform calculation 1 - 1 cycle
get data 2 - 4 cycles
perform calculation 2 - 1 cycle
get data 3 - 4 cycles
perform calculation 3 - 1 cycle最后,有15个周期的CPU使用。
get all data sequentially - 8 cycles
perform calculation 1 - 1 cycle
perform calculation 2 - 1 cycle
perform calculation 3 - 1 cycle11个周期使用,这是25%的改善。另外,实际CPU只忙了3个周期,因为内存是由专用的片上硬件控制器获取的,空闲时间要长得多。
我认为CPU在等待第一个“示例”中的数据时,也可以安排其他代码执行,但是窗口要短得多,而且由于切换上下文会造成周期损失,因此我认为第二种方法虽然更渴望注册,但应该能够提高CPU的整体性能。毕竟,现代处理器都至少有16个寄存器,即使是目前一代新一代移动设备ARM芯片也有32个寄存器。那为什么这么保守?也许编译器还停留在8台注册机器的时代?
这个假设成立吗?还是说当前的CPU架构并不是为了从这种机制中获益?我假设当CPU在等待数据时,它可以执行其他代码,特别是考虑到大多数现代处理器是无序的,所以在最坏的情况下,您将浪费同样的时间来获取数据,但是拥有所有的数据将允许代码片段被更快地执行,从而使处理器延迟更短的时间。
发布于 2013-08-16 21:38:37
CPU不切换线程,调度程序切换线程。
现代CPU不按严格顺序一次执行一个指令。它们执行投机性获取,并提前阅读合并,以避免您正在谈论的延迟。
而且,在一台现代机器上,如果一次获取必须一直到内存(称为"L2错过“),那么代价就相当于200个周期。
https://stackoverflow.com/questions/18282423
复制相似问题