Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150931
  • 博文数量: 49
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 545
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-23 13:22
文章分类
文章存档

2017年(5)

2016年(18)

2015年(18)

2014年(8)

我的朋友

分类: 嵌入式

2014-02-23 13:31:18

        多CPU与多核

综述:

本文主要通过两个问题浅谈两个知识点,一是Hard thread  ,二是冯诺依曼结构和哈佛结构,在谈第一个问题的时候会穿插MMUcache的作用,谈第二个问题的时候我穿插ARM流水线的作用。由于个人知识有限,文中难免会有谬误,欢迎各位工友工头拍砖 :) 

一、Hard Thread 

在看8x26 adsp 处理器 Hexagon 的文档时,那里面吹嘘说这个处理器有三个hard thread ,出于一个linux 驱动工程师的本性,我当时就想,如果linux跑在这个处理器上面,操作系统应该怎么来识别它们呢?会把它们当做一个核来看待还是三个核?说得更具体点,msm8625q AP4Cortex-Alinux就把它们识别成CPU0 CPU1 CPU2 CPU3 ,我的问题是如果linux跑在Hexagon 上应该只有一个CPU0 还是 

这个问题的关键是要弄清楚核与Hard Thread的区别。

首先,我们看下多核的结构:

作为参考的标准,我们先看下msm8x26Cortex-A7  4核的构成:

在说cache以前,我们得先了解一个原理。

程序的局部性原理:是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域。局部性原理又表现为:时间局部性空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后。其附近的存储单元也将被访问。

在上图中,我们可以看到每个核都有独立的instructiondata  L1 cache ,然后共用L2 cache和中断控制器,然后通过SCU共用系统总线ACE Snoop Control Unit 是用来保持双核之间的数据Cache的一致性的(因为每个核有单独的data cache)。然后我们再看一下每个核的内部结构:

可以看到每个核内部除了CPU 以外还都有对应的cache 和 TLB 单元,TLBMMU控制,MMUcache由协处理器CP15控制。

CPl5,即通常所说的系统控制协处理器(System Control Coprocesssor)。它负责完成大部分的存储系统管理。比如CP15协处理器的TTB寄存器中保存着第一级页表(Translation Table)的基地址,这个基地址指的是PA,也就是说页表是直接按这个地址存在物理内存中的(注意页表在物理内存中)。

哦,你应该也看到了debug的那个模块了,他就是jtag的接口。

另外,在前一张图中我们还看到了TLB TLBMMU中的一块高速缓存(也是一种Cache):

ARM 是采用的二级页表,如果没有TLB 的话CPU一次寻址其实是三次访问物理内存我们都知道物理内存的存取速度是远远落后于cpu的速度的,访问物理内存的次数越多,系统的性能就越低。

CPU核发出VA请求读数据,TLB(Translation Lookaside Buffer)接收到该地址。TLB是MMU中的一块高速缓存(也是一种Cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA的页表项就不必去物理内存中读出页表项了,否则去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数。

页表项中不仅保存着物理页面的基地址,还保存着权限位和是否允许Cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU核。然后检查是否允许Cache,如果允许Cache就启用Cache和CPU核互操作。

如果不允许Cache,则直接发出PA从物理内存中读取数据到CPU核。

如果允许Cache,则以VA为索引到Cache中查找是否缓存了要读取的数据,如果Cache中已经缓存了该数据(称为Cache Hit)则直接返回给CPU核,如果Cache中没有缓存该数据(称为Cache Miss),则发出PA从物理内存中读取数据并缓存到Cache中,同时返回给CPU核。然而Cache并不是只取CPU核所要的数据,而是把相邻的数据都取上来缓存,这称为一个Cache Line。CortexA7的Cache Line支持64字节。

扯远了,那我们再看看Hexagon的内部结构:

可以看到每个hard thread有自己的ALU CU 和对应的寄存器,但是他们共用L1 cache , 所以Hexagon的三个hard thread 的功效肯定小于Cortex-A7那样三个核的功效,我们可以把这种组合看成一个核里面有三个CPU 执行单元,类似于Intel Hyper-Threading Technology(超线程计技术)

那么我们再回到最初的问题,如果linux系统在上面跑的话,操作系统会认为它有几个可调度的逻辑处理器?可这个世界上有很多“水果”,但却没有“如果”,因为linux没在它上面跑,所以,我只能

在继续讨论硬件线程前,我们先说下软件线程。

进程是资源分配的最小单位线程是CPU调度的最小单位,听说这是这是计算机里经常考的,特别考研时,还好当年没考研,不然我一定考不上。

每个运行的程序都是一个进程(process)。每一个进程会创建并运行一个或多个线程,这些线程称为软件线程(software thread),用于区分前面提到的硬件线程。一个进程至少有一个线程,称为主线程(main thread)

操作系统的调度器在所有要运行的进程和线程之间公平地分享可用的处理资源。任务调度器会给每一个软件线程分配处理时间。当任务调度器运行在多核微处理器上时,调度器必须从物理内核支持的硬件线程中分配时间给每一个需要运行指令的软件线程。OS将每一个硬件线程识别为一个可调度的逻辑处理器。每一个逻辑处理器可以运行软件线程的代码。运行了多个软件线程的进程可以充分发挥硬件线程和物理内核的优势,并行地运行指令。

以上内容来自百度,不要问我为什么总是百度,因为它是群众智慧的结晶,而作为这个社会主义的国度的一员,我是非常尊重群众智慧的。看见上面的蓝色字体了吗,答案就在这里。

  

、冯诺依曼和哈佛

既然说到这里了,我们就再说一个问题,Hexagon是冯诺依曼结构还是哈佛结构?Cortex-A7 呢?

我先来看看这两种结构:

在典型情况下,完成一条指令需要3个步骤,即:取指令、指令译码和执行指令。从指令流的定时关系也可看出冯·诺依曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作的指令,指令1至指令3均为存、取数指令,对冯·诺依曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。

如上图,在哈佛结构下,我们可以看到在同一个时钟周期里面,执行,译码和取指令是可以同时进行的,甚至是三者并行。

如果采用哈佛结构处理以上同样的3条存取数指令,由于取指令和存取数据分别经由不同的存储空间和不同的总线,使得各条指令可以重叠执行,这样,也就克服了数据流传输的瓶颈,提高了运算速度。

我们再来看下把流水线的级数调多后的效果:

随着流水线深度(级数)的增加,每一段的工作量被削减了,这使得处理器可以工作在更高的频率,同时改进了处理器的性能。

再看下他们的性能的比较:

看一下他们的总体趋势,流水线越多,频率越高,当然频率越高,功耗也就越大。

哈佛结构的确突破了冯诺依曼大师的瓶颈,但是也增加了计算机的复杂度和硬件成本,于是,第三种结构出现了,我们看下号称是哈佛结构的ARM9的架构图:

ARM920T 核来看,有data cache 和 instruction cache 似乎是哈佛的节奏,但是实际ARM9的代码和数据却是统一编址的,物理上也是用一块SDRAM芯片,访问程序和数据段的数据也没有区分不同的代码(像51中访问RAMMOV,访问ROMMOVC),程序似乎可以随意的对代码段读写操作(MMU 可以解决这个问题),实际上从原理图上看并没有单独取指令和单独取数据的总线pin脚,他们是复用的,如果从这一点来死抠的话,他不是一个完全意义上的哈佛结构,它仍有冯诺依曼结构的影子。类似于ARM9 我们的cortexA9 也是类似的结构。

最后我要告诫各位的是,不要死抠,因为绝大多数情况下,死扣会让人一个人很不幸福。实际上就算共用总线,但因为有了cacheCPU cache的命中率一般都在90%以上。所以,退一步,海阔天空,因为在提高系统性能的道路上我们不会只有增加总线增加内存这一条道路,我们至少还有cache,还可以把原本只有三级的流水线变成58级甚至15级,还可以提高系统频率,还可以把内存由单通道改成双通道等等。

三、下一步?

分析Linux 下 ARM SMP系统的启动流程。

2013.7.25. 


阅读(2594) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:Linux 下的I2C子系统

给主人留下些什么吧!~~

t15063767032019-07-26 18:49:47

你好,文中图片不在了,还有其他地方可以看到吗?