没有合适的资源?快使用搜索试试~ 我知道了~
冯诺依曼架构与当代处理器1
需积分: 0 3 下载量 111 浏览量
2022-08-04
00:01:59
上传
评论 1
收藏 3.25MB PDF 举报
温馨提示
试读
12页
冯诺依曼架构与当代处理器翻:《Introduction to High Performance Scientific Computing》-Victor Eij
资源推荐
资源详情
资源评论
冯诺依曼架构与当代处理器
翻⾃:《Introduction to High Performance Scientific Computing》-Victor Eijkhout
李岳昆( realyurk@gmail.com )、蒋志政( gezelligheid@aliyun.com )译
知乎专栏: ⾼性能计算翻译计划
Github专栏: https://github.com/realYurkOfGitHub/translation-Introduction-to-HPC
了解计算机体系结构对于编写⾼效、科学的代码具有⼗分重要的作⽤。两段基于不同处理器
架构编写的代码,其计算结果可能相同,但速度差异可能从⼏个百分点到⼏个数量级之间不
等。显然,仅仅把算法放到计算机上是不够的,计算机架构也是⾄关重要的内容。
有些问题可以在单个中央处理单元(CPU)上解决,⽽有些问题则需要由多个处理器组成的
并⾏计算机解决。我们将在下⼀章详细介绍并⾏计算机,但即便是使⽤并⾏计算机处理,也
需要⾸先了解单个CPU的情况。
在该部分,我们将重点关注CPU及其内存系统内部发⽣的事情。⾸先讨论指令如何执⾏,研
究处理器核⼼中的运算;最后,由于内存访问通常⽐处理器执⾏指令要慢得多,因此我们将
重点关注内存、处理器以及处理器内部的数据移动情况;“flops(每秒浮点操作数)计数”作
为预测代码性能的时代已经⼀去不复返了。这种差异实际上是⼀个不断增长的趋势,所以随
着时间的推移,处理内存流量的问题变得越来越重要,⽽⾮逐渐销声匿迹。
这⼀章中,我们将对CPU设计是如何影响性能的,以及如何编写优化性能的代码等问题有⼀
个清晰的认识。想学习更多细节,请参阅关于PC架构的在线书籍[114],以及关于计算机架构
的标准⼯作,Hennesey和Patterson[97]。
# 冯·诺依曼架构
虽然各类计算机在处理器细节上存在很多不同,但也有许多相似之处。总的看来,它们都采
⽤了「冯·诺伊曼架构」(von Neumann architectures)。该架构主要包含:存储程序和数据的
内存,以及⼀个在“获取、执⾏、存储周期”中对数据进⾏操作的指令处理单元。
注释 1: 具有指定指令序列的模型也称为「 控制流」(control flow),与「数据流」(data
flow)相对应。
由于指令和数据共同存储在⼀个处理器中,这使得冯·诺依曼架构区别于早期或⼀些其他特殊
⽤途的硬接线当代处理器,能够允许修改或⽣成其他程序。这给我们提供了编辑器和编译
器:计算机可以将程序视为数据进⾏处理。
注释 2: 存储程序的概念允许⼀个正在运⾏的程序修改其源代码。然⽽,⼈们很快就意识到
这将导致代码变得难以维护,因此在实际中很少见到。
本书将不会讨论编译器将⾼级语⾔翻译成机器指令的过程,⽽是讨论如何编写⾼质量的程序
以确保底层运⾏的效率。
在科学计算中,我们通常只关注数据在程序执⾏期间如何移动,⽽⾮程序代码具体如何。⼤
多数应⽤中,程序与数据似乎是分开存储的。与⾼级语⾔不同,处理器执⾏的机器指令通常
会指定操作的名称,操作数和结果的位置。这些位置不是表⽰为内存位置,⽽是表⽰为「寄
存器」(registers)位置:即在CPU中被称作内存的⼀⼩部分。
注释 3: 我们很少分析到内存的架构,尽管它们已经存在。20世纪80年代的Cyber 205超级计
算机可以同时有三个数据流,两个从内存到处理器,⼀个从处理器到内存。这样的架构只有
在内存能够跟上处理器速度的情况下才可⾏,⽽现在已经不是这样了。
下⾯是⼀个简单的C语⾔例⼦:
及其X86汇编输出,由 gcc -O2 -S -o - store.c 得到:
void store(double *a, double *b, double *c) {
*c = *a + *b;
}
1
2
3
(程序演⽰的为64位系统输出;32位系统可以添加 -m64 指令输出)
这段程序的指令有:
从内存加载到寄存器;
执⾏加法操作;
将结果写回内存。
每条指令的处理如下:
指令获取:根据「 程序计数器」 (program counter)的指⽰将下⼀条指令装⼊进程。此
处我们不考虑这是如何发⽣以及从哪⾥发⽣的问题。
指令解码:处理器检查指令以确定操作和操作数。
内存获取:必要时,数据将从内存取到寄存器中。
执⾏:执⾏操作,从寄存器读取数据并将数据写回寄存器。
数组的情况稍微复杂⼀些:加载(或存储)的元素被确定为数组的基址后会加上⼀个偏移
量。
在某种程度上,现代CPU在程序员看来就像冯·诺伊曼机器,但也有各种例外。⾸先,虽然内
存看起来为随机寻址,但在实际中存在着「局部性」(locality)的概念:⼀旦⼀个数据项被
加载,相邻的项将更有效地加载,⽽重新加载初始项也会更快。
简单数据加载的另⼀个复杂之处是,当前的CPU同时操作多条指令,这些指令被称为“「正在
执⾏」(in flight)”,这意味着它们处于不同的完成阶段。当然,与这些同步指令⼀起,它们
的输⼊和输出也以重叠的⽅式在内存和处理器之间移动。这是超标量CPU体系结构的基本思
想,也被称为「指令级并⾏」(Instruction Level Parallelism,ILP)。因此,虽然每个指令可
能需要⼏个时钟周期才能完成,但处理器可以在合适的情况下每个周期完成⼀条指令;在某
.text
.p2align 4,,15
.globl store
.type store, @function
store:
movsd (%rdi), %xmm0 # Load *a to %xmm0
addsd (%rsi), %xmm0 # Load *b and to %xmm0
movsd %xmm0, (%rdx) # Store to *c
ret
1
2
3
4
5
6
7
8
9
剩余11页未读,继续阅读
资源评论
daidaiyijiu
- 粉丝: 16
- 资源: 322
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功