gpt4 book ai didi

c++ - 比较rdtsc clock和c++11 std::chrono::high_resolution_clock产生的时间测量结果

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:40 25 4
gpt4 key购买 nike

我正在尝试比较由 c++11 std::chrono::high_resolution_clock 和下面的 rdtsc_clock 时钟测量的时间。从 high_resolution_clock,我得到类似 11000、3000、1000、0 的结果。从 rdtsc_clock,我得到 134、15、91 等。为什么他们的结果看起来如此不同?根据我的直觉,我相信 rdtsc_clock 正在呈现 ~accurate 结果,对吗?

    template<std::intmax_t clock_freq>
struct rdtsc_clock {
typedef unsigned long long rep;
typedef std::ratio<1, clock_freq> period;
typedef std::chrono::duration<rep, period> duration;
typedef std::chrono::time_point<rdtsc_clock> time_point;
static const bool is_steady = true;

static time_point now() noexcept
{

unsigned lo, hi;
asm volatile("rdtsc" : "=a" (lo), "=d" (hi));

return time_point(duration(static_cast<rep>(hi) << 32 | lo));
}
};

时间码:

typedef std::chrono::high_resolution_clock Clock;
//typedef rdtsc_clock<3300000000> Clock;
typedef std::chrono::nanoseconds nanoseconds;
typedef std::chrono::duration<double, typename Clock::period> Cycle;
for(int n=0; n < 10; n++){
auto t1 = Clock::now();
//codes
auto t2 = Clock::now();
printf(%.0f ns \n", duration_cast<nanoseconds>(Cycle(t2 - t1)).count());
}

最佳答案

RDTSC 使用问题

如果您阅读了一些关于 RDTSC 的在线文档,您会发现它不能确保 RDTSC 指令之后的指令在 RDTSC 指令本身运行之前不会在管道中执行(也不能确保更早的指令不会运行然后)。通常的建议是在 RDTSC 之前和/或之后立即使用 CPUID 指令来触发此类“序列点”。显然这会影响程序性能,并且对于某些类型的测量比其他测量更可取(其中平均吞吐量数字比单个样本更令人感兴趣)。您可以期望标准库实现对此更加谨慎,这可能是其测量值高得多的原因之一。

跨核心问题(根据您的评论不相关)

每个 CPU 内核都维护自己的 TSC 寄存器...如果您只是开始在未绑定(bind)到内核的线程上采样,或者在未绑定(bind)到同一内核的多个线程上采样,您可能会看到值“奇怪”的跳跃.一些公司(例如 Microsoft)坚持认为硬件抽象层 (HAL) 负责尝试使寄存器尽可能接近同步,但许多(甚至是全新的高端)PC 根本无法做到这一点。

您可以通过绑定(bind)到一个核心来解决这个问题,或者通过执行一些校准步骤来测量交叉核心增量(具有一些校准误差裕度),然后根据对其进行采样的核心调整后面的样本(在大多数 CPU 上,这本身很难确定 - 您需要在 CPUID 指令或类似指令之间旋转采样)。

关于c++ - 比较rdtsc clock和c++11 std::chrono::high_resolution_clock产生的时间测量结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19719617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com