【问题标题】:Generate timestamps for concurrent programs为并发程序生成时间戳
【发布时间】:2011-08-22 16:21:23
【问题描述】:

为了分析并发程序中的某些事件,我需要生成时间戳。到目前为止,我使用了clock_gettime,但我遇到了一些问题,其中一些是由于时钟不同造成的。

对于CLOCK_REALTIME,生成的时间戳似乎与事件的实际顺序不匹配,这意味着映射到事件的结果时间戳没有任何意义。

对于CLOCK_THREAD_CPUTIME_IDCLOCK_PROCESS_CPUTIME_ID,时间戳的顺序是有意义的,但我预计这种行为来自CLOCK_REALTIME,而不是依赖于线程/进程的时钟版本。此外,手册页指出,SMP 系统上可能存在虚假结果,我看不到。

我的问题是clock_gettime 是否有替代品,如果没有,我该如何解决我对可用系统时钟的误解?

【问题讨论】:

    标签: linux unix time timestamp


    【解决方案1】:

    如果我理解正确,您正在尝试在多线程程序中获取事件的顺序。 Clock_gettime 对于那个 IMO 来说有点太麻烦了。如果您在 Intel 机器上,为什么不直接插入 rdtsc 指令。它对周期更准确,开销也更小。您可以按如下方式调用 rdtsc:

    static inline unsigned long long rdtsc(void)
    {
        unsigned hi, lo;
        __asm__ __volatile__ ( 
                          "rdtsc \n"
                          : "=a"(lo), "=d"(hi));
        return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
    }
    

    顺便说一句,它在 SMP 系统上仍然是虚假的,因为两个芯片模块上的时钟很可能不同步。

    【讨论】:

    • @Aater-Suelman 那么其他机器呢?我不想只在英特尔机器上限制我的分析器。
    • 当然。让我澄清一下,我的意思是说任何 x86 机器,英特尔或 AMD,而不仅仅是英特尔。据我所知,每台机器都有某种读取时间戳计数器指令。
    • ARM 有一个 CP15 单元可以做同样的事情。我只是谷歌“rdtsc for arm”。 sparc 和 powerPC 也可以这样做。
    • @Aater-Suleman 感谢您进一步阅读和应用 rdtsc,我发现:strchr.com/performance_measurements_with_rdtsc 有一些不应该使用该功能的标准。繁重的 API 和 I/O,这意味着什么?我使用 rdtsc 创建一个时间戳并通过套接字发送这个时间戳。对于套接字,我使用 boost API,但也许这不是这个意思,是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 2023-04-07
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多