为了进行基准测试,我使用rdtsc
来确定在关键循环中执行一些代码块所花费的伪时间。由于我的代码可以随时在进程之间重新安排,我想通过转储数据来最小化噪声,如果我发现我在微测量的开始和停止之间改变了CPU。
我是否可以使用x86指令来识别我正在运行的CPU /核心?能给我一个唯一标识符,或CPU#和核心#等的东西。
显然,cpuid
不再提供信息,所以我正在寻找替代方案。
答案 0 :(得分:1)
不是真的。你真的不想要一个单独的指令,因为你的线程可以在执行指令之后立即迁移到另一个核心,然后你可以对它的结果做任何有用的事情(或者在RDTSC和“我在用什么核心?”之间)。校验)。 RDTSCP可以方便地避免这种情况,因为它既可以提供TSC,也可以在单个指令中返回操作系统告诉它的任何内容,但它需要操作系统支持并且是串行指令(因此比RDTSC更重要,这可能会影响细粒度的时序测量)
正如评论中提到的那样,如果每个度量的精度对您来说很重要,您可能需要使用OS API来固定线程以确保它不会迁移。或者,迁移将相对较少,因此如果您可以进行足够的测量,那么它导致的偶然异常值将是显而易见的,并且易于排除。