3

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

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

  1. 为什么是浮点数?我们必须考虑的浮点有什么重要意义?为什么不是一个简单的int?

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

  3. 我不熟悉英特尔架构。假设我有以下操作:

    float a = 3.14159; float b = 3.14158;
    for(int i = 0; i < 100; ++i) {
        a + b;
    }
    

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

  4. 我有点困惑,因为我研究了一个简化的 32 位 MIPS 架构。对于每条指令,有 32 位,例如操作数 1 为 5 位,操作数 2 为 5 位等。所以对于英特尔架构(特别是与前一个线程相同的架构),我被告知寄存器可以容纳 128 位。对于单精度浮点,每个浮点数 32 位,这是否意味着对于馈送到处理器的每条指令,它可以采用 4 个浮点数?难道我们还不需要考虑操作数和指令其他部分中涉及的位吗?我们如何才能将 4 个浮点数输入到 CPU 中而没有任何具体含义?

我不知道我将所有事情都零碎思考的方法是否有意义。如果不是,我应该看什么“高度”的视角?

4

9 回答 9

4

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

2.)它们都必须是浮动的。CPU不会添加一个整数和一个浮点数,一个或另一个会被隐式转换(很可能整数会被转换为浮点数),所以它仍然只是浮点运算。

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

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

|OP CODE | Operand 1 | Operand 2 | (among many, many others)

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

mulps      %%xmm3, %%xmm1

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

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

于 2009-10-09T04:29:05.797 回答
3
  1. 浮点和整数运算在芯片上使用不同的流水线,因此它们以不同的速度运行(在足够简单/足够老的架构上,可能根本没有原生浮点支持,使得浮点运算非常慢)。因此,如果您尝试估计使用浮点数学的问题的实际性能,您需要知道这些操作的速度。

  2. 是的,您必须使用浮点数据。见#1。

  3. FLOP 通常定义为特定操作混合的平均值,旨在代表您要建模的现实世界问题。对于您的循环,您只需将每次添加算作 1 次操作,总共 100 次操作。但是:这并不代表大多数现实世界的工作您可能必须采取措施防止编译器优化所有工作。

  4. 向量化或 SIMD(单指令多数据)可以做到这一点。目前使用的 SIMD 系统示例包括 AltiVec(在 PowerPC 系列芯片上)和 MMX/SSE/... 在 Intel x86 上并兼容。芯片的这种改进应该因为做了更多的工作而受到称赞,所以即使只有 25 个获取和工作周期,上面的琐碎循环仍将被计为 100 次操作。编译器要么需要非常聪明,要么从程序员那里得到提示以使用 SIMD 单元(但现在大多数前线编译器都非常聪明)。

于 2009-10-09T13:16:48.483 回答
1

每秒浮点运算。

http://www.webopedia.com/TERM/F/FLOPS.html

您的示例是 100 个浮点运算(将两个浮点数相加是一个浮点运算)。分配浮点数可能会也可能不会计数。

该术语显然不是一个精确的度量,因为很明显双精度浮点运算将比单精度浮点运算花费更长的时间,而乘法和除法将比加法和减法花费更长的时间。正如Wikipedia文章所证明的那样,最终有更好的方法来衡量性能。

于 2009-10-09T04:06:23.917 回答
0
  1. 浮点数学在很多事情上都比整数数学做得好得多。大多数大学计算机科学课程都有一门名为“数值分析”的课程。

  2. 向量元素必须是 float、double 或 long double。内积计算将比元素为整数时慢。

  3. 那将是 100 个浮点相加。(也就是说,除非编译器意识到没有对结果进行任何处理并优化整个事情。)

  4. 计算机使用多种内部格式来表示浮点数。在您提到的示例中,CPU 会将 32 位浮点数转换为其内部 128 位格式,然后再对数字进行操作。

除了其他答案提到的用途外,如今被称为“量化专家”的人还使用浮点数学进行金融。一个名叫 David E. Shaw 的人于 1988 年开始将浮点数学应用于华尔街建模,截至 2009 年 9 月 30 日,他的身家为 25 亿美元,在福布斯 400 位最富有的美国人中排名第 123 位。

所以值得学习一下浮点数学!

于 2009-10-09T05:13:19.077 回答
0

1) Floating point is important because sometimes we want to represent really big or really small numbers and integers aren't really so good with that. Read up on the IEEE-754 standard, but the mantissa is like the integer portion, and we trade some bits to work as an exponent, which allows a much more expanded range of numbers to be represented.

2) If the two vectors are ints, you won't measure FLOPS. If one vector is int and another is float, you'll be doing lots of int->float conversions, and we should probably consider such a conversion to be a FLOP.

3/4) Floating point operations on Intel architectures are really quite exotic. It's actually a stack-based, single operand instruction set (usually). For instance, in your example, you would use one instruction with an opcode that loads a memory operand onto the top of the FPU stack, and then you would use another instruction with an opcode that adds a memory operand to the top of the FPU stack, and then finally another instruction with an opcode that pops the top of the FPU stack to the memory operand.

This website lists a lot of the operations.

http://www.website.masmforum.com/tutorials/fptute/appen1.htm

I'm sure Intel publishes the actual opcodes somewhere, if you're really that interested.

于 2009-10-14T05:18:43.127 回答
0

1)因为许多现实世界的应用程序运行处理大量浮点数,例如所有基于矢量的应用程序(游戏、CAD 等)几乎完全依赖于浮点运算。

2) FLOPS 用于浮点运算。

3) 100. 流控使用整数运算

4) 该架构最适合 ALU。浮点表示可以使用 96-128 位。

于 2009-10-09T04:08:56.663 回答
0

浮点运算是某些计算问题的限制因素。如果您的问题不是其中之一,您可以放心地忽略翻牌评级。

英特尔架构从简单的 80 位浮点指令开始,可以通过舍入加载或存储到 64 位内存位置。后来他们添加了SSE指令,它使用 128 位寄存器,并且可以用一条指令执行多个浮点运算。

于 2009-10-09T04:13:28.223 回答
0
  1. 浮点速度对于科学计算和计算机图形学非常重要。
  2. 根据定义,没有。此时您正在测试整数性能。
  3. 302,见下文。
  4. x86 和 x64 与 MIPS 非常不同。MIPS 是一种 RISC(精简指令集计算机)架构,与 Intel 和 AMD 产品的 CISC(复杂指令集计算机)架构相比,指令很少。对于指令解码,x86 使用可变宽度指令,因此指令长度为 1 到 16 个字节(包括前缀,可能更大)

128 位的东西是关于处理器中浮点数的内部表示。它在内部使用真正的位浮点数来尝试避免舍入错误,然后在您将数字放回内存时截断它们。

fld  A      //st=[A]
fld  B      //st=[B, A]
Loop:
fld st(1)   //st=[A, B, A]
fadd st(1)  //st=[A + B, B, A]
fstp memory //st=[B, A]
于 2009-10-09T04:14:46.117 回答
0

糟糕,简化的 MIPS。通常,这对于入门课程很好。我要假设一本轩尼诗/帕特森的书?

阅读 Intel 方法的 Pentium 架构 (586) 的 MMX 指令。或者,更一般地,研究 SIMD 架构,也称为向量处理器架构。它们最初是由 Cray 超级计算机普及的(尽管我认为有一些先行者)。对于现代 SIMD 方法,请参阅 NVIDIA 生产的 CUDA 方法或市场上的不同 DSP 处理器。

于 2009-10-09T04:17:07.240 回答