硬件
2023-05-09 15:04:53 0 举报
AI智能生成
硬件脑图
作者其他创作
大纲/内容
树莓派
Raspberry Pi(中文名为“树莓派”,简写为RPi),(或者RasPi / RPI) [1] 是为学习计算机编程教育而设计,只有信用卡大小的微型电脑,其系统基于Linux
计算机系统底层架构
电控开关
1+1=2 加法器
先行进位&并行进位
组成原理
CPU
架构
服务器
对称多处理器结构(SMP:Symmetric Multi-Processor)
对称多处理器结构
UMA(Uniform Memory Access),直译为“统一内存访问”
这样的架构对软件层面来说非常容易,总线模型保证所有的内存访问是一致的,即每个处理器核心共享相同的内存地址空间
非一致存储访问结构(NUMA:Non-Uniform Memory Access)
不同的内存器件和CPU核心从属不同的 Node,每个 Node 都有自己的集成内存控制器(IMC,Integrated Memory Controller)。
不同的 Node 间通过QPI(Quick Path Interconnect)进行通信
QPI的延迟要高于IMC Bus,也就是说CPU访问内存有了远近(remote/local)之别,而且实验分析来看,这个差别非常明显。
海量并行处理结构(MPP:Massive Parallel Processing)。
存储器共享方式
均匀存储器存取(Uniform-Memory-Access,简称UMA)模型
非均匀存储器存取(Nonuniform-Memory-Access,简称NUMA)模型
品牌
ARM公司: arm架构
intel公司: intelx86系列架构
AMD公司: amdx86系列架构
SIMD
SIMD(Single Instruction Multiple Data)是单指令多数据技术
MMX(Multi Media eXtension,多媒体扩展指令集)
提供了8个64bit的寄存器进行SIMD操作
通过复用CPU内部x87浮点单元的寄存器来实现SIMD的,所以与运行浮点运算的x87指令集有冲突,两者不能交叉使用,必须先进行切换
只支持整数操作
SSE(Stream SIMD Extentions,数据流单指令多数据扩展)
SSE系列提供了8个128bit的寄存器进行SIMD操作
引入新的独立寄存器解决了与浮点运算间的冲突问题
AVX指令集
Intel AVX指令集,在单指令多数据流计算性能增强的同时也沿用了的MMX/SSE指令集。不过和MMX/SSE的不同点在于增强的AVX指令,从指令的格式上就发生了很大的变化。x86(IA-32/Intel 64)架构的基础上增加了prefix(Prefix),所以实现了新的命令,也使更加复杂的指令得以实现,从而提升了x86 CPU的性能。
AVX2
AVX512
512-bit
组成
寄存器
指令指针寄存器
控制器
指令寄存器(IR )
存放指令
指令译码器( ID )
从主存获取操作数放入高速缓存L1
操作用户程序 数据段
操作控制器( OC )
从用户程序取指令,放入寄存器
运算器
总线
缓存一致性协议
内存屏障(Memory Barrier)
Intel 的MESI协议
modified(修改)、exclusive(互斥)、share(共享)、invalid(无效)
该变量超过一个缓存行的大小,缓存一致性协议是针对单个缓存行进行加锁,此时,缓存一致性协议无法再对该变量进行加锁,只能改用总线加锁的方式。
1、CPU1从内存中将变量a加载到缓存中,并将变量a的状态改为E(独享),并通过总线嗅探机制对内存中变量a的操作进行嗅探
2、此时,CPU2读取变量a,总线嗅探机制会将CPU1中的变量a的状态置为S(共享),并将变量a加载到CPU2的缓存中,状态为S
3、CPU1对变量a进行修改操作,此时CPU1中的变量a会被置为M(修改)状态,而CPU2中的变量a会被通知,改为I(无效)状态,此时CPU2中的变量a做的任何修改都不会被写回内存中(高并发情况下可能出现两个CPU同时修改变量a,并同时向总线发出将各自的缓存行更改为M状态的情况,此时总线会采用相应的裁决机制进行裁决,将其中一个置为M状态,另一个置为I状态,且I状态的缓存行修改无效)
4、CPU1将修改后的数据写回内存,并将变量a置为E(独占)状态
5、此时,CPU2通过总线嗅探机制得知变量a已被修改,会重新去内存中加载变量a,同时CPU1和CPU2中的变量a都改为S状态
多级缓存
L1
L1 data cache(DL1)
L1 instruction cache(IL1)
32KB
L2
256KB
L3
3MB
1B(字节)=8b(位)
伪共享”(False Sharing)
这个缓存行可以被许多线程访问。如果其中一个修改了v2,那么会导致Thread1和Thread2都会重新加载整个缓存行。你可能会疑惑为什么修改了v2会导致Thread1和Thread2重新加载该缓存行,毕竟只是修改了v2的值啊。虽然说这些修改逻辑上是互相独立的,但同一缓存行上的数据是统一维护的,一致性的粒度并非体现在单个元素上。这种不必要的数据共享就称之为“伪共享”(False Sharing)。
虚拟存储
伟大的计算机前辈设计出,让 CPU 采用 段基址 + 段内偏移地址 的方式访问内存
其中段基地址在程序启动的时候确认,尽管这个段基地址还是绝对的物理地址,但终究可以同时运行多个程序了, CPU 采用这种方式访问内存,就需要段基址寄存器和段内偏移地址寄存器来存储地址,最终将两个地址相加送上地址总线。
内存分页
连续的地址空间
内存分段
内存分段,相当于每个进程都会分配一个内存段,而且这个内存段需要是一块连续的空间,主存里维护着多个内存段,当某个进程需要更多内存,并且超出物理内存的时候,就需要将某个不常用的内存段换到硬盘上,等有充足内存的时候在从硬盘加载进来,也就是 swap 。每次交换都需要操作整个段的数据。
内存映射
正常情况下,我们读取文件的流程为,系统调用从磁盘读取数据,存入操作系统的内核缓冲区,然后在从内核缓冲区拷贝到用户空间
内存映射,是将磁盘文件直接映射到用户的虚拟存储空间中,通过页表维护虚拟地址到磁盘的映射,通过内存映射的方式读取文件的好处有,因为减少了从内核缓冲区到用户空间的拷贝,直接从磁盘读取数据到内存,减少了系统调用的开销,对用户而言,仿佛直接操作的磁盘上的文件,另外由于使用了虚拟存储,所以不需要连续的主存空间来存储数据。
程序运行
当程序被加载进内存后,指令就在内存中了,这个时候说的内存是独立于 CPU 外的主存设备,也就是 PC 机中的内存条,指令指针寄存器IP 指向内存中下一条待执行指令的地址,控制单元根据 IP寄存器的指向,将主存中的指令装载到指令寄存器。
这个指令寄存器也是一个存储设备,不过他集成在 CPU 内部,指令从主存到达 CPU 后只是一串 010101 的二进制串,还需要通过译码器解码,分析出操作码是什么,操作数在哪,之后就是具体的运算单元进行算术运算(加减乘除),逻辑运算(比较,位移)。而 CPU 指令执行过程大致为:取址(去主存获取指令放到寄存器),译码(从主存获取操作数放入高速缓存 L1 ),执行(运算)。
时钟的实现
实时时钟 RTC ,用于长时间存放系统时间的设备,即使关机也可以依靠主板中的电池继续计时。Linux 启动的时候会从 RTC 中读取时间和日期作为初始值,之后在运行期间通过其他计时器去维护系统时间。
可编程间隔定时器 PIT ,该计数器会有一个初始值,每过一个时钟周期,该初始值会减1,当该初始值被减到0时,就通过导线向 CPU 发送一个时钟中断, CPU 就可以执行对应的中断程序,也就是回调对应的任务
时间戳计数器 TSC , 所有的 Intel8086 CPU 中都包含一个时间戳计数器对应的寄存器,该寄存器的值会在每次 CPU 收到一个时钟周期的中断信号后就会加 1 。他比 PIT 精度高,但是不能编程,只能读取。
时钟周期
硬件计时器在多长时间内产生时钟脉冲,而时钟周期频率为1秒内产生时钟脉冲的个数。目前通常为1193180。
时钟滴答
当PIT中的初始值减到0的时候,就会产生一次时钟中断,这个初始值由编程的时候指定。
GPU
CUDA
NVIDIA推出的运算平台
它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎
它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎
MCU
计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的芯片
0 条评论
下一页
为你推荐
查看更多