如何正确计算 CPU 和 GPU FLOPS 性能?

计算科学 软件 表现 图书馆 显卡 基准测试
2021-12-06 19:33:33

问题

我正在尝试计算 CPU / GPU FLOPS 性能,但我不确定我是否做得正确。

假设我们有:

  • Kaby Lake CPU(时钟:2.8 GHz,内核:4,线程:8)
  • Pascal GPU(时钟:1.3 GHz,内核:768)。

这个 Wiki 页面说 Kaby Lake CPU 计算 32 FLOPS(单精度 FP32)和 Pascal 卡计算 2 FLOPS(单精度 FP32),这意味着我们可以使用以下公式计算它们的总 FLOPS 性能:

中央处理器:

TOTAL_FLOPS = 2.8 GHz * 4 cores * 32 FLOPS = 358 GFLOPS

显卡:

TOTAL_FLOPS = 1.3 GHz * 768 cores * 2 FLOPS = 1996 GFLOPS

问题

  1. [已解决]我见过的大多数指南(比如这个)在公式中都使用了物理内核。我不明白为什么不使用线程(逻辑核心)呢?线程不是专门为使浮点计算性能加倍而创建的吗?那我们为什么要忽视它们呢?

  2. [已解决]我做对了吗?我找不到一个可靠的来源来计算 FLOPS,互联网上的所有信息都是矛盾的。对于 i7 7700HQ Kaby Lake CPU,我发现 FLOPS 值低至29 GFLOPS,尽管上面的公式为我们提供了 358 GFLOPS。我不知道该相信什么。

  3. Node.js / Python / C++ 中是否有一个跨平台(Win、Mac、Linux)库,它只返回所有 GPU 统计信息,如着色核心、时钟、可用指令集(或 FP32、FP64 FLOPS 值),所以我可以计算我自己的最大理论性能?我们无法直接从 CPU / GPU 获取 FLOPS 统计数据,这非常荒谬,我们必须下载并解析一个 wiki 页面才能获取值。即使在使用 C++ 时,似乎(我实际上并不知道)我们必须下载 2 GB CUDA 工具包才能访问基本的 Nvidia GPU 信息,例如内核数量 - 这实际上使得应用程序几乎不可能可供其他人使用,因为没有人会下载 2 GB 的应用程序。

2个回答

您可以通过这种方式计算 GFLOP 率,但这些数字在今天的硬件上毫无意义:

  • 浮点运算需要可变数量的时钟周期。加法通常比乘法便宜,但每次通常需要超过 28 亿个周期中的一个时钟周期。

  • 当你有超线程时,你有两个线程在一个核心上运行,但核心仍然只有一个浮点加法单元,所以两个线程不能同时执行浮点加法。

  • 浮点运算需要消耗大量能量,并且能量会转化为热量。当您执行大量 FLOP 时,处理器会过热并降低其时钟频率。

  • 如果您使用正确的指令,您可以执行浮点乘加 (FMA) 操作,使乘加运算比单独执行这些操作更快。

  • 类似地,使用 SIMD 指令,一个内核可以同时对多条数据执行相同的操作——例如,将四对浮点数相加,同时产生 4 个 FLOP。但这需要有一个算法实际上需要发生这种情况的问题,而不是在第二个中使用第一个加法的结果。因此,SIMD 指令只有助于提高某些算法的执行速度,而不会提高其他算法的执行速度。

  • 最重要的是,您通常希望对内存中的数据进行操作,但是将数据从主内存移动到处理器上所花费的时间比实际对数据执行任何操作要长得多——比如长 100 倍(数量级)。因此,在实际应用中,您通常看不到处理器理论浮点性能的一小部分:通常远低于理论峰值性能的 10%。

换句话说,计算峰值性能已经成为一种毫无意义的事情:它与处理器的实际性能没有太大关系。

Yoy 可以用俄语阅读 -如何计算 FLOPS

GHz 不显示 FLOPS。一个具有相同 GHz 的处理器可以比另一个具有相同 GHz 的处理器快得多。

PS gpu-s "rx 590" 和非常老的 "r7 250x" 具有几乎相同的 GHz。但是......这甚至是不正确的比较他们的表现)