我很困惑rdtscp在多核环境中是否单调递增。根据文档:__rdtscp,rdtscp似乎是基于处理器的指令,可以防止围绕调用重新排序指令。
处理器在每个时钟周期单调递增时间戳计数器 MSR,并在处理器复位时将其复位为 0。
rdtscp肯定会在同一个 CPU 内核上单调递增,但是这个rdtscp时间戳是否保证在不同的 CPU 内核上是单调的?我相信没有这种绝对的保证。例如,
Thread on CPU core#0 Thread on CPU core#1
unsigned int ui;
uint64_t t11 = __rdtscp(&ui);
uint64_t t12 = __rdtscp(&ui);
uint64_t t13 = __rdtscp(&ui);
unsigned int ui;
uint64_t t21 = __rdtscp(&ui);
uint64_t t22 = __rdtscp(&ui);
uint64_t t23 = __rdtscp(&ui);
Run Code Online (Sandbox Code Playgroud)
以我的理解,我们可以有一个决定性的结论t13 > t12 > t11,但我们不能保证t21 > t13。
我想写一个脚本来测试我的理解是否正确,但我不知道如何构建一个例子来验证我的假设。
// file name: rdtscptest.cpp
// g++ rdtscptest.cpp -g -lpthread -Wall -O0 -o …Run Code Online (Sandbox Code Playgroud)