是否有一个提示我可以放入我的代码中,表明应该从缓存中删除一行?与预取提示相反,这表明我将很快需要一条线 . 在我的情况下,我知道什么时候我不需要一条线,所以我希望能够摆脱它以释放我需要的线的空间 .
从高速缓存一致性域中的每个级别的高速缓存层次结构中无效,该高速缓存行包含使用内存操作数指定的线性地址 . 如果该缓存行包含缓存层次结构的任何级别的已修改数据,则该数据将写回内存 .
它们并非在每个CPU上都可用(特别是, clflushopt 仅在第6代及更高版本中可用) . 要确定,您应该使用 CPUID 来验证其可用性:
clflushopt
CPUID
CLFLUSH的可用性由CPUID功能标志CLFSH(CPUID.01H:EDX [bit 19])的存在表示 . CLFLUSHOPT的可用性由CPUID功能标志CLFLUSHOPT(CPUID . (EAX = 7,ECX = 0):EBX [bit 23])的存在表示 .
如果可用,您应该使用 clflushopt . 当刷新大于4KiB(64行)的缓冲区时,它的性能优于 clflush .
clflush
这是Intel's Optimization Manual的基准:
出于提供信息的目的(假设您在特权上下文中运行),您还可以使用invd(作为来自轨道的核武器选项) . 这个:
使处理器的内部缓存无效(刷新)并发出特殊功能总线循环,指示外部缓存也刷新自身 . 内部缓存中保存的数据不会写回主内存 .
或wbinvd,其中:
将处理器内部缓存中的所有已修改缓存行写回主内存,并使内部缓存无效(刷新) . 然后,该指令发出一个特殊功能的总线周期,指示外部高速缓存还写回修改的数据和另一个总线周期,以指示外部高速缓存应该无效 .
未来可以进入ISA的指令是 club . 虽然这肯定会使这条线无效,但值得一提的是完整性 . 这个会:
club
将包含内存操作数指定的线性地址的缓存行(如果为脏)写回内存,缓存一致性域中任何级别的缓存层次结构 . 该行可以在未修改状态下保留在高速缓存层次结构中 . 保留高速缓存层次结构中的行是性能优化(被硬件视为提示),以减少后续访问中高速缓存未命中的可能性 . 硬件可以选择在高速缓存层次结构中的任何级别保留该行,并且在某些情况下,可能使高速缓存层次结构中的行无效 .
1 回答
clflush,clflushopt
它们并非在每个CPU上都可用(特别是,
clflushopt
仅在第6代及更高版本中可用) . 要确定,您应该使用CPUID
来验证其可用性:如果可用,您应该使用
clflushopt
. 当刷新大于4KiB(64行)的缓冲区时,它的性能优于clflush
.这是Intel's Optimization Manual的基准:
出于提供信息的目的(假设您在特权上下文中运行),您还可以使用invd(作为来自轨道的核武器选项) . 这个:
或wbinvd,其中:
未来可以进入ISA的指令是
club
. 虽然这肯定会使这条线无效,但值得一提的是完整性 . 这个会: