- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试重现 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/
我正在开发一个 Angular 应用程序并想使用 Protractor 对其进行测试。我在中继器内有一个中继器。 我这样选择第一个中继器: var firstRepeater = element.al
vector *> victimDomains; 这是什么意思? 我得到了第一颗星 ( DomainInfo* ) 但第二颗是什么? 让我们说 DomainInfo有两个属性 ID和 name .如
如果我执行这段代码: vector > idft( vector > * v) { for_each(v->begin(), v->end(), conj); 然后编译器给我以下错误: dft
我是一名优秀的程序员,十分优秀!