1
zj299792458 2017-11-25 14:00:16 +08:00
如果是一个进程只会被分配到一个 cpu core,进程之间数据无法直接读取的,不存在这个问题,多个线程的话,应该是会被分配到同一个 cpu 的多个 core 上去避免这个问题,具体需要看 cpu 的 scheduling 策略,因为你说的两种方法都会对性能造成巨大影响,cpu 之间的数据通道 clock 远低于 cpu clock,个人认为同一个进程应该只会在一个 cpu 上处理。
|
2
FindHao 2017-11-25 23:03:02 +08:00 via Android
cpu 的 cache 不可能在 cpu 之间共享吧。一致性问题解决不了。你说的“ cpu 跑到内存读写,还是通过另一条线读写”,另一条线的意思是 dma 吗? fpga 上 fpga 倒是可以 dma 读 arm 核的 cache,但是我不认为多 cpu 的主板也支持。因为一般都是可拆卸的,而且数据一致性问题也很难操作吧。
如果你说的直接读写 cpu2 的 cache 是 dma 的话,延迟性能一般比直接读内存好。因为不需要经过 cpu,可以简单了解下 dma。 |
3
FindHao 2017-11-25 23:04:43 +08:00 via Android
楼上的解释也很正确。一个进程一般不会被分配到多个 cpu 上,因为数据一致性问题。
|
4
oyjc OP @FindHao
http://www.ha97.com/5432.html 至强 E5-2600 系列采用了新的环形总线连接各个 CPU 核心、LLC 缓存( L3 缓存)、及 System Agent 等部分。在处理器核心数量日益增多的时代,相互交换数据若出现较大延迟反而会影响整体效率,进而对系统造成瓶颈,而环形总线则能够让各个核心以及 CPU 可以完美共享 L3 缓存并且降低延迟,因此在相同条件下会较上代产品有大幅度的效率提升。大大减少了访问周期,全面提升访问速度,性能也有了很大提升。据 Intel 官方资料显示,缓存的延迟也得到了降低,大约由原来的 36-40 个时钟周期减少到 26-31 个时钟周期。... |
5
msg7086 2017-11-26 02:06:13 +08:00
这个题目很有意思,我特地去帮你搜了资料。
现在常见的多 CPU 结构一般用的是 NUMA 结构,CPU 内部集成内存控制器,直接存取内存。 访问对方 CPU 所拥有的内存需要经由对方 CPU 的内存控制器转发,中间走 QPI 互联。 然后我查到的资料是说,内存数据是缓存在拥有这个内存的 L3 上,也就是说 CPU 0 访问 CPU 1 的内存,数据是存在 CPU 1 的 L3 上的(应该也很好理解,因为 L3 的缓存分片地址映射是基于内存地址的 Hash,因此自然是映射到拥有内存的 L3 上的)。 所以对于同一块内存区域,两块 CPU 访问的是同一块 L3。 别人的回答引用如下: An access to memory that misses in the Level 1 data cache might be serviced by the Level 2 data cache (in the same socket) or it might be serviced by what Intel calls the "Last Level Cache (LLC)" which would be in the socket that has the memory controller for that memory address. Hitting in the LLC in another socket could be a few tens of processor cycles, but still much faster than accessing DRAM (more than one hundred processor cycles). |
6
oyjc OP @msg7086 我查到的资料説是,两片 CPU 的 Cache 是通过算法保证一致性的。即两片 CPU 的 Cache 内容一模一样。
|
7
FindHao 2017-11-26 10:10:44 +08:00
@oyjc #6
![]( https://software.intel.com/sites/default/files/managed/55/90/xeon-processor-scalable-family-tech-overview-fig11.png) https://software.intel.com/zh-cn/articles/intel-xeon-processor-scalable-family-technical-overview 你说的:算法保证一致性,即两片 CPU 的 cache 内容一样“这是不对的。 如果你是说 shared llc 的话,不符合你最一开始提问题的描述。共享 last level cache 不是单个 cpu 独占的。就像图里所示,inclusive 是指包含。 https://www.findhao.net/easycoding/1667 |
8
FindHao 2017-11-26 10:12:23 +08:00
你应该是说的这种共享 llc 的架构。所以不存在你说的 cpu0 有个 L3 cache,cpu1 有个 L3 cache,cpu0 去访问 cpu1 的 L3cache。实际上,这是一个大的共享的 cache,cpu1 读的数据被缓存上来以后,cpu0 本来就可以读取到。
|
9
oyjc OP @FindHao 我描述错误了,两片 Cache 不是一模一样的,是有共享的部分,且每个地址有四种状态,共享 /独占等。
综合看了楼上的资料,有点理解了, 两片 CPU 的 cache 总容量是 1+1,可以通过 QPI 共享,这样理解对吗? 如果是通过 QPI 访问另一片 CPU 的 Cache,延迟肯定比直接访问主存低(即速度快) |
10
darkZang 2017-11-26 17:19:04 +08:00
FindHao 刚才提到了数据的一致性问题,作为程序员来说看到这一点就很厉害了.
每个 CPU 核心 都有有自己的私有 Cache(数据或者指令) , 所有核心 共享 last level Cache ,也就上边提到 L3 Cache. "前代英特尔至强处理器支持 4 种探听模式(无探听、早期探听、归属地探听和目录模式),而英特尔至强处理器可扩展家族仅支持目录模式."[1] 其实英特尔硬件实现了基于目录的一致性协议,意思就是说对于多核共享的数据,硬件上有一个目录会做记录,它被缓存到哪个 CPU 的私有 Cache 中,如果出现不一致的问题,就会做相应的更新或者失效的动作. "HitME 高速缓存用于缓存目录信息,加快高速缓存到高速缓存传输的速度,是 CHA 提供的另一个功能。借助 CHA 的分布式归属地代理架构,HitME 高速缓存资源随着 CHA 数量的增加而扩展。"[1] Reference 1.https://software.intel.com/zh-cn/articles/intel-xeon-processor-scalable-family-technical-overview |