![]() |
1
5
TXT-NI功能的RTM(受限事务内存)部分允许抑制异常:
我从未使用过RTM,但它应该像这样工作:
还要注意RTM并不是无处不在的。
|
![]() |
2
2
不幸的是,在x86(或我知道的任何其他I s a)上,没有一条指令只查询TLB或当前页表并将结果放入寄存器。也许应该有,因为它可以非常便宜地实现。 像这样的CPU功能有用吗?可能有几个是的这样的东西很难得到回报,因为每次“错误”的尝试都是CPU时间/指令没有完成任何有用的工作。但是,这样的情况可能是一个胜利,当您不关心遍历树/图的顺序时,一些节点可能在缓存、TLB中处于热状态,甚至只是RAM,而其他节点处于冷状态,甚至被调出到磁盘。
普通CPU(如现代x86)可以进行推测性/无序的页面遍历(以填充TLB条目),并且肯定会将推测性加载到缓存中,但不会出现页面错误。页面错误由内核在软件中处理。出现页面错误不可能是推测性的,而且是序列化的。(CPU不重命名特权级别。) 所以,当你触摸其他内存时,软件预取可以廉价地让硬件填满TLB和缓存,如果你要触摸的第二个内存是冷的 . 如果天气很热,你先碰冷的一面,那就太不幸了。如果有一种廉价的方法来检查热/冷,那么当一个指针是热的,另一个指针是冷的时,使用它总是以正确的顺序(至少在第一步上)进行遍历可能是值得的。除非只读事务非常便宜,否则可能不值得使用玛格丽特的聪明答案。
如果你有两个指针,你将最终取消引用,其中一个指向一个页面,而另一个页面是热的,最好的情况是以某种方式检测到这一点,并让操作系统从后台的磁盘开始在一个页面中分页,而你遍历的一侧已经在RAM中。(例如,带窗户
昂贵的 因此,对树中的每一对指针中的一个进行VM预取系统调用是不值得的。当所有指针都在RAM中时,会出现大幅度的减速。 CPU设计可能性就像我说的,我不认为任何当前的isa都有这个功能,但我认为在硬件中使用运行类似于加载指令的指令很容易支持它,但是会根据TLB查找而不是从L1d缓存获取数据来生成结果。
这个
一个
加载到他们没有权限的TLB条目(仅内核映射)时,当前在某些x86 uarch(那些不易崩溃的uarch)上的行为非常特殊。见 The Microarchitecture Behind Meltdown
但是,如果在TLB/页未命中或L1d未命中以外的条件下中止,则需要外部缓存级别才能支持此特殊请求。如果try_加载命中三级缓存但在三级未命中时中止,则需要三级缓存的支持。不过,我想我们可以不那样做。 这种CPU架构思想的低挂起果实是减少页面错误和可能的页面行走,这比三级缓存未命中要昂贵得多。 我怀疑尝试对三级缓存未命中进行分支会使您在分支未命中中付出太多代价,而不是让无序的exec做它该做的事情。特别是如果你有超线程,所以这个延迟限制进程可以发生在CPU的一个逻辑核心上,它也在做其他事情。 |
|
Anon. · 用汇编语言解释这一行? 6 年前 |
![]() |
wangt13 · 如何使用VMX暂停和恢复VM 6 年前 |
![]() |
Kay · Skylake和更新的环形巴士 6 年前 |
![]() |
Kadir · Intel芯片上的半精度浮点算法 6 年前 |
![]() |
Some_Dude · x86汇编牛顿平方根算法寄存器为1#IND 6 年前 |