我来自这个线程:FLOPS Intel 核心并使用 C 语言对其进行测试(内积) https://stackoverflow.com/questions/1536867/flops-intel-core-and-testing-it-with-c-innerproduct
当我开始编写简单的测试脚本时,我想到了一些问题。
为什么要浮点数?浮点数有什么重要之处值得我们考虑?为什么不是一个简单的 int 呢?
如果我想测量 FLOPS,假设我正在计算两个向量的内积。两个向量必须是 float[] 吗?如果我使用 int[],测量结果会有什么不同?
-
我对Intel架构不熟悉。假设我有以下操作:
float a = 3.14159; float b = 3.14158;
for(int i = 0; i < 100; ++i) {
a + b;
}
这是多少个“浮点运算”?
我有点困惑,因为我研究了简化的 32 位 MIPS 架构。对于每条指令,都有 32 位,例如操作数 1 为 5 位,操作数 2 为 5 位等。因此,对于英特尔架构(特别是与上一个线程相同的架构),我被告知寄存器可以保存 128 位。对于单精度浮点数,每个浮点数 32 位,这是否意味着对于馈送到处理器的每条指令,它可能需要 4
浮点数字?我们是否还必须考虑操作数和指令其他部分中涉及的位?我们怎么能只向CPU提供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 由于是 CISC 架构,因此没有与 MIPS 类似的指令分解。 x86 指令可以具有 1 到 16(!) 字节之间的任何位置。
至于你的问题,我认为这些都是非常有趣的知识,它可以帮助你建立对数学密集型程序速度的直觉,并让你了解优化时要实现的上限。不过,我从来没有尝试将其与程序的实际运行时间直接关联起来,因为太多其他因素会影响实际的最终性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)