gpt4 book ai didi

linux - 无法复现intel白皮书中的高精度时间测量内核模块

转载 作者:行者123 更新时间:2023-12-03 09:51:23 25 4
gpt4 key购买 nike

我正在尝试重现 How to Benchmark Code Execution Times on Intel IA-32 and IA-64 Instruction Set Architectures White Paper .本白皮书提供了一个内核模块来准确测量一段代码的执行时间,通过禁用抢占和使用RDTSC等。

但是,在运行白皮书中报告的基准测试代码时,我无法获得预期的低方差,这意味着白皮书中的技术不起作用。我找不到问题所在。

内核模块的核心就几行

unsigned int flags;
preempt_disable();
raw_local_irq_save(flags);

asm volatile(
"CPUID\n\t"
"RDTSC\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t"
: "=r"(cycles_high), "=r"(cycles_low)::"%rax", "%rbx", "%rcx", "%rdx");
/* call the function to measure here */
asm volatile(
"RDTSCP\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t"
"CPUID\n\t"
: "=r"(cycles_high1), "=r"(cycles_low1)::"%rax", "%rbx", "%rcx", "%rdx");
raw_local_irq_restore(flags);
preempt_enable();

代码直接抄自白皮书,并做了优化。从白皮书来看,预期的输出应该是

loop_size:995 >>>> variance(cycles): 0; max_deviation: 0 ;min time: 2216
loop_size:996 >>>> variance(cycles): 28; max_deviation: 4 ;min time: 2216
loop_size:997 >>>> variance(cycles): 0; max_deviation: 112 ;min time: 2216
loop_size:998 >>>> variance(cycles): 28; max_deviation: 116 ;min time: 2220
loop_size:999 >>>> variance(cycles): 0; max_deviation: 0 ;min time: 2224
total number of spurious min values = 0
total variance = 1
absolute max deviation = 220
variance of variances = 2
variance of minimum values = 335757

然而,我得到的是

[1418048.049032] loop_size:42 >>>> variance(cycles): 104027;max_deviation: 92312 ;min time: 17
[1418048.049222] loop_size:43 >>>> variance(cycles): 18694;max_deviation: 43238 ;min time: 17
[1418048.049413] loop_size:44 >>>> variance(cycles): 1;max_deviation: 60 ;min time: 17
[1418048.049602] loop_size:45 >>>> variance(cycles): 1;max_deviation: 106 ;min time: 17
[1418048.049792] loop_size:46 >>>> variance(cycles): 69198;max_deviation: 83188 ;min time: 17
[1418048.049985] loop_size:47 >>>> variance(cycles): 1;max_deviation: 60 ;min time: 17
[1418048.050179] loop_size:48 >>>> variance(cycles): 1;max_deviation: 61 ;min time: 17
[1418048.050373] loop_size:49 >>>> variance(cycles): 1;max_deviation: 58 ;min time: 17
[1418048.050374]
total number of spurious min values = 2
[1418048.050374]
total variance = 28714
[1418048.050375]
absolute max deviation = 101796
[1418048.050375]
variance of variances = 1308070648

比白皮书高得多的 max_deviation 和 variance(cycles)。(请忽略不同的min time,因为白皮书可能实际上是在对某些东西进行基准测试,但我的代码实际上并没有对任何东西进行基准测试。)

报告中是否遗漏了任何内容?或者白皮书不是最新的,我错过了现代 x86 CPU 中的一些技术?如何在现代英特尔 x86 CPU 架构中以最高精度测量一段代码的执行时间?

附言我运行的代码 is placed here .

最佳答案

大多数英特尔处理器都有一个恒定的 TSC,这意味着核心频率和 TSC 频率可能不同。如果一个操作需要固定数量的核心周期才能完成,则在不同运行中执行操作期间,它可能需要非常不同的 TSC 周期数,具体取决于核心频率。当max_deviation很大,这表明核心频率在该次迭代执行期间发生了显着变化。解决方案是将核心频率固定为处理器的最大非睿频频率。有关常量 TSC 的更多信息,请参阅:Can constant non-invariant tsc change frequency across cpu states? .

please ignore different min time, since the white paper may beactually benchmarking something, but my codes do not actuallybenchmark anything.

最小值取决于微架构、核心频率(可以动态变化)和 TSC 频率(接近基本频率的某个固定值)。白皮书的作者只说他们使用的是 Core i7 处理器。在 2010 年,这是 Nehalem 或 Westmere 处理器。

您从论文中复制的测量值来自第 3.3.2 节“使用替代方法的分辨率”。替代方法使用 mov cr0, rax用于序列化而不是 rdtscp .但是您的代码来自第 3.2.2 节。

请注意 if ((end - start) < 0) {...}end 时永远不会为真和 start是无符号整数,因为减法的结果是无符号的,常量 0 也被转换为无符号类型。将其更改为 if (end < start) {...} .

关于linux - 无法复现intel白皮书中的高精度时间测量内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65751496/

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