首页 文章

x86-64:缓存加载和逐出指令

提问于
浏览
2

对于x86-64架构,是否有一条指令可以将给定内存地址的数据加载到缓存中?类似地,是否存在可以在给定与该高速缓存行对应的存储器地址(或类似高速缓存行标识符)的情况下逐出高速缓存行的指令?

1 回答

  • 6

    将数据预取到缓存中(不将其加载到寄存器中):

    PREFETCHT0 [address]
    PREFETCHT1 [address]
    PREFETCHT2 [address]
    

    内在的: void _mm_prefetch (char const* p, int hint)

    请参阅insn ref manual和其他指南,了解不同的近似提示的含义 . (x86标签维基上的其他链接) .

    着名的What Every Programmer Should Know About Memory文章是在P4当前时编写的 . 当前的CPU具有更智能的硬件预取程序,超线程不仅仅是运行预取线程 . AFAIK,预取线程大多是一个死的想法 . 除此之外,关于缓存的优秀文章 . 搜索其他SO帖子和内容以决定何时实际预取 .

    不要在Intel IvyBridge上使用软件预取过度 . 该特定的微体系结构存在性能缺陷,并且只能退出one prefetch per 43 clocks .


    刷新包含给定地址的缓存行:

    clflush [address]
    clflushopt [address]   ; Newer CPUs only.  Weakly ordered, with higher throughput.
    

    内在的: void _mm_clflushopt (void const * p)

    有一个recent question about its performance .

相关问题