这里所述的_mm_prefetch
调用将内容从RAM中的给定存储器位置预取到高速缓存行.但是缓存完全在硬件控制之下吗?基于经常访问的存储器(基于空间/时间位置),硬件将内容从存储器预取到高速缓存.我认为程序员无法控制缓存,它完全是一种硬件机制.
所以我的理解是错误的,缓存实际上可以由我们控制,对吧?
如果_mm_prefetch
可以控制什么可以放在缓存中,
这是否意味着它永远不会从缓存中删除?
什么是等效的汇编级指令,它适用于缓存机制?
Margaret Blo.. 9
如果活动,我们总是可以通过简单地执行内存访问将数据移动到缓存中.
我们可以通过简单地"提前触摸"来预取var,我们不需要特殊的指令.
目前还不清楚"控制缓存"是什么意思,因为我们可以启用/禁用它,设置其模式,填充/溢出策略以及与其他HW线程共享模式.
我们还可以用数据填充缓存,并通过切割器使用算术力来驱逐一条线.
您假设程序员必须通过缓存控制任何东西然后并不完全有效,尽管不是不正确的:只要它遵守文档化的规范(包括根本没有缓存或溢出),CPU就可以自由地实现它想要的任何缓存策略.缓存每个X时钟滴答).
我们还做不到的一件事就是在缓存中固定行,我们不能告诉CPU永远不要驱逐特定的行.
编辑正如@Mysticial在评论中指出的那样,可以将数据固定到较新的Intel CPU中的L3缓存中.
的PREFETCHT0
,PREFETCHT1
,PREFETCHT2
,PREFETCHTNTA
和PREFETCHWT1
指令,其_mm_prefetch
被编译到只是一个提示的预取硬件如果存在的话,活性,并愿意尊重提示1.
他们有限的使用案例3更多地来自对数据将停止的缓存层次级别的更精细控制以及核心资源2的减少使用,而不是将数据移动到缓存中的方式.
一旦预取了一行,就会像任何其他行一样从缓存中删除它.
1这些硬件预取程序通常由内存访问模式(如顺序访问)触发,并且与执行流程异步.
2它们本质上是异步的(在本地快速完成)并且可能不会污染负载所需的核心资源(例如寄存器,负载单元等).
3虽然人们可能认为提示最糟糕无用(如果没有得到尊重),实际上可以证明prefetch会降低性能.
如果活动,我们总是可以通过简单地执行内存访问将数据移动到缓存中.
我们可以通过简单地"提前触摸"来预取var,我们不需要特殊的指令.
目前还不清楚"控制缓存"是什么意思,因为我们可以启用/禁用它,设置其模式,填充/溢出策略以及与其他HW线程共享模式.
我们还可以用数据填充缓存,并通过切割器使用算术力来驱逐一条线.
您假设程序员必须通过缓存控制任何东西然后并不完全有效,尽管不是不正确的:只要它遵守文档化的规范(包括根本没有缓存或溢出),CPU就可以自由地实现它想要的任何缓存策略.缓存每个X时钟滴答).
我们还做不到的一件事就是在缓存中固定行,我们不能告诉CPU永远不要驱逐特定的行.
编辑正如@Mysticial在评论中指出的那样,可以将数据固定到较新的Intel CPU中的L3缓存中.
的PREFETCHT0
,PREFETCHT1
,PREFETCHT2
,PREFETCHTNTA
和PREFETCHWT1
指令,其_mm_prefetch
被编译到只是一个提示的预取硬件如果存在的话,活性,并愿意尊重提示1.
他们有限的使用案例3更多地来自对数据将停止的缓存层次级别的更精细控制以及核心资源2的减少使用,而不是将数据移动到缓存中的方式.
一旦预取了一行,就会像任何其他行一样从缓存中删除它.
1这些硬件预取程序通常由内存访问模式(如顺序访问)触发,并且与执行流程异步.
2它们本质上是异步的(在本地快速完成)并且可能不会污染负载所需的核心资源(例如寄存器,负载单元等).
3虽然人们可能认为提示最糟糕无用(如果没有得到尊重),实际上可以证明prefetch会降低性能.