我正在测试库中几个函数的延迟。为了做到这一点,我在进入和退出时使用rdtsc(),我跟踪得到的rdtsc值,运行最小值,最大值和调用次数(以获得平均值)。当我看到输出的图形时,我会看到大约100个左右的周期的平均值,但大约20000个周期的峰值或类似的干扰(似乎比简单的分支误预测,功能中的3或4个分支差得多)。我跑cachegrind,我得到这样的输出:Valgrind输出和rdtsc不一致...为什么会这样呢?
==14038==
==14038== I refs: 2,260,149,383
==14038== I1 misses: 10,408
==14038== LLi misses: 3,978
==14038== I1 miss rate: 0.00%
==14038== LLi miss rate: 0.00%
==14038==
==14038== D refs: 1,100,962,403 (773,471,444 rd + 327,490,959 wr)
==14038== D1 misses: 26,419 ( 13,447 rd + 12,972 wr)
==14038== LLd misses: 15,446 ( 5,701 rd + 9,745 wr)
==14038== D1 miss rate: 0.0% ( 0.0% + 0.0% )
==14038== LLd miss rate: 0.0% ( 0.0% + 0.0% )
==14038==
==14038== LL refs: 36,827 ( 23,855 rd + 12,972 wr)
==14038== LL misses: 19,424 ( 9,679 rd + 9,745 wr)
==14038== LL miss rate: 0.0% ( 0.0% + 0.0% )
==14038==
==14038== Branches: 327,248,773 (297,539,058 cond + 29,709,715 ind)
==14038== Mispredicts: 980,262 ( 978,639 cond + 1,623 ind)
==14038== Mispred rate: 0.2% ( 0.3% + 0.0% )
在错误预测和分支命中率如此之低,这让我不知道是怎么回事on..how是我可能看到的数量级上的高延迟的测量20K周期如此频繁?我可以研究哪些更多的东西来解决这个谜团?会是什么呢?
事实上,一些令人震惊的是,RDTSC测量一个仅仅包装是这样的:
if(memberVarBool_)
{
memberVarPtr->smallFuncWithThreeIntAssignsAndstdmax;
}
这家伙给我看了很多的“25”个周期的东西这是有道理的,但也有很多oultier病例约2000个周期!
更新:我只是切换到使用gettimeofday来测量延迟纳秒,希望避免特定于rdtsc的问题,仍然看到相同的东西......有没有一种方法,我可以避免抢占和外部或过程的影响,在我的meaurements?
您是否正在实时操作系统上运行?有很多事情会影响你的过程。 – Chad 2012-07-20 20:25:25
你的进程是否被抢占或系统调用? – PlasmaHH 2012-07-20 20:26:12
@Chad,我会尝试运行ulimit -r99 ..但我想排除实际的低效率或代码本身的问题。 – 2012-07-20 20:35:32