cpu-cache相关内容
Core A将值x写入到storebuffer中,等待无效的ack,然后将x刷新到高速缓存中.它只等待一个ack还是等待所有ack?以及它如何确定所有CPU中有多少个托架? 解决方案 对我来说,您不清楚“无效确认"是什么意思,但是假设您的意思是源自另一个请求所有权的核心的监听/无效在同一行. 在这种情况下,由于存储缓冲区中的存储尚不全局可见,因此存储缓冲区中的存储通常可以自由地忽略来
..
是否有任何这样的处理器,它们有指令绕过特定数据的缓存? 这个问题也有一个答案,表明SSE4.2指令确实绕过了缓存.有人可以启发我吗? 解决方案 通常,缓存策略由内存管理单元(MMU)控制.对于每个地址范围,都会确定一个缓存策略.这些表由OS管理,并且在系统空间中可用. 作为对您可能要问的问题的补充说明,对于具有高速缓存的体系结构,通常有CPU命令可用于同步/无效/刷新高速缓存.但是,与MM
..
我在IvyBridge上,我编写了以下简单程序来测量mov的延迟: section .bss align 64 buf: resb 64 section .text global _start _start: mov rcx, 1000000000 xor rax, rax loop: mov rax, [buf+rax]
..
如果有一个64字节的缓冲区被大量读取/写入,则很可能将其保留在L1中;否则,它将保留在L1中.但是有什么方法可以强迫这种行为吗? 在这种情况下,授予一个内核对这64个字节的独占访问权,并告诉它不要与其他内核或内存控制器同步数据,以便使这64个字节始终驻留在一个内核的L1中,而不管CPU是否认为它是经常使用. 解决方案 否,x86不允许您这样做.您可以使用clfushopt强制退出,或
..
x86 INVD 使缓存层次结构无效,而无需将内容写回记忆中. 我很好奇,这样的指令有什么用?鉴于人们几乎无法控制各种高速缓存级别中的哪些数据,甚至还很少控制可能已经异步刷新的数据,这似乎只是一种确保您只是不知道什么数据的方法而已.被保存在内存中了. 解决方案 一个很好的问题! 诸如invd这样的钝器指令的一个用例是专用的或非常早的引导代码,例如尚未验证RAM是否存在的情况.由
..
在Intel处理器上 Linux linux-epq2.site 3.7.10-1.11-desktop #1 SMP PREEMPT Thu May 16 20:27:27 UTC 2013 (adf31bb) x86_64 x86_64 x86_64 GNU/Linux 获取缓存详细信息: cat /sys/devices/system/cpu/cpu*/cache/index
..
我正在为32位模式下运行的ARMv8(Cortex-A53)实现缓存维护功能. 当我尝试通过使用虚拟地址(VA)刷新内存区域时出现问题. DCacheFlushByRange看起来像这样 // some init. // kDCacheL1 = 0; kDCacheL2 = 2; while (alignedVirtAddr
..
这是常见声明将字节存储到缓存中可能会导致内部读-修改-写周期,或者与存储完整的寄存器相比,会损害吞吐量或延迟. 但是我从未见过任何示例.没有x86 CPU是这样的,我认为所有高性能CPU都可以直接修改高速缓存行中的任何字节.如果某些微控制器或低端CPU完全具有缓存,是否有所不同? (我不算字寻址机器,或者说Alpha是字节可寻址的,但是缺少字节加载/存储指令.我说的是ISA本机支持的最
..
我对CPU缓存和物理地址之间的“别名" 的含义感到困惑. 首先,我在Wikipedia上找到了它的定义: 但是,VIVT遇到混淆问题,其中几个不同的虚拟地址可能引用相同的物理地址.另一个问题是同音异义词,其中同一个虚拟地址映射到几个不同的物理地址. 但是过了一会儿,我在演示文稿上看到了一个不同的定义( ppt ) DAC'05:“针对具有以下功能的嵌入式处理器的节能物理标记式缓存 虚拟
..
我正在用C编写一个小程序,我想衡量它的性能. 我想看看它在处理器中运行了多少时间,以及它造成了多少次高速缓存命中+未命中.关于上下文切换和内存使用的信息也将很高兴. 程序执行不到一秒钟. 我喜欢/proc/[pid]/stat的信息,但是我不知道程序死/被杀死后如何查看. 有什么想法吗? 编辑:我认为Valgrind会增加很多开销.这就是为什么我想要一个始终可用的简单
..
我最近了解了行锤攻击.为了进行这种攻击,程序员需要为特定数量的地址刷新CPU的完整缓存层次结构. 我的问题是:为什么在x86中必须 CLFLUSH ?如果所有L *高速缓存均透明地起作用(即不需要显式的高速缓存失效),那么使用该指令的原因是什么?除此之外:CPU难道不可以推测内存访问模式,从而完全忽略指令吗? 解决方案 我认为主要用例是非易失性DIMM ,尤其是英特尔的Optane
..
我正在尝试为Intel的 clwb 指令查找配置或内存访问模式,该配置或内存访问模式不会使高速缓存行无效.我正在使用NVDIMM的Intel Xeon Gold 5218处理器进行测试. Linux版本是5.4.0-3-amd64.我尝试使用Device-DAX模式并将此char设备直接映射到地址空间.我还尝试将此非易失性存储器添加为新的NUMA节点,并使用numactl --membind命令将
..
英特尔手动优化(2019年9月修订)显示了针对Ice Lake微体系结构的48 KiB 8路关联L1数据缓存. 1 软件可见的延迟/带宽将根据访问模式和其他因素而变化. 这让我感到困惑,因为: 有96组(48 KiB/64/8),不是2的幂. 集合的索引位和字节偏移的索引位加起来超过12位,这使得 cheap-PIPT -as-VIPT-技巧不适用于4KiB页面. 总而言
..
我正在阅读MDS攻击文件 RIDL:流氓机上数据加载.他们讨论了行填充缓冲区如何导致数据泄漏. 关于RIDL漏洞和“重放"负载问题,讨论了该漏洞的微体系结构细节. 在阅读了这个问题后,我仍然不清楚的一件事是,如果我们已经有一个存储缓冲区,为什么我们需要一个行填充缓冲区. John McCalpin在 对于到WB空间的商店,商店数据将保留在商店缓冲区中,直到商店退役之后.退役后,数据可
..
考虑以下示例,证明存在虚假共享: using type = std::atomic; struct alignas(128) shared_t { type a; type b; } sh; struct not_shared_t { alignas(128) type a; alignas(128) type b; } not_sh;
..
我一直在某些算法上运行一些基准测试,并分析它们的内存使用情况和效率(L1/L2/TLB访问和未命中),其中一些结果对我来说很有趣. 考虑到包含性的缓存层次结构(L1和L2缓存), L1缓存未命中的次数是否应该与 L2缓存访问次数一致?我发现的一种解释是与TLB相关的:当虚拟地址未在TLB中映射时,系统会自动跳过某些缓存级别中的搜索. 这看起来合法吗? 解决方案 首先,包含性缓存层次结
..
这种情况浮现在我的脑海,似乎有点基本,但我会问. 因此L1中有一个虚拟索引和物理标记,但是该集合已满,因此被逐出. L1控制器如何从虚拟索引和L1中的物理标签获取完整的物理地址,以便可以将线路插入L2?我想它可以在TLB中搜索组合,但这似乎很慢,而且可能根本不在TLB中.也许来自原始TLB转换的完整物理地址存储在高速缓存行旁边的L1中? 这也引发了一个更广泛的问题:当PMH将访问的位写
..
我听说MLB维护TLB,而不是CPU缓存. 那么,一个TLB是否存在于CPU上并在所有处理器之间共享,或者每个处理器都有自己的TLB缓存? 有人可以解释一下MMU与L1,L2缓存之间的关系吗? 解决方案 TLB缓存页表中列出的翻译.每个CPU内核可以在具有不同页表的不同上下文中运行.如果它是一个单独的“单元",则将其称为MMU,因此每个内核都有自己的MMU.任何共享的缓存始终会被物
..
我了解了不同的缓存映射技术,例如直接映射,关联映射和集合关联映射技术,还学习了权衡取舍.但是我很好奇如今在英特尔酷睿i7或AMD处理器中使用了什么.以及技术如何发展.还有什么需要改进的地方? 解决方案 现代高性能CPU基本上从不使用直接映射的缓存.对于相同大小的集关联高速缓存,命中率的巨大优势大大节省了功率,而控制逻辑的复杂性仅高一点.如今,晶体管预算非常庞大. 对于软件来说,至少有
..
我正在阅读MDS攻击文件 RIDL:流氓机上数据加载.将页面设置为回写,直写,写合并或不可缓存,并通过不同的实验确定行填充缓冲区是微体系结构泄漏的原因. 切线:我知道内存是不可缓存的,但是我假设可缓存数据始终缓存在回写缓存中,即,我假设L1,L2和LLC始终是回写缓存. 我在《计算机体系结构》书中阅读了回写式缓存与直写式缓存之间的差异.它说: 直写式缓存更易于实现,并且可以使用写
..