FLOPS真正的FLOP

我来自这个主题: FLOPS英特尔核心并用C(内部产品)测试它

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

  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位等。因此对于intel架构(特别是前一个线程的相同架构),我被告知寄存器可以保持128位。 对于SINGLE PRECISION浮点,每个浮点数为32位,这对于馈送到处理器的每条指令是否意味着,它可能需要4个浮点数? 我们还不必考虑操作数和指令其他部分涉及的位吗? 我们怎样才能将4个浮点数提供给cpu而没有任何特定含义呢?

我不知道我的方法是否有点理解。 如果没有,我应该关注什么“高度”的视角?

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位值进行操作,这与指令的大小无关。 不幸的是,由于它是一个CISC架构,x86没有与MIPS类似的指令细分。 x86指令可以包含1到16(!)个字节之间的任何值。

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

  1. 浮点和整数运算在芯片上使用不同的流水线,因此它们以不同的速度运行(在简单/足够的架构上,可能根本没有本机浮点支持,使得浮点运算非常慢)。 因此,如果您尝试使用浮点数学来估计实际性能,则需要知道这些操作的速度有多快。

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

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

  4. 矢量化或SIMD(单指令多数据)可以做到这一点。 目前使用的SIMD系统示例包括AltiVec(在PowerPC系列芯片上)和在Intel x86上兼容的MMX / SSE / …. 芯片的这种改进应该因为做更多的工作而受到赞誉,所以即使只有25个获取和工作周期,你上面的微不足道的循环仍然算作100次操作。 编译器需要非常智能,或者从程序员那里获得提示以使用SIMD单元(但是现在大多数前端编译器非常聪明)。

每秒浮点运算。

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

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

这个术语显然不是一个精确的测量,因为很明显双精度浮点运算需要比单精度浮点运算更长的时间,并且乘法和除法比加法和减法需要更长的时间。 正如维基百科的文章certificate的那样,最终有更好的方法来衡量绩效。

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

2)FLOPS用于浮点运算。

3)100。流控制使用整数运算

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

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

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

哎呀,简化的MIPS。 通常,这对于入门课程来说很好。 我要承担一本hennesy / patterson书?

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

  1. 浮点速度对于科学计算和计算机图形学而言非常重要。
  2. 根据定义,没有。 您正在测试整数性能。
  3. 302,见下文。
  4. x86和x64与MIPS非常不同。 MIPS是一种RISC(精简指令集计算机)架构,与英特尔和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] 
  1. 浮点数学有很多东西比整数数学要好得多。 大多数大学计算机科学课程都有一门名为“数值分析”的课程。

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

  3. 这将是100个浮点数增加。 (也就是说,除非编译器意识到结果没有做任何事情并且优化了整个事情。)

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

除了使用其他提到的答案之外,人们称之为“量子”的人现在使用浮点数学来进行融资。 一个名叫David E. Shaw的家伙于1988年开始将浮点数学运用于华尔街建模,截至2009年9月30日,价值25亿美元,在福布斯400位富豪榜上排名第123位。

所以值得学习浮点数学!

1)浮点很重要,因为有时我们想要表示非常大或非常小的数字,而整数并不是那么好。 阅读IEEE-754标准,但尾数就像整数部分,我们交换一些位作为指数,这样就可以表示更大范围的数字。

2)如果两个向量是整数,则不会测量FLOPS。 如果一个向量是int而另一个是float,那么你将进行大量的int-> float转换,我们应该认为这样的转换是FLOP。

3/4)英特尔架构上的浮点运算非常具有异国情调。 它实际上是一个基于堆栈的单操作数指令集(通常)。 例如,在您的示例中,您将使用一条带有操作码的指令,该操作码将内存操作数加载到FPU堆栈的顶部,然后您将使用带有操作码的另一条指令,该操作码将内存操作数添加到FPU堆栈的顶部,最后是另一条带有操作码的指令,该操作码将FPU堆栈的顶部弹出到内存操作数。

这个网站列出了很多操作。

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

我确定英特尔会在某处发布实际的操作码,如果你真的那么感兴趣的话。