C 失败什么是真正的失败
我来自这条线: 当我开始编写简单的测试脚本时,我想到了几个问题C 失败什么是真正的失败,c,flops,C,Flops,我来自这条线: 当我开始编写简单的测试脚本时,我想到了几个问题 为什么是浮点?我们需要考虑的浮点有什么意义?为什么不是一个简单的int 如果我想测量FLOPS,假设我在做两个向量的内积。这两个向量必须是float[]吗?如果使用int[],测量结果会有什么不同 我不熟悉英特尔体系结构。假设我有以下操作: float a = 3.14159; float b = 3.14158; for(int i = 0; i < 100; ++i) { a + b; } float a=3.1
float a = 3.14159; float b = 3.14158;
for(int i = 0; i < 100; ++i) {
a + b;
}
float a=3.14159;浮动b=3.14158;
对于(int i=0;i<100;++i){
a+b;
}
这是多少个“浮点运算”我不知道我把每件事都零零碎碎地考虑的方法是否有意义。如果不是,我应该看多高的透视图?每秒浮点运算 您的示例是100个浮点操作(将两个浮点数相加就是一个浮点操作)。分配浮点数可能算数,也可能不算数 这个术语显然不是一个精确的度量,因为很明显,双精度浮点运算要比单精度浮点运算花费更长的时间,乘法和除法要比加法和减法花费更长的时间。正如本文所证明的,最终有更好的方法来衡量性能。1)因为许多真实世界的应用程序运行时都会处理大量的浮点数,例如,所有基于向量的应用程序(游戏、CAD等)几乎完全依赖于浮点数操作 2) 触发器用于浮点操作 3) 一百。流控件使用整数操作
4) 这种架构最适合ALU。浮点表示可以使用96-128位。浮点运算是某些计算问题的限制因素。如果你的问题不是其中之一,你可以放心地忽略失败评级 英特尔体系结构从简单的80位浮点指令开始,它可以通过舍入加载或存储到64位内存位置。后来他们添加了指令,这些指令使用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]
哎呀,简化的MIPS。一般来说,这对于入门课程来说是很好的。我要假设一本hennesy/patterson的书 阅读奔腾体系结构(586)的MMX指令,了解英特尔方法。或者,更一般地说,研究SIMD体系结构,也称为向量处理器体系结构。它们首先由克雷超级计算机普及(尽管我认为有一些先行者)。有关现代SIMD方法,请参阅NVIDIA或市场上不同DSP处理器生产的CUDA方法。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(!)之间的任意值