外置显卡(独显)动辄8G以上显存,很多好友都宿愿能够借一些给CPU当普通内存用。这在某种水平上是十分容易做到的。显存基本上都会被映射到PCI的mmio地址空间中,一个便捷的驱动就可以将它们映射到普通的地址空间中,但假设在其上运转任何banchmark软件你就会发现功能相当差。这诚然有GDDR和PCDDR设计初衷不同造成的疑问,对于这局部以及之前DDR4的文章开端局部知友的提问为什么显存都DDR5了,内存还DDR4,我后续还有一篇GDDRvsDDRvsHBM的文章来解释,敬请等候,这里就按下不表了。假设咱们疏忽GDDR的不同,一个进一步的疑问就是,为什么不能经过PCIe来裁减普通内存?
重要的要素在于Cache。前一阵举办的InterconnectDay2019,Intel发表了一系列新技术。其中CXL(ComputeExpressLink)看起来并不显眼,但却是处置这个疑问的关键:
CXL实践上有更大的野心:处置CPU和设施、设施和设施之间的memory鸿沟。普通电脑用户兴许偶然会想到用用显存,用不了也无伤大雅,这个需求并不剧烈。但主机用户有渺小的内存池和数量庞大的基于PCIe运算减速器,每个下面都有很大的内存。内存的宰割曾经形成渺小的糜费、不便和功能降低。CXL就是为处置这个疑问而降生,我迫不迭待得想要给大家引见这种新技术,然而为了更好的了解它,必定要有些筹备常识 ,也是为什么偷显存功能低的要素:显存不能保障被cache,或许说不可保障cache的分歧性。感谢@木头龙十年如一日的催稿,我也应用这次时机补上cache系列中缺失的一块拼图,来引见一下cache分歧性的疑问。Cache的基础常识可以看这篇文章:
CacheMemory简称Cache,是存储器子系统的组成局部,寄存着程序经常经常使用的指令和数据,这就是Cache的传统定义。在最新的X86CPU里,cache分为L1、L2和L3,L1普通还分红指令和数据两块,L3有时也被称作LLC(LastLevelCache)。Cache的各个档次之间内容可以是相互蕴含的(Inclusive),也可以是排挤的(Exclusive)。Inclusive和exclusivecache各有优缺陷,比拟复杂,以后独自讲,这里提到它们是由于它们和Cache分歧性有必定相关,为了简化起见,这里一切相关性都被疏忽,未来讲到Cache层级(Hierarchy)再来回忆。
CPU外面L3/LLC实践上被切成很多小片,每个Core对应一个小片:
这些小片在Ringbus上都有个Ringstop来衔接,Ringbus和Ringbus之间的高速队列将这些L3小片整合在一同,构成一个虚构的大一统L3。当然在Meshnetwork后不再有Ringbus,但L3的小片还是存在。咱们来看一致后的两路状况:
假设咱们不探讨Cache的层级,可以化简成这样:
假定我用红框标出的内存曾经被Socket1/Node0和Socket2/Node1访问过了,它的局部数据曾经被它们区分cache了。如今socket1上的一个程序P1改写了一点这些内存中的内容,socket2上的另一个程序P2也要用这段内存。P1的改写和P2的读取假设都仅仅出当初各自的Cache中,就不能保障数据的全局分歧性。换句话说就是在一个多处置器系统中,Cache们和内存池或许对同一份数据有多份正本,如何保障这些正本的分歧性(Coherency)是个必定轻薄看待的疑问。
咱们可以纯软件来处置这个疑问,应用cache操作指令,但开支渺小十分复杂,而且操作系统的内存模型就要求所有扭转,这对X86体系甚至绝大少数体系都是不能接受的。所以绝大少数计算机体系都是靠配件来实现CacheCoherency的,配件会智能保障各个正本的分歧性,不要求软件操心。那么配件是如何做到的呢?又有哪些弊端呢?
X86、ARM和Power系列的CacheCoherency的原始模型都出自MESIprotocol(参考资料2)。在MESI协定中,每个CacheLine(x86中是64bytes)都有MESI四种形态:
MESI之间的转换可以示意为有限形态机的形容外形:
我并不计划置信引见各个形态及它们之间的转换,对此有兴味可以浏览参考资料2和其中的链接。
Intel、AMD和ARM都不是简便捷单照搬MESI模型,而是在其上各有裁减,并联合必定的Directory来减小它带来的反作用。Intel的模型叫做MESIF,加了个forward形态;AMD的模型叫做MoESI,加了个Owner形态。要求特意说明的是,即使同一个CPU,不同Cache层级会有不同的内存模型,这和Inclusive和exclusive亲密相关,以后咱们再来看有没无时机revisit这点。
CacheLine实践上是加了几个bits来示意这些形态。有了这些形态,那么是谁在治理这些形态,各个CacheLine的正本又是谁来同步的呢?在IntelCPU中,这就要引入两个新好友:HA和CA。
HomeAgent(HA),在内存控制器端;CacheAgent(CA),在L3Cache端。他们都在Ringbus上监听和发送snoop信息。这种模型叫做Bussnooping模型,与之相对的还有Directory模型。Snoop信息会在QPI总线上广播,会形成很大的带宽消耗,为了减小这种带宽消耗,如何snoop有很多考究,在参考资料1外面有引见Intel的两种snoop的形式:HomeSnoop和SourceSnoop。它们的重要区别在于谁主导Snoop信息的发送,HA主导叫做HomeSnoop,CA主导叫做SourceSnoop。一个跨socket/node的HomeSnoop例子:
Intel每一代都在提升Snoop模型,有许多新的机制被引入,并联合Directory,来减小全体的overhead。虽然如此,snoop消耗的QPI带宽依然很高,这在8路变成16路甚至32路时会占据少量带宽,在很多状况下会让更多路变大得失相当。
如今咱们回头看看PCIe为什么不能够被用作真正的内存。由于PCIe和其余一切的设施一样,他们的memory不能被CPUcache。那么为什么不能被Cache呢?由于不可保障Cache分歧性。
评论区一些同窗的提问可以看出大家还有不少纳闷,我摘出一些典型的疑问:
:@张輿@daemoneyePS4只要显存,为啥可以当内存?
:PS4是只要GDDR5,但它是间接衔接APU,并不在PCIe前面。GDDR高带宽、高并发,但提前较高。PS4选用它是为了PS4外面app很不凡,全是游戏,和GPU需求近似。本文并不是说GDDR不能当内存,而是说显卡的显存(虽然也是GDDR)不能当内存,重点在显卡这里。GDDRvsDDR的事咱们今后再讲。
当然这和本文有关,本文重要指标不是GDDR,而是在PCIe前面的显存,甚至其余类型的内存,如NvRAM等等,他们的cache分歧性。
:@齐河一家显存提前高,被cpu调用就要存储速度分歧性,这样影响功能,假设反上来,在内存带宽不是瓶颈的状况下,假设gpu占用显存,虽然内存带宽不如显存但他提前小,所以早期我做的b站上1063爆显存测试上两者实践区别不大,那么我有一个小不懂,gpu调用内存要求显存与内存带宽提前分歧性吗?(从测试结果看不要求)
所谓提前分歧性说法不谨严。GPU可以经过DMA调用内存,甚至可以访问cache。DMA是异步的,不要求原地等候,也不在一个时钟域外面,不会拉蓝自己访问本地GDDR的速度。
CPU访问GPU后的mmio是普通的访问形式,虽然也不是一个时钟域,然而是同步的和阻塞式的,所以要求等候完结。
CPU访问mmio普通是不cache的,象征着这次访问完,下次还要从新fetch。为什么不cache?由于不知道下次访问该地址内容变了没有,由于GPU的内存不能汇报自己的扭转,这就是为什么要求CXL。
更多BIOS常识尽在BIOS培训云课堂:
Cache其余文章:
欢迎大家关注本专栏和用微信扫描下方二维码添加微信群众号"UEFIBlog",在那里有最新的文章。
本文地址: https://yihaiquanyi.com/article/4fb7d151b48b08b5096e.html
上一篇:ddr5在哪些应用有明显提升DDR5在哪里DDR3vs...