我一直在寻找相当长一段时间,似乎无法找到一个官方/结论性的数字引用英特尔至强四核可以完成的单精度浮点运算/时钟周期的数量.我有一个Intel Xeon quadcore E5530 CPU.
我希望用它来计算我的CPU可以达到的最大理论FLOP/s.
MAX FLOPS =(#内核数)*(时钟频率(周期/秒))*(#FLOPS /周期)
任何指向我正确方向的东西都会有用.我已经发现每个循环的这个 FLOPS用于沙桥和haswell SSE2/AVX/AVX2
英特尔酷睿2和Nehalem:
4 DP FLOP /周期:2宽SSE2加+ 2宽SSE2乘法
8 SP FLOP /周期:4宽SSE加法+ 4宽SSE乘法
但我不确定这些数据在哪里被发现.他们是假设融合乘法加法(FMAD)操作吗?
编辑:使用它,在DP中我计算出英特尔引用的正确DP算术吞吐量为38.4 GFLOP/s(此处引用).对于SP,我得到双倍,76.8 GFLOP/s.我很确定4 DP FLOP /周期和8 SP FLOP /周期是正确的,我只想确认他们如何获得4和8的FLOP /周期值.
所以我们一直负责编译一些代码(我们应该把它当作黑盒子),使用不同的intel编译器优化标志(-O1和-O3)以及矢量化标志(-xhost和 - no-vec)并观察以下变化:
在执行这些优化之后,我们注意到执行时间的下降,这是预期的,考虑到编译器为了提高效率而对代码所做的所有更改.然而,我们也注意到FPO数量的下降,虽然我们知道这是一件好事,但我们不确定它为什么会发生.此外,我们注意到(并且无法解释)L2缓存未命中率的增加(随着优化级别的增加而增加),但缓存访问没有显着增加,并且L3级别几乎没有变化.
完全不使用矢量化或优化就L2缓存丢失率产生了最好的结果,我们想知道你们是否可以给我们一些见解,以及我们可以用来加深知识的支持文档,文献和资源关于这个话题.
谢谢.
编辑:使用的编译器选项是:
更新:
虽然整体L2缓存访问量略有下降,但实际未命中率却大幅增加.
使用-0O -no-vec
使用中的挂钟时间:13,957,075
使用-xhost
挂钟时间在usecs:4,465,243
数学库经常基于FLOPS进行比较.当我向几个不同的数学库展示FLOPS与大小的点集时,向我传达了什么信息?
如果比较是在同一算法的两个实现之间或两个不同硬件上的相同软件之间进行比较,那么作为性能度量的FLOPS会更有意义.我不明白为什么它是比较像矩阵矩阵乘法这样的东西的合适或流行的方法.
暗示只是底层算法几乎相同,并且通过最小化开销获胜来最快地为浮点单元提供信息的代码?
例子比比皆是.
http://eigen.tuxfamily.org/index.php?title=Benchmark
https://code.google.com/p/blaze-lib/wiki/Benchmarks
另一方面,这些LAPACK和Armadillo基准测试使用绝对时间进行给定操作,这对我来说更有意义.
http://www.netlib.org/lapack/lug/node71.html
http://arma.sourceforge.net/speed.html
相关:
我想用'perf'来测量一些应用程序执行的浮点和算术运算的数量,这是linux性能计数器子系统的新命令行界面命令。(出于测试目的,我使用我创建的一个简单的虚拟应用程序,见下文)。
因为我找不到为测量 FP 和整数运算定义的任何“perf”事件,我开始挖掘原始硬件事件代码(与 -rNNN 一起使用,其中 NNN 是事件代码的十六进制值)。所以我真正的问题是,我为退休指令 (INST_RETIRED) 找到的代码没有区分 FP 和其他指令(X87 和 MMX/SSE)。当我尝试对特定代码使用适当的 umask 时,我发现“perf”不知何故不理解或不支持 umask 包含。我试过:
% perf stat -e rC0 ./a.out
Run Code Online (Sandbox Code Playgroud)
这给了我退休的指示,但是
% perf stat -e rC002 ./a.out
Run Code Online (Sandbox Code Playgroud)
这应该给我执行的 X87 指令说我提供了错误的参数。也许是这样,但是将原始硬件事件的 umask 与“perf”一起使用的正确方法是什么?一般来说,获得使用 perf 工具执行的程序的确切浮点数和整数运算次数的方法是什么?
非常感谢,康斯坦丁·博亚诺夫
这是我的测试应用程序:
int main(void){
float numbers[1000];
float res1;
double doubles[1000];
double res2;
int i,j=3,k=42;
for(i=0;i<1000;i++){
numbers[i] = (i+k)*j;
doubles[i] = (i+j)*k;
res1 = numbers[i]/(float)k;
res2 = doubles[i]/(float)j;
}
}
Run Code Online (Sandbox Code Playgroud) 这真的花了我的时间.我找不到一种简单的方法来估计下面代码(循环)的FLOPS,循环的单次迭代有多少FLOPS:
float func(float * atominfo, float energygridItem, int xindex, int yindex)
{
...
for (atomid=0; atomid<numatoms*4; atomid+=4)
{
float dy = coory - atominfo[atomid+2];
float dysqpdzsq = (dy * dy) + atominfo[atomid+3];
float dx1 = coorx1 - atominfo[atomid+1];
float s, y, t;
s = atominfo[atomid] * (1.0f / sqrtf(dx1*dx1 + dysqpdzsq));
y = s - energycomp1;
t = energyvalx1 + y;
energycomp1 = (t - energyvalx1) - y;
energyvalx1 = t;
}
...
}
Run Code Online (Sandbox Code Playgroud)
它看起来很简单,但我对之前给出的其他一些数字感到困惑,所以如果有人能给出一个确切的数字会很棒.
谢谢.
我一直试图在我实现了Python分布式处理程序的所有计算机上获得FLOPS的标准化估计.虽然我目前可以非常精确地计算出砂岩,但是我并不完全确定它们的真实性.
因此,我需要一种方法来计算(或已经完成它的模块)各种机器上的FLOPS,这些机器可能有各种各样的CPU等.看起来Python是一种解释型语言,只需计算它所需的时间一定数量的操作将不会在Linpack的级别上执行.虽然我并不特别需要与基准测试中的一个大"名称"具有完全相同的估计值,但我希望它至少相当接近.
那么,是否有一种方法或预先存在的模块可以让我获得FLOPS?否则,我唯一的选择是编译成Cython,或尝试根据CPU时钟速度估算功能......
这个问题适用于Haswell上带有XMM/YMM寄存器的压缩单预备浮点运算.
因此,根据Agner Fog 提供的令人敬畏的,令人敬畏的 表,我知道MUL可以在端口p0和p1上完成(recp thruput为0.5),而只有ADD只在端口p1上完成(recp thruput为1) ).我可以除了这个限制,但我也知道FMA可以在端口p0或p1上完成(recp吞吐量为0.5).因此,当我的FMA可以使用p0或p1并同时执行ADD和MUL时,为什么普通ADD仅限于p1是令人困惑的.我误解了桌子吗?或者有人可以解释为什么会这样?
也就是说,如果我的读数是正确的,为什么英特尔不会仅使用FMA op作为普通MUL和普通ADD的基础,从而增加ADD和MUL的吞吐量.或者,什么会阻止我使用两个同时独立的FMA操作来模拟两个同时独立的ADD操作?做ADD-by-FMA有哪些处罚?显然,使用的寄存器数量更多(ADD为2 reg,而FMA为ADD为3 reg),但除此之外?
我想知道如何最大化我可以在CPU上运行的操作数量.我正在做一个简单的矩阵乘法程序,我有一个Skylake处理器.我正在查看维基百科页面上关于这个架构的翻牌信息,我很难理解它.
根据我的理解,FMA指令允许3路FP输入吗?并允许在它们之间的加法和乘法之间进行混合.但是当我只添加两个花车时会发生什么?它只是乘以一个吗?我可以在1个周期中添加3个浮点数,还是会拆分?我看到skylake,有32个FLOP /周期用于单精度输入,但是" 两个8宽FMA指令 " 的含义是什么?
提前感谢您的解释
我发现我的电脑有NVIDIA CUDA技术,我想测量CPU和GPU的处理能力.
我想要更深入地了解它是如何工作的,而不是搜索程序来做到这一点.我需要什么样的代码(C/C++)?