【问题标题】:Writing small benchmark tests编写小型基准测试
【发布时间】:2016-02-05 04:39:36
【问题描述】:

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

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

现在我只需要提出基准:
- 在 GB 范围内使用 memcpy()、memset() 和 memchr() 来测试 RAM 速度
- 用于测试 SIMD 指令的向量(或矩阵)运算
- 暴力破解平方根以测试一般指令速度和流水线
- 简单的算术(x[i]++ 或其他东西)来测试缓存 - 用 2,3 和 4 个不同值的模式填充数组。
对于每个不同的值(一个带有 if/else 的测试,一个带有 switch 的测试)做一些小事情。
那应该测试分支预测器。

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

【问题讨论】:

  • 现代 CPU 具有数百个微架构“功能”以及 ILP、内存/缓存带宽、预取、节能等方面的优化。每一个在常见或极端情况下都有特殊行为。所以是的,你很可能错过了一个功能。

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


【解决方案1】:

现在我只需要提出基准:

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

即使是这些由所谓的专家编写的基准测试,在给出可以作为工程师交流的合理结果方面也常常是荒谬的(营销人员做得更好)。现代机器(我避免使用“CPU”一词,因为这只是其中的一小部分,你有内存、互连、磁盘、驱动程序、操作系统……)在微优化级别上真的很难推理就像你建议的那样。通过这些简单的测试,您可能会对您的两台计算机有一些直觉,但这远非良好的数据。

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

即使是比您自己创建的要大得多的测试套件,也需要使用大量的统计盐。性能对比充满惊喜,很容易出错。

现在,回答为什么计算机 A 在这些特定基准上比 B 更快(或更慢)可能是微不足道的,也可能是不可能的。微不足道的情况可能是更多寄存器或更多缓存(以及明智地使用缓存的程序)之类的事情,并且不可能对制造商不会发布详细信息的 foobaddybar 进行一些更改,您只会猜测。

所以,抱歉,这样“显而易见”的测试会告诉您关于现代机器的许多有趣信息的日子已经一去不复返了。您需要使用相当严格的统计数据和基础架构才能获得半合理的结果。

【讨论】:

    猜你喜欢
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2016-03-08
    相关资源
    最近更新 更多