如何用C读取X86命中未命中缓存寄存器

如何用C读取X86命中未命中缓存寄存器,c,caching,x86,C,Caching,X86,你能给我举个简单的例子吗?我知道存在一些特殊的工具,但我想将其集成到我的代码中。 我想收集一些数据。我还需要知道什么时候会发生一些糟糕的情况 非常感谢,您要查找的数据可能在处理器的性能监视计数器(PMC)中可用,可以使用rdpmc指令读取。但是,有许多主要的“陷阱”涉及到它们,它们都表明在代码中使用它们是不合适的: 这些计数器的布局是特定于CPU型号的。每种型号的处理器都有一组不同的可用计数器。对一个模型正确工作的代码可能不会对另一个模型正确工作-除非您能够对一组非常大的机器进行测试,否则您无法

你能给我举个简单的例子吗?我知道存在一些特殊的工具,但我想将其集成到我的代码中。 我想收集一些数据。我还需要知道什么时候会发生一些糟糕的情况


非常感谢,

您要查找的数据可能在处理器的性能监视计数器(PMC)中可用,可以使用
rdpmc
指令读取。但是,有许多主要的“陷阱”涉及到它们,它们都表明在代码中使用它们是不合适的:


  • 这些计数器的布局是特定于CPU型号的。每种型号的处理器都有一组不同的可用计数器。对一个模型正确工作的代码可能不会对另一个模型正确工作-除非您能够对一组非常大的机器进行测试,否则您无法确保您的代码能够可靠工作

  • 性能计数器并不总是对用户空间应用程序可用。某些操作系统未在CR4中设置PCE位,这将导致执行时
    rdpmc
    抛出故障。您还没有提到您在这里使用的是什么操作系统,所以我不能说这是否会成为您的问题

  • 性能计数器的内容非常深奥。即使是我也不太了解它们。您在这里提出的问题(“读取X86命中未命中缓存寄存器”)表明您对该体系结构的理解相对有限,因此您不可能发现它们比我更有意义


  • 除非您有非常令人信服的理由从应用程序中读取这些数据,否则不要这样做。别管他们。请使用专用的分析工具。

    还要注意,在您可以
    rdpmc
    之前,您必须配置它们(告诉计数器要测量什么);要配置它们(至少,如果内核没有为您提供API),您需要使用只能在CPL=0时使用的
    wrmsr
    指令。每个处理器型号都有一组不同的可用计数器。是的,但同时不同的CPU应该有一些我可以读取的通用寄存器。如果我尝试读取一些不存在的寄存器,我应该得到一个零值和所有值。它不应该影响代码的可靠性。@塞格:若它是真的,那个就好了,但事实并非如此。CPU型号之间的性能计数器差别很大,在某些情况下,MSR在不同型号之间被重用。我只有AMD CPU和Linux RedHat。为什么我要担心不同类型的CPU?问题是如何在我的程序中使用C代码来收集一些关于硬件性能计数器的统计信息。有很多程序可以做到这一点。但是我试着用一些简单的例子来寻找关于它的信息。也许使用AMDCodexl,CodeAnalyst对AMDCPU会更好,因为它来自AMD。CodeAnalyst基于Linux平台的OProfile构建,可免费下载。