Intel系统编程指南第八章——8.9 对硬件多线程性能处理器的编程考虑

在一个多线程环境中,可能会有某些硬件资源在硬件拓扑的某一层,在物理上被共享。在多处理器系统中,一般,总线和存储器子系统在多个插槽之间在物理上被共享。在一个硬件多线程性能处理器内,某些资源为每个处理器核心而提供,而其它资源可以为每个逻辑处理器而提供(见8.7小节和8.8小节)。

从软件编程角度,处理器操作的控制传输以逻辑处理器的粒度被管理(操作系统通过在平台上分配一个可用的逻辑处理器分派一个可运行的任务)。为了管理在一个多线程环境中的共享资源的拓扑,理解并管理被多个逻辑处理器共享的资源对于软件可能是有用的。

 

8.9.1 对共享资源的层级映射

 

在与一个多处理器系统中的每个逻辑处理器相关联的APIC_ID是唯一的(见8.6小节)。这个8位或32位值可以被分解为子域,每个子域相应与硬件资源的拓扑映射的一个层级层。

一个APIC_ID的分解可以由几个表示一个物理处理器包内的拓扑的子域构成,一个APIC ID的高次序位也可以被簇(Cluster)制造商使用,以表示每个相应的多处理器系统的簇结点的拓扑。如果处理器不支持CPUID分枝0BH,那么8位初始的APIC ID可以表示4层层级:

1、簇(Cluster)——某些多线程环境由多处理器系统的多个簇构成。CLUSTER_ID子域往往被制造商固件支持,以区别不同的簇。对于没有簇的系统,CLUSTER_ID通常为0,并且拓扑被减少到3层层级。

2、——一个多处理器系统由两个或更多的插槽构成,每个插槽伴随着一个物理处理器包。PACKAGE_ID区分在一个簇内的不同物理包。

3、核心——一个物理处理器包由一个或多个处理器核心构成。CORE_ID子域区分一个包中的处理器核心。对于一个单核心处理器而言,这个位域的宽度为0。

4、SMT——一个处理器核心提供了一个或多个共享执行资源的逻辑处理器。SMT_ID子域区分一个核心中的逻辑处理器。如果一个处理器核心提供了多于1个逻辑处理器的话,那么此位域的宽度为非0。

 

SMT和CORE子域在APIC_ID域中是位宽连续的(见图8-5)。

 

如果处理器支持CPUID分枝0BH,那么32位APIC ID可以表示簇加上物理处理包内的若干拓扑层级。一个物理处理器包内的层级层的确切个数必须通过CPUID分枝0BH枚举。通用的处理器家族可以引入类似8位初始APIC ID所表示的拓扑。一般来说,CPUID分枝0BH可以支持拓扑枚举算法,将一个32位APIC ID分解为大于四个子域(见图8-6)。

每个子域的宽度依赖于硬件和软件配置。域宽可以在运行时使用下面讨论的算法(例8-16到例8-20)确定。

图7-6描述了在一个假想的MP系统中的三个层级子域之间的关系。

 

8.9.2 CPUID扩展拓扑分枝的层级映射

 

CPUID分枝0BH为软件提供了枚举参数以一个确定的形式识别处理器拓扑的每个层级。从SMT层开始的每个拓扑层级层用一个CPUID 0BH分枝内的子分枝索引,以数值方式表示出来。每个拓扑层被映射到APIC ID中的一个子域,遵从图8-6中所描绘的通用关系。这个机制允许软件直接查询在一个物理处理器包内的确切的层级号,以及x2APIC ID的每个子域的位宽。比如:

1、从子分枝索引0开始,并递增ECX直到CPUID.(EAX = 0BH,ECX = N):ECX[15:8]返回一个无效的“层次类型”编码。在物理处理器包内的层次的个数为“N”(不包括PACKAGE)。用图8-6作为一个例子,CPUID.(EAX = 0BH, ECX = 3):ECX[15:8]将报告00H,指示子分枝03H是无效的。这也可以用以下伪代码来描绘:

 

2、子分枝索引0(ECX = 0作为输入)提供了枚举参数,以萃取x2APIC ID的SMT子域。如果当执行CPUID时,EAX = 0BH并且ECX = 0被指定为作为输入,那么CPUID.(EAX=0BH, ECX=0):EAX[4:0]报告一个值(一个右移个数),允许软件萃取x2APIC ID部分,以区分SMT层次上的下一个更高拓扑条目。这个值也对应于相应于带有子分枝索引0的层级层次的x2APIC ID的子域的位宽。

3、对于每个后面更高的子分枝索引m,CPUID.(EAX=0BH, ECX=m):EAX[4:0]报告右移数量,这将允许软件萃取x2APIC ID的部分以区分更高层次拓扑条目。这意味着在子分枝m的右移值m,对应于32位x2APIC ID的最低有效(m + 1)子域。

 

 

当前,只有以下层级层次类型的编码被定义:0(有效),1(SMT),2(核心)。软件绝对不能假定任一“层次类型”编码值被关联到任一子分枝索引,除了子分枝索引0。

 

8.9.3 一个MP系统中的逻辑处理器的层级ID

 

对于Intel 64和IA-32处理器,系统硬件建立一个8位的初始APIC ID(或32位APIC ID,如果处理器支持CPUID分枝0BH),对每个逻辑处理器都是唯一的,跟在一次上电或RESET之后(见8.6.1小节)。系统上的每个逻辑处理器被分配一个初始的APIC ID。BIOS可以支持一些特征,告诉OS支持少于系统总线上逻辑处理器的个数。在运行时,对应用程序不可用的那些逻辑处理器在OS引导过程期间被中止。这样,可以通过亲和化(affinitize)当前线程上下文而被查询的有效的本地APIC ID的个数,受限于在运行时被OS引导过程所允许的逻辑处理器的个数。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值