编写小型基准测试

时间:2015-11-04 15:45:28

标签: caching x86-64 pipeline simd branch-prediction

我正在买一台新电脑。这很好,但我想知道它的速度有多快 现在我可以使用已经建立的基准 - 但我想知道为什么它更快。

所以我的想法是:
1.写一些小基准来测试非常具体的东西
2.使用-march = native
进行两次编译 3.简介和比较

现在我只需要提出基准:
- memcpy(),memset()& memchr()在GB范围内测试RAM速度
- 测试SIMD指令的矢量(或矩阵)运算
- 强制平方根来测试一般指令速度和管道
- 简单的算术(x [i] ++或其他)来测试缓存 - 使用2,3和4个不同值的模式填充数组   对于每个不同的值(使用if / else进行一次测试,使用switch进行一次测试)做一些小事   那应该测试分支预测器。

我错过了一个功能吗?这些基准可以简化吗?对于我认为已涵盖的CPU功能,还有其他/更好的测试吗?

1 个答案:

答案 0 :(得分:3)

  

现在我只需要提出基准测试:

“只是”:-)。为人们比较计算机编写基准实际上是一个有利可图的行业。这是微不足道的 FAR 。即使是专业人士也会写出愚蠢的基准。对于一些商业提供商的例子,搜索SPEC,Geekbench,EEMBC ......他们花了很多钱。

即使是这些基准测试,由所谓的专家编写,在提供合理的结果时经常是荒谬的,你可以作为工程师进行沟通(营销人员做得更好)。现代机器(我避免使用术语“CPU”,因为这只是其中的一小部分,你有记忆,互连,磁盘,驱动程序,操作系统......)在微优化级别上真的很难推理就像你在暗示的那样。通过这些简单的测试,您可能会对两台计算机有所了解,但它远不是好的数据。

我能推荐的最好的是运行编译器基准测试套件。 LLVM有一个test-suite项目,你可以运行各种基准测试来了解你的新计算机有多好。我相信GCC会有类似的东西,我只是不熟悉它。运行测试套件的说明是here

即使是那个比你自己创造的大得多的测试套件,也需要大量的统计盐。性能比较充满惊喜,而且很容易弄错。

现在,回答为什么计算机A比这些特定基准测试中的B 更快(或更慢)可以从微不足道到不可能。琐碎的案例可以是更多的寄存器或更多的缓存(以及一个使用缓存的程序),并且不可能对foobaddybar进行一些改变,制造商不会发布细节,你只会被猜测。

所以,对不起,但是日子已经过去,这些“明显”的测试会告诉你很多关于现代机器的有趣信息。您需要使用非常严肃的统计数据和基础设施来获得半合理的结果。