linux没有标准,linux – 是否有标准的常量* nix基准,如果没有,如何制作`bogobench`?...

本文探讨了如何创建一个非相对的基准测试方法,比如bogobench,以在不同硬件上提供稳定的虚拟时序数。作者提出使用周期精确的模拟器,如MMIX架构,作为参考平台,以减少硬件特性对基准测试结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通的单线程* nix程序可以用像时间这样的实用程序进行基准测试,即:

# how long does `seq` take to count to 100,000,000

/usr/bin/time seq 100000000 > /dev/null

输出:

1.16user 0.06system 0:01.23elapsed 100%CPU (0avgtext+0avgdata 1944maxresident)k

0inputs+0outputs (0major+80minor)pagefaults 0swaps

…但返回的数字总是依赖于系统,从某种意义上说,它也衡量用户的硬件.

是否有一些非相对基准测试方法或命令行工具会在任何系统上(或至少是一个相当大的系统子集)返回大致相同的虚拟时序数?就像grep -m1 bogo / proc / cpuinfo返回a roughly approximate but stable unit一样,这样的基准也应该返回一个类似的持续时间单位.

假设对普通命令进行基准测试,我们有一个神奇的工具bogobench(其中“bogo”是一个形容词,表示“有点虚假状态”,但不一定与BogoMIPs有共同的算法):

bogobench foo bar.data

我们在两个物理上独立的系统上运行它:

> 1996年的奔腾II

> 2015 Xeon

期望的输出将是这样的:

21 bogo-seconds

因此,在两种情况下,bogobench应该返回大约相同的数字,即使它可能在第二个系统上完成的时间要少得多.

像qemu这样的硬件模拟器可能是一种方法,但不一定是唯一的方法:

>将代码插入到基准测试脚本bogo.sh中

>将bogo.sh复制到可引导的Linux磁盘映像bootimage.iso,在bogo.sh将自动运行的目录中,然后立即关闭模拟器.在此期间,它输出某种形式的计时数据以解析为bogo-seconds.

>使用qemu的minimal -machine选项之一运行bootimage.iso:

qemu-system-i386 -machine type=isapc bootimage.iso

但我不确定如何使qemu使用虚拟时钟,而不是主机CPU的时钟,而qemu本身似乎是一个看似简单的任务的重工具. (对于这样的任务,真的是MAME或MESS将是比qemu更多才多艺的模拟器 – 但是我不熟练使用MAME,尽管MAME currently has some capacity for 80486 PC emulation.)

在线我们有时会将机器X上基于时间的基准测试与机器Y上的基准测试进行比较和对比.而我希望用户X和Y能够在虚拟机Z上进行基准测试,并为模拟X提供奖励积分或Y(如MAME),如果需要,除了不考虑X或Y的实际运行时间(与MAME不同,仿真通常可以播放).通过这种方式,用户可以报告程序在有趣情况下的执行情况,而程序员不必担心结果会因用户硬件的特性(例如CPU怪癖,占用资源的后台进程等)而产生偏差.

实际上,即使在用户自己的硬件上,基于时间的基准测试也可能不可靠,因为用户通常无法确定某些后台进程(或错误或硬件错误,如坏扇区或病毒)可能不会降级表现的某些方面.而更虚拟的基准应该不那么容易受到这种影响.

解决方法:

我认为实现这一目标的唯一理智方法是使用周期精确的模拟器来进行某种硬件设计.

AFAIK,没有适用于现代x86硬件的公开可用的周期精确模拟器,因为它非常复杂,尽管有很多关于x86微体系结构内部的东西(Agner Fog的东西,英特尔和AMD自己的优化指南,以及x86标签中的其他内容) wiki),足够的行为仍然是一个充满CPU设计商业秘密的黑盒子,它最多可以模拟类似的东西. (例如,分支预测绝对是最秘密但非常重要的部分之一).

虽然应该可以接近模拟英特尔Sandybridge或Haswell的实际管道和无序核心/ ROB / RS(远远低于实时),但我没有人做过它.

但确实存在用于其他硬件设计的周期精确模拟器:Donald Knuth’s MMIX architecture是一种干净的RISC设计,实际上可以用硅片构建,但目前只存在于纸上.

从该链接:

Of particular interest is the MMMIX meta-simulator, which is able to do dynamic scheduling of a complex pipeline, allowing superscalar execution with any number of functional units and with many varieties of caching and branch prediction, etc., including a detailed implementation of both hard and soft interrupts.

所以你可以使用它作为参考机器,让每个人都可以运行他们的基准测试,每个人都可以获得可比较的结果,告诉你在MMIX上运行的速度有多快(在使用gcc编译MMIX之后).但不是它在x86上运行的速度有多快(大概也是用gcc编译),即使对于以不同方式执行相同工作的两个程序,这可能会有很大差异.

对于编程难题和Code Golf网站@orlp created the GOLF architecture with a simulator that prints timing results的[最快代码]挑战,正是为此目的而设计的.这是一个玩具架构,通过存储到0xffffffffffffffff来打印到stdout,所以它不一定会告诉你任何关于某些东西在任何真实硬件上运行的速度.

GOLF,AFAIK没有完整的C实现,所以你只能用手写的asm来实现它.这与MMIX有很大不同,MMIX是优化编译器的目标.

标签:linux,time,benchmarking,emulation,qemu,x86

来源: https://codeday.me/bug/20190611/1218617.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值