FLOPS 什么是真正的 FLOPS

4 c flops

我来自这个线程:FLOPS Intel core and testing it with C (innerproduct)

当我开始编写简单的测试脚本时,我想到了一些问题。

  1. 为什么要浮点数?浮点数有什么重要之处值得我们考虑?为什么不是一个简单的 int 呢?

  2. 如果我想测量 FLOPS,假设我正在计算两个向量的内积。两个向量必须是 float[] 吗?如果我使用 int[],测量结果会有什么不同?

  3. 我对Intel架构不熟悉。假设我有以下操作:

    float a = 3.14159; float b = 3.14158;
    for(int i = 0; i < 100; ++i) {
        a + b;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这是多少个“浮点运算”?

  4. 我有点困惑,因为我研究了简化的 32 位 MIPS 架构。对于每条指令,都有 32 位,例如操作数 1 为 5 位,操作数 2 为 5 位等。因此,对于英特尔架构(特别是与上一个线程相同的架构),我被告知寄存器可以保存 128 位。对于单精度浮点,每个浮点数 32 位,这是否意味着对于馈送到处理器的每条指令,它可以占用 4 个浮点数?我们是否还必须考虑操作数和指令其他部分中涉及的位?我们怎么能只向CPU提供4个浮点数而没有任何具体含义呢?

我不知道我这种零碎思考一切的方法是否有意义。如果不是,我应该看什么“高度”的视角?

Fal*_*ina 5

1.) 浮点运算代表比固定宽度整数更广泛的数学范围。此外,大量数值或科学应用程序(通常是实际测试 CPU 纯计算能力的应用程序)可能比任何东西都更依赖浮点运算。

2.) 它们都必须是浮动的。CPU不会将整数和浮点数相加,其中之一会被隐式转换(很可能整数会转换为浮点数),因此它仍然只是浮点运算。

3.) 这将是 100 个浮点运算,以及 100 个整数运算,以及一些(100?)控制流/分支/比较运算。通常还会有加载和存储,但您似乎没有存储该值:)

4.) 我不知道如何从这个开始,你似乎对材料有一个总体的看法,但你混淆了一些细节。是的,单个指令可以分为类似于以下的部分:

|OP CODE | Operand 1 | Operand 2 | (among many, many others)
Run Code Online (Sandbox Code Playgroud)

但是,操作数 1 和操作数 2 不必包含要相加的实际值。它们可以只包含要添加的寄存器。例如,采用以下 SSE 指令:

mulps      %%xmm3, %%xmm1
Run Code Online (Sandbox Code Playgroud)

它告诉执行单元将寄存器xmm3的内容与xmm1的内容相乘,并将结果存储在xmm3中。由于寄存器保存 128 位值,因此我对 128 位值进行操作,这与指令的大小无关。不幸的是,x86 由于是 CISC 架构,因此没有与 MIPS 类似的指令分解。x86 指令可以具有 1 到 16(!) 字节之间的任何位置。

至于你的问题,我认为这些都是非常有趣的知识,它可以帮助你建立对数学密集型程序速度的直觉,并让你了解优化时要实现的上限。不过,我从来没有尝试将其与程序的实际运行时间直接关联起来,因为太多其他因素会影响实际的最终性能。