首页 文章

与缓存预取提示相反

提问于
浏览
6

是否有一个提示我可以放入我的代码中,表明应该从缓存中删除一行?与预取提示相反,这表明我将很快需要一条线 . 在我的情况下,我知道什么时候我不需要一条线,所以我希望能够摆脱它以释放我需要的线的空间 .

1 回答

  • 6

    clflush,clflushopt

    从高速缓存一致性域中的每个级别的高速缓存层次结构中无效,该高速缓存行包含使用内存操作数指定的线性地址 . 如果该缓存行包含缓存层次结构的任何级别的已修改数据,则该数据将写回内存 .

    它们并非在每个CPU上都可用(特别是, clflushopt 仅在第6代及更高版本中可用) . 要确定,您应该使用 CPUID 来验证其可用性:

    CLFLUSH的可用性由CPUID功能标志CLFSH(CPUID.01H:EDX [bit 19])的存在表示 . CLFLUSHOPT的可用性由CPUID功能标志CLFLUSHOPT(CPUID . (EAX = 7,ECX = 0):EBX [bit 23])的存在表示 .

    如果可用,您应该使用 clflushopt . 当刷新大于4KiB(64行)的缓冲区时,它的性能优于 clflush .

    这是Intel's Optimization Manual的基准:

    出于提供信息的目的(假设您在特权上下文中运行),您还可以使用invd(作为来自轨道的核武器选项) . 这个:

    使处理器的内部缓存无效(刷新)并发出特殊功能总线循环,指示外部缓存也刷新自身 . 内部缓存中保存的数据不会写回主内存 .

    wbinvd,其中:

    将处理器内部缓存中的所有已修改缓存行写回主内存,并使内部缓存无效(刷新) . 然后,该指令发出一个特殊功能的总线周期,指示外部高速缓存还写回修改的数据和另一个总线周期,以指示外部高速缓存应该无效 .

    未来可以进入ISA的指令是 club . 虽然这肯定会使这条线无效,但值得一提的是完整性 . 这个会:

    将包含内存操作数指定的线性地址的缓存行(如果为脏)写回内存,缓存一致性域中任何级别的缓存层次结构 . 该行可以在未修改状态下保留在高速缓存层次结构中 . 保留高速缓存层次结构中的行是性能优化(被硬件视为提示),以减少后续访问中高速缓存未命中的可能性 . 硬件可以选择在高速缓存层次结构中的任何级别保留该行,并且在某些情况下,可能使高速缓存层次结构中的行无效 .

相关问题