鲲鹏处理器
读过我之前的笔记的朋友一定知道我是写过一个关于鲲鹏处理器的专栏的: 鲲鹏处理器 架构与编程,质量分平均96,也是我自己开始写博客的地方,在写 笔记时,我也搞懂了很多从前一知半解的原理。
那我开始了:
一、处理器概述
1.Soc
2.Chip
3.DIE
4.Cluster
5.Core
二、体系架构
1.计算子系统
计算机中进行数据运算的子系统是CPU,也就是中央处理器。中央处理器(central processing unit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。
2.存储子系统
计算机的存储子系统由主存(内存)、辅存(外存)和高速缓冲存储器(Cache)组成。
1. 主存(内存):CPU可直接编程访问,存放CPU当前执行所需要的指令和数据。特点是能随机访问、存取速率快、具有一定的存储容量(受地址位数制约)。
2. 辅存(外存):存放大量的后备程序和数据。特点是速度较慢、容量大。
3. 高速缓冲存储器(Cache):存放CPU在当前一小段时间内多次使用的程序和数据,以缓解CPU和主存的速度差异。特点是速度很快、容量小。
此外,物理存储器与虚拟存储器也是存储子系统的重要组成部分:
1. 物理存储器:物理形态上真实存在的存储器,简称为实存,其地址称为物理地址或实地址。
2. 虚拟存储器:虚拟存储器是一个逻辑模型,并非物理存在,基于物理存储器并靠硬件+操作系统的映射来实现。
存储子系统是计算机的重要组成部分,负责存储和管理计算机中的数据和程序,对计算机的性能和可靠性有着至关重要的影响。
3.其他子系统
除了计算子系统和存储子系统,计算机还有其他一些重要的子系统,例如:
1. 输入/输出(I/O)子系统:负责计算机与外部设备之间的通信和数据传输,包括键盘、鼠标、显示器、打印机等。
2. 网络子系统:负责计算机与其他计算机或网络之间的通信和数据传输,包括网卡、路由器、交换机等。
3. 操作系统子系统:负责管理计算机的硬件和软件资源,提供各种服务,包括进程管理、内存管理、文件系统、设备驱动等。
4. 安全子系统:负责保护计算机系统和数据的安全,包括防火墙、杀毒软件、加密技术等。
5. 应用软件子系统:负责提供各种应用程序和服务,满足用户的不同需求,包括办公软件、图像处理软件、游戏等。
这些子系统协同工作,使计算机成为一个完整的系统,满足用户的不同需求。
三、CPU编程模型
1.中断与异常
中断和异常是计算机系统中的两个重要概念,它们都是指系统、处理器在执行指令过程中突然被别的请求打断而终止当前的程序,转而去处理其他程序。待该中断处理程序处理完后回到该程序中断点继续执行之前程序。
异常表示CPU执行指令时本身出现了问题,如算数溢出,除零,或执行了陷入指令等。而中断则是CPU对系统发生的某个事件作出的一种反应,事件的发生改变了CPU的控制流。两者的区别在于,异常是由CPU执行指令时出现的问题引起的,而中断是由外部事件引起的。
为了支持CPU和设备之间的并行操作,现代操作系统引入了中断异常机制。当设备完成输入输出向CPU发送中断报告结果时,CPU会暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序。
中断异常机制是现代操作系统的核心机制,硬件和软件相互配合而使计算机系统充分发挥能力。硬件负责中断异常响应,捕获中断请求,将处理器控制权交给特定的处理程序;软件则负责中断异常处理程序,识别类型并完成相应处理。
总的来说,中断和异常是计算机系统中非常重要的机制,它们使得计算机能够应对各种事件和错误,保证了系统的正常运行。
2.异常级别
异常级别是指计算机系统在处理异常时所采取的不同级别的响应和处理方式。
不同异常级别下,处理器能够访问的资源也不同。在PE(处理器)在某个异常级别执行的时候,PE能够访问下面的资源:可用于当前异常级别和当前安全状态的资源集;在当前的安全状态下,所有较低的异常级别上可用的资源。
a.基本概念
异常级别决定了系统在处理异常时的响应和处理方式,保证系统的正常运行。
异常级别的切换只能发生在触发了异常或者异常处理返回过程中。当发生异常时,异常级别要不增加,要不保持不变;当从异常处理返回时,异常级别只能减小或者保持不变。每个异常级别都有一个明确的目标异常级别,这个目标异常级别要么是默认定义的,要么是通过系统寄存器的相应bit定义的。
异常级别的切换是计算机系统中非常重要的机制,它使得系统能够在不同的异常级别之间切换,以应对不同的事件和错误。在ARMv8-A系列架构中,异常级别的切换只能发生在触发了异常或者异常处理返回过程中。
b.异常级别切换
当发生异常时,异常级别要不增加,要不保持不变。例如,当处理器在执行EL0级别的程序时发生异常,那么处理器的异常级别可能会升级到EL1或者更高的级别,这取决于异常的类型和处理程序的需求。当异常处理程序处理完异常后返回时,处理器的异常级别会降低到原来的级别或者更低的级别。
异常级别的切换是计算机系统中非常重要的机制,它使得系统能够在不同的异常级别之间切换,以应对不同的事件和错误,保证了系统的正常运行。
########################################
下面为整理的内容:
鲲鹏处理器 架构与编程(一)处理器与服务器
未来的世界将是一个
端-云-端 的世界:
人机物融合,通过对云侧的极限计算,边缘侧的专业计算,端侧的个性计算——未来计算机体系的构成。
x86:个人向
ARM:移动计算,服务器AND物联网
RISC-V:万物互联
鲲鹏系列处理器:ARM生态
本文基于学习ARM架构,帮助理解高性能服务器处理器。
鲲鹏芯片:海思自研芯片的总称,含有鲲鹏处理器、昇腾(Ascend)、人工智能(AI)、SSD控制芯片、智能融合网络、智能管理芯片。
鲲鹏920完全兼容64位的ARMv8-A环境,完全兼容所有的ARM环境,提供一种华为创新解决方案。
对于鲲鹏处理器,其不仅满足个人服务器的处理条件,还更多的应用在服务器系统的搭建运行上。
总目录
这本书主要有四部分:
1.高性能处理器的并行架构,以及服务器体系结构,技术路径
2.ARMv8-A处理器架构逻辑
3.基于鲲鹏920片上系统的Taishan服务器优势
4.鲲鹏软件生态架构, 应用、调优工程师应该关注
附录:鲲鹏处理器、鲲鹏开发者套件、鲲鹏社区、鲲鹏开发者认证计划
一、服务器与处理器
1 服务器分类
体系结构,技术基础:
应用层级:
机械结构:
使用用途:
处理器架构: +
-
CISC架构服务器:
-
RISC架构服务器: +
:
+
+
… -
EPIC架构服务器: :
+
服务器测试基准:TPC、SPEC
: +
查找: +
替换: +
2服务器处理器
高性能处理器并行组织结构,为了提供更强的计算能力。
但是由于物理规律对半导体器件的限制,传统的单处理器系统通过提高主频提升性能的方法收到制约,不可能任沿摩尔定律预测的轨迹持续上升,且随着晶体管越来越小芯片内部的互连线延时影响越来越大,高频率不仅使能源消耗剧增,而且没有良好的散热对系统的稳定性造成剧烈影响。
1.指令流水线
执行程序的角度,并行等级可分为多级:一条指令执行的微操作之间的并行是指令内部的并行;并行执行两条或多条指令,也即指令级并行(Instruction-Level Parallelism,ILP )执行两个或两个以上任务(程序段)属于任务级并行;最高层次或作业级并行则是指2+作业或程序
对于单个处理器,时间并行技术主要体现在指令流水线。 常见的高性能处理器无一不采用指令处理器,多发射处理器将空间并行性引入了处理器。
超标量(Superscalar)采用多发射技术,处理器内部采用多条并行执行的指令流水线,通过时钟周期内向执行单元发射多条指令实现指令级并行。
2.多处理器系统、多计算机系统
Multi-processor(多处理器系统)
3.多线程处理器
除了传统的指令级并行技术,多线程技术与多核技术也能提高芯片处理能力的片内并行技术。
.
//当处理器访问Cache(高速缓冲存储器)缺失(Miss,不命中),则必须访问主存,这会导致执行部件长时间等待,直到Cache成功加载。
var 解决该问题的方法是片上多线程技术(On-chip Multi-threading)技术。
= '处理器中,引入硬件多线程(Hardware Multi-threading)的概念,原理相似。';
并行概念从指令级并行拓展至线程级并行(Thread-Level-Parallelism),快速进行线程级切换,减少垂直浪费。
同时多线程(Simultaneous Multi-Threading,SMT),减少水平以及垂直浪费。一个时钟周期内,不同线程的多条指令。E.g.:Intel的超线程。
一个简单的表格是这么创建的:
1.2.1高性能处理器的并行组织结构
指令流水线:
> 指令流水线是为提高处理器执行指令的效率,把一条指令的操作分成多个细小的步骤,每个步骤由专门的电路完成的方式。这种方式允许处理器在执行完一条指令的一个步骤后,就可以立即开始执行下一条指令的一个步骤,而不是等待整个指令完全执行完毕。这种方式可以显著提高处理器的效率,因为处理器可以在多个步骤同时进行操作。
> 指令流水线可以分为三类:简单指令流水线、复杂指令流水线和超长指令字(VLIW)指令流水线。简单指令流水线只包含一个操作步骤,例如加法操作。复杂指令流水线包含多个操作步骤,例如乘法操作,需要多个时钟周期才能完成。超长指令字指令流水线将多个简单操作组合成一条长指令,可以同时执行多个操作,从而提高处理器的效率。
多处理器系统和多计算机系统:
>多处理器系统和多计算机系统是两种不同的计算机系统。
>多处理器系统是指一个计算机系统中包含两台或多台功能相近的处理器,这些处理器可以相互协作完成任务,并且共享内存、I/O设备、控制器和外部设备。多处理器系统的优点是可以提高系统的处理能力和性能,缺点是系统的设计和实现比较复杂。
>多计算机系统是指一个计算机系统由多台计算机组成,这些计算机之间通过网络相互连接,可以相互协作完成任务。多计算机系统的优点是可以提高系统的可靠性和可扩展性,缺点是系统的设计和实现比较复杂。
多线程处理器:
>多线程处理器是一种处理器,它能够同时执行多个线程,以提高处理器的利用率和效率。多线程处理器通过复制处理器上的结构状态,让多个线程同步执行并共享处理器的执行资源,从而实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓存和由于数据相关或Cache未命中带来的访问内存延时。
>多线程处理器主要分为两种类型:SMT和MIMD。SMT(Simultaneous Multi-Threading)是一种共享处理器时间的技术,它允许多个线程同时在一个处理器上执行。MIMD(Multiple Instruction Multiple Data)是一种并行计算模型,它允许多个处理器同时执行多个指令和数据。
>多线程处理器广泛应用于各种领域,例如计算机科学、人工智能、大数据处理等。它能够提高处理器的性能和效率,降低能耗和成本,为计算机系统的设计和实现提供了更好的解决方案。
多核处理器(片上多处理器)
多核处理器是一种具有多个处理核心的处理器,这些核心集成在同一块芯片上,相互之间通过内部总线进行通信。多核处理器的主要目的是通过并行执行多个线程来提高处理器的整体性能,解决单核处理器中存在的能效问题。多核处理器采用了多种技术来实现并行处理,例如多线程技术、超线程技术、Cache技术等。这些技术能够有效地提高处理器的利用率和效率,降低能耗和成本。
多核处理器广泛应用于各种领域,例如计算机科学、人工智能、大数据处理等。它能够提高处理器的性能和效率,降低能耗和成本,为计算机系统的设计和实现提供了更好的解决方案。
同异构多核处理器
同异构多核处理器一种具有多个处理核心的处理器,这些核心可以相同,也可以不同。同构多核处理器中的核心具有相同的架构和功能,而异构多核处理器中的核心则具有不同的架构和功能。同构多核处理器通常由多个相同的处理核心组成,每个核心都可以独立运行,类似于单核处理器。这种多核处理器适用于通用计算任务,可以并行执行多个线程,从而提高处理器的整体性能。异构多核处理器则是由不同的处理核心组成,每个核心针对不同的需求进行设计,例如通用处理器、DSP、FPGA、媒体处理器、网络处理器等。
这种多构处理器适用于特定领域的计算任务,可以进一步提高应用的计算性能或实时性能。>从软件角度来看,多核处理器的运行模式包括SMP(对称多处理)、AMP(非对称多进程)和BMP(同构多线程)等。其中,SMP是最常用的运行模式,每个核心平等地运行不同的任务;AMP则是指不同核心运行不同版本的操作系统或裸机程序;BMP则适用于同构多核处理器,每个核心运行相同的程序,但执行不同的任务。
>总之,同异构多核处理器通过将多个处理核心集成在同一块芯片上,实现了并行处理和高效计算,适用于各种领域的高性能计算需求。
多核处理器的对称性
多核处理器的对称性指的是多个核心之间的平等关系,即它们在处理任务时具有相同的优先级和资源访问权限。对称多核处理器(SMP)是一种常见的多核处理器,其核心数量从两个到多个不等。在SMP中,所有的核心都平等地共享处理器的资源,包括内存、I/O设备和其他核心。因此,在操作系统中,每个核心都被视为一个独立的处理器,可以同时执行多个线程。
在非对称多进程(AMP)中,不同核心运行不同版本的操作系统或裸机程序,它们之间没有对称性。而在同构多线程(BMP)中,虽然多个核心共享相同的程序,但它们执行不同的任务,因此也没有对称性。对称性的优点是可以提高处理器的利用率和效率,充分发挥多个核心的优势。但是,对称性的实现也需要付出额外的代价,例如核心之间的通信和同步问题,以及调度和负载均衡等问题。因此,在实际应用中,需要根据具体的需求和场景来选择是否采用对称性的多核处理器。
1.2.2英特尔处理器体系结构
英特尔处理器发展
IA-32——最常见应用最广
安腾架构与Intel64架构——安腾已然EOL
Intel至强系列服务器处理器-UPI
1.2.3 ARM处理器体系结构
1. ARM( Advanced RISC Machines Limited) 1990年由Acorn、Apple、VLSI合资成立的处理器公司,早期以IP(Intellectual Property,知识产权)授权这种商业模式,与众多半导体厂商构成合作关系。
2. ARM体系结构、指令集与ARM处理器
-
ARM体系结构(Architecture)
处理器体系结构又称架构,其定义了处理单元(Processing Element) ,简称PE的处理规范。
-
ARM体系结构的指令集(Instruction Set)
ARM(Advanced RISC Machine)是一种流行的32位微处理器指令集架构。它被广泛应用于嵌入式系统、移动设备、消费电子设备等领域。ARM指令集包括以下几种类型:
1. 数据处理指令(Data Processing Instructions):这些指令用于对寄存器中的数据进行操作,例如加法、减法、乘法、移位等。
2. 程序控制指令(Control Instructions):这些指令用于控制程序流程,例如跳转、分支、子程序调用等。
3. 加载和存储指令(Load and Store Instructions):这些指令用于从内存中加载数据到寄存器或将寄存器中的数据存储到内存中。
4. 栈操作指令(Stack Operations Instructions):这些指令用于操作堆栈,例如压栈、弹栈等。
5. 位操作指令(Bit Manipulation Instructions):这些指令用于对数据进行位操作,例如位反转、位测试、位设置等。
6. 协处理器指令(Coprocessor Instructions):这些指令用于与协处理器进行通信。
7. 异常产生指令(Exception Generation Instructions):这些指令用于产生异常,例如中断、未定义指令等。
8. ARM指令集还包括一些伪指令(Pseudo-instructions),这些指令在汇编语言中用于实现某些高级功能,例如条件语句、循环等。
ARM指令集的一个重要特点是它支持Thumb指令集,该指令集是一种16位的指令集,提供了更高的代码密度,适用于对代码大小有严格要求的系统。ARMv8版本引入了64位支持的ARM指令集(AArch64) 和 32位支持的ARM指令集(AArch32) 两种模式。
ARM指令集还有几个重要的特征:
> 1. 具有条件执行(Conditional Execution)功能,即某些指令可以根据特定条件来执行。
> 2. 具有延迟绑定(Delay Binding)功能,即某些指令的执行结果可以在其他指令的执行期间被预测,从而提高了处理器的效率。
> 3. 支持寄存器重命名(Register Renaming),以减少因数据相关引起的性能瓶颈。😁
4. ARM的微处理器内核(Processor Core)(CPU)
5. ARM处理器(Prosseor)
6. 基于ARM架构处理器的片上系统(Soc)
> 基于ARM架构处理器的片上系统(Soc)是一种高度集成的芯片,将多个处理器和其他功能集成在一个芯片上,形成了一个完整的系统。这种系统基于ARM指令集架构,通常包括一个或多个ARM处理器核心,以及其他相关的硬件和软件组件。
>基于ARM的Soc系统具有高度集成、低功耗、高性能等优点,广泛应用于智能手机、平板电脑、物联网、嵌入式系统等领域。一些知名的基于ARM的Soc处理器包括Apple的A系列芯片、高通骁龙系列、华为麒麟系列等。
ARM处理器分类
1)ARM经典处理器
ARM经典处理器主要分为ARM7、ARM9、ARM11三个系列。每个系列都有不同的处理器内核,用于满足不同的性能和功耗需求。
1. ARM7系列:ARM7系列是ARM最早的处理器系列,采用32位指令集,包括ARM7TDMI、ARM7TDMIS、ARM7EJ-S等子系列。主要应用于嵌入式系统、移动设备、音频处理、网络设备等领域。
2. ARM9系列:ARM9系列采用高性能的ARMv5指令集,包括ARM920T、ARM940T、ARM966J等子系列。主要应用于微控制器、数字信号处理、网络设备、智能手机等领域。
3. ARM11系列:ARM11系列采用高性能的ARMv6指令集,包括ARM1136JS、ARM1156T2S等子系列。主要应用于高性能处理器、网络设备、移动设备等领域。
此外,ARM还推出了Cortex-A系列和Cortex-R系列处理器,以满足不同领域的需求。
2)ARM Cortex应用处理器
ARM Cortex应用处理器是ARM公司推出的高性能处理器系列,主要面向基于虚拟内存的操作系统和用户应用。这个系列处理器采用了ARMv7指令集,并分为A、R和M三类,以满足不同应用的需求。
>Cortex-A系列处理器主要包括Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15等多个子系列。这些处理器适用于Android、iOS等操作系统,以及Web应用、游戏等用户应用。
>Cortex-R系列处理器主要应用于实时系统,包括Cortex-R4、Cortex-R5、Cortex-R7等多个子系列。这些处理器适用于汽车制动系统、动力传动解决方案等实时应用。
>Cortex-M系列处理器主要应用于微控制器,包括Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4等多个子系列。这些处理器适用于智能测量、人机接口设备、汽车和工业控制系统等嵌入式应用。
ARM Cortex应用处理器具有高性能、低功耗、可扩展等优点,适用于各种不同的应用领域。同时,ARM公司提供了完整的开发工具和支持,帮助开发者快速开发出高效的嵌入式系统。
3)ARM Cortex嵌入式处理器
ARM Cortex嵌入式处理器是ARM公司推出的适用于嵌入式系统的处理器系列。这个系列处理器采用了ARMv7指令集或者ARMv8指令集(64位),并分为Cortex-M、Cortex-R和Cortex-A三个系列,以满足不同应用的需求。
>Cortex-A系列处理器主要包括Cortex-A5、Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15等多个子系列。这些处理器适用于Android、iOS等操作系统,以及Web应用、游戏等用户应用。
>Cortex-R系列处理器主要应用于实时系统,包括Cortex-R4、Cortex-R5、Cortex-R7等多个子系列。这些处理器适用于汽车制动系统、动力传动解决方案等实时应用。
>Cortex-M系列处理器主要应用于微控制器,包括Cortex-M0、Cortex-M0+、Cortex-M3、Cortex-M4等多个子系列。这些处理器适用于智能测量、人机接口设备、汽车和工业控制系统等嵌入式应用。
ARM Cortex嵌入式处理器具有高性能、低功耗、可扩展等优点,适用于各种不同的嵌入式应用领域。同时,ARM公司提供了完整的开发工具和支持,帮助开发者快速开发出高效的嵌入式系统。
4)ARM 专业处理器
ARM 专业处理器是 ARM 处理器的一种特殊类型,专门针对特定领域的计算需求进行优化。以下是一些 ARM 专业处理器的介绍:
1. ARM Cortex-A78:这是 ARM 最新的旗舰处理器,针对高端智能手机和平板电脑设计。它基于 ARMv8.2 架构,配备 64 位指令集和 16 位可选指令集扩展,具有高性能和低功耗的特点。
2. ARM Cortex-X1:这是 ARM 推出的全新高性能处理器,针对高端智能手机、平板电脑和游戏设备。它基于 ARMv8.5 架构,配备 64 位指令集和 16 位可选指令集扩展,旨在提供更高的性能和效率。
3. ARM Cortex-A55:这是 ARM 的中端处理器,针对智能手机、平板电脑和物联网设备。它基于 ARMv8.2 架构,配备 64 位指令集和 16 位可选指令集扩展,具有高性能和低功耗的特点。
4. ARM Cortex-A35:这是 ARM 的低功耗处理器,针对物联网设备和可穿戴设备。它基于 ARMv8.2 架构,配备 64 位指令集和 16 位可选指令集扩展,旨在提供最佳能效比。
5. ARM Cortex-A73:这是 ARM 的高端处理器,针对高端智能手机和平板电脑。它基于 ARMv8.2 架构,配备 64 位指令集和 16 位可选指令集扩展,具有高性能和低功耗的特点。
ARM 专业处理器针对不同领域的需求进行优化,以满足高性能、低功耗和高效能的要求。这些处理器广泛应用于智能手机、平板电脑、物联网、汽车电子、服务器等领域。
ARM架构服务器优势:
1. 更低的综合运营成本
2. 端-边-云 全场景同构互联与重构
3. 更高并发处理效率
4. 开放的生态系统、多元化的市场供应
ARM服务器的兴起
- 亚马逊的Graviton与EC2(弹性计算云)
- Marvell/Cavium公司的ThunderX系列 服务器处理器
- Ampere公司的eMAG/Altra系列服务器处理器
- 飞腾公司FT2000+系列服务器处理器
1.3 服务器技术基础
1.3.1 高性能处理器的存储器组织与片上互联
1. 多核系统的存储结构
处理器的性能得到充分发挥就必须考虑存储器带宽,还有速度差速需要考虑,所以要进行存储结构设计。
高性能处理器采用多级存储器来解决多存储问题。
(采用二级Cache, 甚至三级Cache等效处理速度)
根据处理器Cache的配置情况,把多核处理器存储结构分为以下四种:
多核处理器的Cache一致性
Cache 一致性(Cache Coherency)
存放数据的多副本,输入输出共享Cache
维护关键点在于 跟踪每一块Cache 状态,读写操作以及总线事件。
//不一致的可能原因:
1.可写数据的共享:采用全写法以及回写法,引起其他Cache中副本内容不一样
2.输入、输出活动:输入/输出设备直接接在了系统总线上,输入/输出将会导致不同
3.核间线程迁移:核间线程迁移,把一个尚未执行完的线程调度到另一个空闲的处理器内核中执行。
多核系统中,Cache的一致性使用软件和硬件维护。
软件维护
UMA 架构 和 NUMA 架构
根据 处理器对内存储器的访问方式 将 共享存储器的计算机系统 分为两大类:
UMA(Uniform Memory Access, 统一内存访问)
和NUMA(Non Uniform Memory Access,非同一内存访问)
UMA是对称多处理器计算机采用的组织方式架构,所有的处理器访问一个统一的存储空间,常以多通道方式组织。10
NUMA架构属于分布式共享存储( Disributed Shared Memory ,DSM),存储器分布在不同节点上。
需要设置线程亲和性(Affinity)来实现,注意类型应用的普遍性,CC-NUMA(Cache Coherent Non-Uniform Memory Access,缓存一致性非统一内存访问),使用专门的一硬件来保证,使多处理器在单一系统下使用对称处理器架构一样的硬件层管理。
1.NUMA架构的主要特点是内存控制器被集成到每个处理器核心中,因此每个处理器都能够直接访问其本地内存区域。本地内存是指与处理器位于同一NUMA节点上的内存。在NUMA中,处理器可以通过互联总线(Interconnect bus)访问其他处理器节点的内存,但是访问本地内存的速度更快。
2.由于NUMA架构的内存访问速度不均匀,因此在系统设计时需要考虑平衡内存访问的延迟和带宽。一种常见的策略是在处理器附近放置更多的内存,以便每个处理器能够更快地访问其所需的内存。
3.NUMA架构的优点是可以提供更高的内存带宽和更低的内存访问延迟。缺点是需要更多的内存和芯片,因此成本更高。另外,由于内存访问速度不均匀,因此需要进行优化以避免性能瓶颈。
4.NUMA架构在某些领域,例如高性能计算和大规模数据处理,表现出色。它也被用于一些现代的计算机系统,例如服务器和工作站。
多核处理器的核间通信机制
主流片上通信方式三种:总线共享Cache结构、交叉开关互联结构、片上网络结构。
1. 总线共享Cache结构
Inter的酷睿(CORE)、IBM的Power4\Power5,
等早期多核处理器采用总线共享结构。
2.交叉开关互联结构
交叉开关(Crossbar Switch)互联结构,提高数据带宽
与总线互连方式相比,交叉开关互连结构具有更高的带宽和更低的延迟。它能够避免总线冲突,支持更多的处理器和存储器模块连接,并且具有更高的扩展性。然而,交叉开关互连结构也具有较高的复杂性和较高的硬件成本。
在交叉开关互连结构中,每个交叉开关可以连接多个处理器和存储器模块,通过交叉开关的路由功能,可以实现任意两个处理器或存储器模块之间的通信。该结构还可以通过多路复用技术来提高带宽利用率。
交叉开关互连结构是一种高性能、高扩展性的互连方式,适用于大规模多处理器系统。
比如AMD的速龙(Athlon)X2处理器,采用交叉开关开关核心与外部同信。
3. 片上网络结构
类似于并行计算机的互联网络结构,单芯集成大量资源
片上网络(Network on a Chip,NoC; On-chip Network)是一种用于多核处理器和片上系统的先进通信架构,通过在单芯片上集成大量的计算资源和通信网络,实现多个功能模块之间的高效通信。
>片上网络的优势在于可扩展性、低延迟和高带宽。它能够满足不断增长的处理核心数量和复杂的应用需求,同时优化通信性能和功耗。
>片上网络的设计旨在提供灵活性和可扩展性,以适应不同的芯片设计和应用需求。
片上网络可以采用多种拓扑结构,以下为几种常见的
环形拓扑、网状拓扑、树状拓扑…
class MeshToplogy:
class TreeTopology:
class StarTopology:
class MeshNoCTopology:
片上网络包括计算子系统、通信子系统两部分。
计算子系统 PE(Processing Element,处理单元),PE可由处理器内核、专业硬件、存储器阵列等构成。
通信子系统由 交换(Swich)节点及节点间互联线组成,负责连接PE,实现高速通讯。
计算子系统由多个处理器核(Processor Core)和其他功能单元组成,它们被集成在一个芯片上。每个处理器核可以执行自己的指令和操作,并且可以通过通信子系统与其他处理器核进行通信。
在二维网状网络片上网络结构图中,计算子系统和通信子系统之间通过连接线相互连接,形成一个相互交织的网状结构。这种结构可以提供高带宽、低延迟的通信能力,并且具有高度并行性和可扩展性。
内存顺序模型与内存屏障
一、 访存重排序
在并行多核系统中,访问顺序不一定一致。为提升性能,编译器或硬件往往会对指令序列进行 重排序(Recording) ,从而引入乱序排序(Out-of-Order Execution) 机制
1. 指令重排序三种类型
- 编译器优化导致的指令序列重排序。不改变程序语义的情况下,对指令重新安排语义。
- 指令级并行导致的指令序列重排序。现代高性能处理器采用指令级并行处理技术增加每个时钟周期执行的指令条数,从而提高处理器性能。如超标量指令技术通过处理器动态执行机制实现指令级并行,超长指令级技术采用编译器软件静态调度实现指令级并行,EPIC技术通过软硬件协作来提高系统性能。
- 内存系统引起的指令序列重排序。除了指令执行执行程序之外,通常还存在着内存系统感知到的内存访问顺序。处理器通常会采用Cache、读写缓冲区,使得程序运行时出现多核交互让Load和Restore看起来在乱序执行。
2. 三种不同的存储器访问顺序
1.程序顺序(Program Order):程序顺序是代码在特定处理器上运行时由代码本身给出的访存顺序,代表程序员预期的时间顺序。
2.执行顺序(Execution Order):执行顺序是指在给定处理器上运行时,特定的访存指令执行顺序。
3.感知顺序(Perceived Order):也称观察顺序。特定处理器感知到访存操作的程序。由于Cache访问、存储系统优化和系统互联操作本身以及其他存储器的访存操作顺序不一定相同,且架构也不一定相同。
某些情况下,程序正确性需要依赖内存访问顺序,而必须通过内存一致性模型加以规范。
二、 内存一致性模型
共享存储器上的多核系统上运行的必须要面对并行编程的问题。其中内存访问一致性需要软硬件协同配合,也就是软件与存储器之间的协议问题。
计算机系统层次结构上来看,计算机系统逻辑上是由裸机和不同层次的虚拟机构成的。内存模型分为软件内存模型(Software Memory Model)与硬件内存模型(Hardware Memory Model)两大类。
1. 软件内存模型
软件运行模型是一套关于程序员、编程语言、运行环境三者之间的一套协议。
软件内存模型通常包括以下几个方面的描述:
- 内存层次结构:描述内存系统的多层次结构,包括缓存、主存、磁盘等不同的存储层次。
- 内存访问语义:描述程序在内存中读取和写入数据的行为,包括读后写、写后读、置零等不同的内存访问语义。
- 内存一致性:描述不同线程对共享内存的访问应该具有一致性,即所有线程看到的内存状态应该是一致的。
- 内存排序规则:描述如何对内存操作进行排序,以确保多线程程序的一致性和正确性。
软件内存模型对于计算机系统的设计和优化具有重要的指导作用。在实际的软件开发过程中,程序员可以根据内存模型来优化程序的内存访问性能,以及避免内存相关的并发问题。同时,软件内存模型也是并发编程语言和并行计算领域的重要研究内容。
2. 硬件内存模型
处理器层次架构的内存一致性模型,可以理解为软硬件之间的一套协议
硬件内存模型通常包括以下几个方面的描述:
- 存储器一致性:描述不同处理器对共享内存的访问应该具有一致性,即所有处理器看到的内存状态应该是一致的。
- 内存访问语义:描述程序在内存中读取和写入数据的行为,包括读后写、写后读、置零等不同的内存访问语义。
- 内存一致序:描述对共享内存的访问应该遵循一定的顺序,以确保多处理器系统的一致性和正确性。
- 内存访问延迟:描述内存访问的时间延迟,包括读延迟和写延迟等。
硬件内存模型对于计算机系统的设计和优化具有重要的指导作用。在实际的计算机系统设计中,硬件设计者需要根据内存模型来优化内存访问性能,以及避免内存相关的并发问题。同时,硬件内存模型也是并发编程语言和并行计算领域的重要研究内容。
a.强一致性内存模型
强一致性内存模型(Strong Consistency Model) 是一种严格的内存一致性模型,它要求多处理器系统中所有对共享内存的访问都必须在一个一致的状态下完成。也就是说,在任何时刻,所有线程看到的内存状态都是一致的。
强一致性内存模型具有以下特点:
1. 所有内存访问操作必须在全局的顺序下完成,这个顺序对于所有线程都是一致的。
2. 如果一个线程对共享内存进行写操作,其他线程立即就能看到这个写操作的结果。
3. 如果一个线程对共享内存进行读操作,它只能看到在全局顺序中发生在读操作之前的写操作。
强一致性内存模型可以确保多线程程序的一致性和正确性,但是它也可能会限制程序的性能。因此,在实际的系统设计中,需要根据实际情况选择合适的内存模型来平衡性能和正确性。
b.弱一致性内存模型
弱一致性内存模型(Weak Consistency Memory Model) 是一种较为宽松的内存一致性模型,它允许在对共享内存的访问上存在一定的时间延迟,并且允许不同线程看到的内存状态存在一定的不一致性。
弱一致性内存模型具有以下特点:
1. 对共享内存的访问操作可能存在一定的顺序错乱,即在一个线程看来,其他线程对共享内存的访问可能不是按照预期的顺序进行的。
2. 如果一个线程对共享内存进行写操作,其他线程可能不能立即看到这个写操作的结果,而是需要等待一段时间后才能看到。
3. 如果一个线程对共享内存进行读操作,它可能只能看到在之前某个时间点之前的写操作,而不能看到最新的写操作。
弱一致性内存模型相对于强一致性内存模型来说更加宽松,因此它可以提高系统的性能,但是它也可能会降低程序的一致性和正确性。因此,在实际的系统设计中,需要根据实际情况选择合适的内存模型来平衡性能和正确性。
A. 顺序一致性内存模型
**顺序一致性内存模型(Sequential Consistency Memory Model)**是一种特殊的内存一致性模型,它要求程序在执行过程中,无论多少个处理器并行执行,无论程序是否同步,所有程序看到的操作执行顺序都是一致的。
顺序一致性内存模型具有以下特点:
1. 所有线程看到的操作执行顺序都是一致的。
2. 程序的执行结果与各处理器各自轮流执行后的结果相同,且各处理器内部的执行顺序由程序决定。
3. 所有操作都是原子的,即在执行过程中不会被其他线程打断。
4. 所有操作都具有立即可见性,即在一个线程中进行的操作会立即对其他所有线程可见。
顺序一致性内存模型为程序员提供了极强的内存可见性保证,但是它也可能会限制系统的性能。因此,在实际的系统设计中,需要根据实际情况选择合适的内存模型来平衡性能和可见性保证。
直观简单的强一致性内存模型,有时也称强排序模型,但这种模型效率低下,不允许处理器为提升并行性乱序执行程序,所以现代高性能处理器大多硬件实现不适用这种模型。
因此在设计处理器内存模型时,多把顺序一致性内存模型作为理论参考性模型来做一定程度上的放宽,来优化模型提升性能。
最典型的放宽是对不同的加载、存储类型的放宽:
- 加载之后的加载重排序(Loads Reordered After Loads)
- 存储之后的加载重排序(Loads Reordered After Stores)
- 加载之后的存储重排序(Stores Reordered After Loads)
- 存储之后的存储重排序(Stores Reordered After Stores)
在多处理器系统中,不同的内存访问类型可能具有不同的放宽级别。其中,最典型的放宽是对不同的加载和存储类型的放宽。
加载操作(Load)是从内存中读取数据到寄存器中的操作,而存储操作(Store)是将数据从寄存器中写入内存中的操作。在多处理器系统中,加载和存储操作可能会受到不同的放宽限制。
具体而言,在某些内存一致性模型中,加载和存储操作可能会被放宽,这意味着它们可以在不同的处理器之间以不同的顺序执行,而不必保持严格的顺序。这种放宽可以提高系统的性能,但也可能导致一些并发问题。
例如,在某些内存一致性模型中,加载操作可能会被放宽到可以在存储操作之前执行,这被称为“加载优先”或“先加载后存储”模型。相反,在另一些内存一致性模型中,存储操作可能会被放宽到可以在加载操作之后执行,这被称为“存储优先”或“先存储后加载”模型。
B. 全存储排序内存模型
如果对顺序一致性模型的基础上放宽程序中的写、读操作顺序(允许写晚于相应读操作)则称为全存储(Total Store Ordering,TSO)内存模型,一般出现在处理器中增加了写缓冲区(Write Buffer,或简称Store Buffer)的情况下。
全存储排序内存模型是一种内存一致性模型,它要求在对共享内存的访问上必须遵循一定的顺序,即所有对共享内存的访问操作都必须按照一种特定的顺序进行。
全存储排序内存模型具有以下特点:
1. 所有对共享内存的访问操作都必须按照一种特定的顺序进行,这个顺序对于所有线程都是一致的。
2. 如果两个线程对共享内存进行操作,它们之间的操作顺序不能有交叉。
3. 如果一个线程对共享内存进行写操作,其他线程必须按照这个写操作所在的位置对共享内存进行读取,否则将无法获得正确的结果。
全存储排序内存模型可以确保多线程程序的一致性和正确性,但是它也可能会限制程序的性能。因此,在实际的系统设计中,需要根据实际情况选择合适的内存模型来平衡性能和正确性。
E.g.:通过Cache写回(Copy-Back)方式以批处理模式刷新写缓存区,合并多次操作,减少总线占用,但可能与Load造成 乱序执行
且 每个处理器上写缓冲区是私有的可能造成 多核一致性问题
上图:多核系统多级存储器架构
在该模型中,CPU0先收到写指令,然后再收到读指令。CPU0写入缓冲区之后,Cache缺失,但为执行完操作,写入操作结果可能未写入主存
全存储(TSO)排序模型只放写-读操作顺序,能保证所有Store指令之间的执行顺序与代码顺序一致。
C. 部分存储排序内存模型
在全存储(TSO)模型 的基础上进一步放宽写-写操作,就变为**部分存储排序(Partial Store Order,PSO)**内存模型。在这种模型中向存储区写入的指令如果存在地址相关性,仍能保持顺序执行,但不存在相关性的写写操作则允许乱序执行。
继续用这个图:
上图:多核系统多级存储器架构
连续执行两次地址不相关写操作
PSO中,部分存储排序内存模型具有以下特点:第一次Cache缺失。第二次写命中,都先写入缓存区,但第二次会先执行完成,第一次要等待Cache(缓存)空间被填充数据才执行完毕,因此存在数据不一致的风险。
1. 对共享内存的访问操作可能存在一定的顺序错乱,即在一个线程看来,其他线程对共享内存的访问可能不是按照预期的顺序进行的。
2. 如果两个线程对共享内存进行操作,它们之间的操作顺序不能有交叉。
3. 如果一个线程对共享内存进行写操作,其他线程必须按照这个写操作所在的位置对共享内存进行读取,否则将无法获得正确的结果。
部分存储排序内存模型相对于全存储排序内存模型来说更加宽松,因此它可以提高系统的性能,但是它也可能会降低程序的一致性和正确性。因此,在实际的系统设计中,需要根据实际情况选择合适的内存模型来平衡性能和正确性。
D. 宽松内存顺序内存模型
如果把读-写、读-读 操作也进一步放开,只要与地址无关的指令都可以乱序执行。
宽松内存顺序内存模型(Relaxed Memory Order,RMO) 是一种内存一致性模型,它允许程序员在内存访问上拥有更大的自由度,但同时也要求程序员必须显式地标记出对内存的访问操作。
宽松内存顺序内存模型具有以下特点:
- 程序员必须显式地标记出对内存的访问操作,例如使用volatile关键字或memory barrier指令。
- 内存访问操作可能会在不同的线程之间出现顺序错乱,但是它们必须遵循一种特定的顺序,即所有对共享内存的访问操作都必须按照一种特定的顺序进行。
- 如果一个线程对共享内存进行写操作,其他线程必须按照这个写操作所在的位置对共享内存进行读取,否则将无法获得正确的结果。
宽松内存顺序内存模型相对于其他内存一致性模型来说更加宽松,因此它可以提高系统的性能,但是它也可能会降低程序的一致性和正确性。因此,在实际的系统设计中,需要根据实际情况选择合适的内存模型来平衡性能和正确性。
几种主流处理器架构:
- 早期DEC公司的Alpha服务器,比较严格的硬件弱内存模型。
- 类似PowerPC、ARM和安腾(Itanium)弱内存排序(Weak Memory Ordering,WMO) 的内存模型(比Alpha增加了数据依赖性顺序)。
- 应用广泛的Intel 64 (x86-x64)架构使用过程一致性(Process Consistency )内存模型,基本属于强一致性顺序模型。
- 有些处理器架构支持多种内存一致性模型。如RISC-V处理器默认内存弱内存排序模型,也可使用全存储排序内存模型。
三、 内存屏障指令
内存屏障指令(Memory Barrier Instruction) 是一类同步屏障指令,用于确保在对内存的访问操作中,先发生的操作(包括读写操作)在后发生的操作之前执行完毕。
内存屏障指令可以保证不同线程之间的内存访问操作的顺序性,从而确保多线程程序的正确性。
现代计算机系统中,有多种类型的内存屏障指令,例如:
- 内存栅栏(Memory Barrier):是一类同步屏障指令,用于确保在对内存的随机访问操作中的一致性。
- 指令栅栏(Instruction Barrier):是一类同步屏障指令,用于确保在对内存的随机访问操作中的一致性。
- 内存栅障(Memory Barrier Primitive):是一类同步屏障指令,用于确保在对内存的随机访问操作中的一致性。
这些内存屏障指令的具体实现和使用方法因不同的计算机系统而异,需要参考相关的硬件和操作系统文档进行了解和应用。
1. 输入输出控制指令eieio
Enforce In-order Execution of Input/Output(强制按顺序执行输入/输出操作),也即在前面所有load和store指令执行完毕之后再执行后续的指令。
//下面为一段向外设发送两段数据的代码
1. while(TDRE == 0); //TDRE表示映射到另一个内存地址的状态寄存器
2. TDR = char1; //TDR表示内存空间的发送数据缓冲器
3. asm(" eieio"); //加入eieio指令会强制执行上一行再执行下一行
4. while(TDRE ==0); //取0发射器缓冲器不空
5. TDR = char2; //确保程序执行不出错
2. 同步指令sync
sync指令功能为等待所有前序操作执行完毕。
PowerPC架构中,定义了执行同步(Execution Synchronizing)概念:如果某条指令i导致指令分发暂停,并且只有当所有正在执行的所有指令都已执行完成i并报告了触发的异常时,指令才算执行完毕。
而sync指令除了执行同步,还要等待所有被挂起的内存访问结束,并且发出一个地址广播周期。可见执行这条指令的性能代价很大。
使用比如让处理器进入低功耗模式使用sync指令。(寄存器编程)
//进入低功耗模式的伪代码
1. asm(" sync");//等待所有被挂起的内存访问结束
2. //进入低功耗模式
3. asm(" sync");
3. 同步指令isync
isync指令覆盖了sync指令的功能,并且在等待所有前序指令执行完毕的同时还清空指令队列,也即按照新的处理器上下文重新加载指令队列。处理器把这种指令的操作称为指令上下文同步(Instruction Context Synchronizing)。系统调用指令、中断返回指令都需要指令上下文同步。
举例而言,当使用写操作指令激活指令 Cache 时,指令队列中可能己经存在若干指令了,此时先执行 isxne 指令就会让后续指令进人指令 Cache。
此外,Power 处理器还有两条专用于多处理器间共享资源同步指令 lwarx 和
stwcx.
> lwarx(Load Word and Reserve Index ):这个指令用于读取内存中的某个字(32位)数据,并将其存储到某个寄存器中。更重要的是,它在读取数据的同时,会在内存中的某个特定位置(通常是一个地址)设置一个"reservation"标记,表示该资源已被一个特定的处理器"预定",其他处理器在尝试读取或修改这个资源时将会失败。这个指令通常用于实现资源访问的互斥,即一次只有一个处理器可以访问或修改某个资源。
> stwcx(Store Word Conditional Index):这个指令用于将某个寄存器中的字数据写入到内存中。如果写入操作成功,且内存中的"reservation"标记仍然存在,那么这个写入操作就会失败,并且stwcx指令会设置一个条件代码,表示该资源仍然被其他处理器"预定"。这个指令通常用于检查资源是否已经被其他处理器锁定,如果已经被锁定,那么当前处理器就会停止进一步的访问操作,避免产生冲突。
每种处理器架构都有其自身定义的内在屏障指令,以支持其内存一致性模型。这对需要在不同平台之间迁移程序是个挑战。而类似Java 语言这样的软件开发环境在往限制程序员直接使用内存屏障,而是要求程序员使用互斥 原语实现同步访问。