我来自这个帖子:FLOPS Intel core and testing it with C (innerproduct)
当我开始编写简单的测试脚本时,我想到了一些问题。
为什么浮点?我们必须考虑的浮点数有多重要?为什么不是一个简单的int?
如果我想测量FLOPS,那就说我正在做两个向量的内积。这两个向量必须是float []吗?如果我使用int [],测量结果会有什么不同?
我不熟悉英特尔架构。假设我有以下操作:
float a = 3.14159; float b = 3.14158;
for(int i = 0; i < 100; ++i) {
a + b;
}
这有多少“浮点运算”?
我有点困惑,因为我研究了简化的32位MIPS架构。对于每个指令,有32位,如操作数1为5位,操作数2为5位等。因此对于intel架构(特别是前一个线程中的相同架构),我被告知寄存器可以保持128位。对于SINGLE PRECISION浮点,每个浮点数为32位,这对于每个指令送到处理器是否意味着它可能需要4个 浮点数字?我们还不必考虑操作数和指令其他部分涉及的位吗?我们怎样才能将4个浮点数提供给cpu而没有任何特定含义呢?
我不知道我的方法是否有点理解。如果没有,我应该关注什么“高度”的视角?
答案 0 :(得分: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位值进行操作,这与指令的大小无关。不幸的是,由于它是一个CISC架构,x86没有与MIPS类似的指令细分。 x86指令可以有1到16(!)字节之间的任何位置。
关于你的问题,我认为这是非常有趣的事情,它可以帮助你建立关于数学密集型程序的速度的直觉,并让你了解优化时要达到的上限。我永远不会尝试直接将其与程序的实际运行时间相关联,因为太多其他因素会影响实际的最终性能。
答案 1 :(得分:3)
浮点和整数运算在芯片上使用不同的管道,因此它们以不同的速度运行(在简单/足够的架构上,可能根本没有本机浮点支持,使得浮点运算非常慢)。因此,如果您尝试使用浮点数学来估计问题的实际性能,则需要知道这些操作的速度有多快。
是的,您必须使用浮点数据。见#1。
FLOP通常被定义为特定操作混合的平均值,旨在表示您想要建模的现实世界问题。对于循环,您只需将每个加法计为1个操作,总共进行100次操作。 但是:这不代表大多数现实世界的作业和您可能需要采取措施阻止编译器优化所有工作。
矢量化或SIMD(单指令多数据)可以做到这一点。目前使用的SIMD系统示例包括AltiVec(在PowerPC系列芯片上)和在Intel x86上兼容的MMX / SSE / ....芯片的这种改进应该因为做更多的工作而受到赞誉,所以即使只有25个获取和工作周期,你上面的微不足道的循环仍然算作100次操作。编译器需要非常智能,或者从程序员那里获得使用SIMD单元的提示(但是现在大多数前端编译器非常聪明)。
答案 2 :(得分:1)
每秒浮点运算。
http://www.webopedia.com/TERM/F/FLOPS.html
您的示例是100个浮点运算(将两个浮点数加在一起是一个浮点运算)。分配浮点数可能会也可能不会计算。
该术语显然不是一个精确的测量,因为很明显双精度浮点运算需要比单精度浮点运算更长的时间,并且乘法和除法比加法和减法需要更长的时间。正如Wikipedia文章所证明的那样,最终有更好的方法来衡量绩效。
答案 3 :(得分:0)
1)因为许多真实世界的应用程序都运行了很多浮点数,例如所有基于矢量的应用程序(游戏,CAD等)几乎完全依赖于浮点运算。
2)FLOPS用于浮点运算。
3)100。流量控制使用整数运算
4)该架构最适合ALU。浮点表示可以使用96-128位。
答案 4 :(得分:0)
浮点运算是某些计算问题的限制因素。如果你的问题不是其中之一,你可以放心地忽略翻牌圈。
英特尔架构从简单的80位浮点指令开始,可以加载或存储到具有舍入的64位存储器位置。后来他们添加了SSE指令,这些指令使用128位寄存器,可以用一条指令执行多个浮点运算。
答案 5 :(得分:0)
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]
答案 6 :(得分:0)
Yuck,简化MIPS。通常,这对于入门课程来说很好。我会假设一本hennesy / patterson书?
阅读针对Intel方法的Pentium架构(586)的MMX指令。或者,更一般地,研究SIMD架构,也称为矢量处理器架构。它们最初由Cray超级计算机推广(尽管我认为有一些先行者)。对于现代SIMD方法,请参阅NVIDIA生产的CUDA方法或市场上的不同DSP处理器。
答案 7 :(得分:0)
浮点数学有很多东西比整数数学要好得多。大多数大学计算机科学课程都有一门名为“数值分析”的课程。
向量元素必须是float,double或long double。内部产品计算将比元素为整数时慢。
这将是100个浮点数增加。 (也就是说,除非编译器意识到结果没有做任何事情并且优化了整个事情。)
计算机使用各种内部格式来表示浮点数。在你提到的例子中,CPU会在对数字进行操作之前将32位浮点数转换为内部的128位格式。
除了使用其他提到的答案之外,人们称之为“量子”的人现在使用浮点数学进行融资。一个名叫David E. Shaw的家伙于1988年开始将浮点数学应用于华尔街建模,截至2009年9月30日,价值25亿美元,在福布斯400位富豪榜上排名第123位。
所以值得学习浮点数学!
答案 8 :(得分:0)
1)浮点很重要,因为有时我们想要表示非常大或非常小的数字,而整数并不是那么好。阅读IEEE-754标准,但尾数就像整数部分,我们交换一些位作为指数,这样就可以表示更广泛的数字范围。
2)如果两个向量是整数,则不会测量FLOPS。如果一个向量是int而另一个是float,那么你将进行大量的int-&gt; float转换,我们应该认为这样的转换是FLOP。
3/4)英特尔架构上的浮点运算非常具有异国情调。它实际上是一个基于堆栈的单操作数指令集(通常)。例如,在您的示例中,您将使用带有操作码的一条指令将内存操作数加载到FPU堆栈的顶部,然后您将使用另一条带有操作码的指令,该操作码将内存操作数添加到FPU堆栈的顶部,最后是另一条带有操作码的指令,该操作码将FPU堆栈的顶部弹出到内存操作数。
这个网站列出了很多操作。
http://www.website.masmforum.com/tutorials/fptute/appen1.htm
我确信英特尔会在某处发布实际的操作码,如果你真的那么感兴趣的话。