问题标签 [flops]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 使用 linux perf 工具测量应用程序的 FLOP
我想测量一些应用程序使用“perf”执行的浮点和算术运算的数量,这是 linux 性能计数器子系统的新命令行接口命令。(出于测试目的,我使用了我创建的一个简单的虚拟应用程序,见下文)。
因为我找不到为测量 FP 和整数运算定义的任何“性能”事件,所以我开始挖掘原始硬件事件代码(与 -rNNN 一起使用,其中 NNN 是事件代码的十六进制值)。所以我真正的问题是,我为退役指令(INST_RETIRED)找到的代码没有区分 FP 和其他指令(X87 和 MMX/SSE)。当我尝试对特定代码使用适当的 umask 时,我发现“perf”不知何故不理解或不支持 umask 包含。我试过:
这给了我退休的指示,但是
这应该给我执行的 X87 指令说我提供了错误的参数。也许是这样,但是将原始硬件事件的 umask 与“perf”一起使用的正确方法是什么?一般来说,获得使用 perf 工具执行的程序的浮点和整数运算的确切数量的方法是什么?
非常感谢,康斯坦丁·博亚诺夫
这是我的测试应用程序:
c++ - 为代码计算翻牌数!
这真的很花时间。我找不到一种简单的方法来估计以下代码(循环)的 FLOPS,循环的单次迭代有多少 FLOPS:
它看起来很简单,但我对前面给出的其他一些数字感到困惑,所以如果有人能给出一个确切的数字,那就太好了。
谢谢。
optimization - 分配给 GPU 中 sqrt 的 FLOPS 以测量性能和全局效率
在 GPU 实现中,我们需要根据 GLOPS 估计其性能。代码非常基本,但我的问题是我应该给操作“sqrt”或“mad”多少 FLOPS,无论是 1 还是更多。
此外,如果 1 表示这些操作的 1 FLOP,我的代码获得 50 GFLOPS,而此 GPU 的理论最大值为 500GFLOPS。如果我用百分比表示,我会得到 10%。在加速方面,我得到了 100 倍。所以我觉得很好,但是10%的收益率好像有点低,你怎么看?
谢谢
c++ - 如何实现每个周期 4 次 FLOP 的理论最大值?
如何在现代 x86-64 Intel CPU 上实现每个周期 4 个浮点运算(双精度)的理论峰值性能?
据我了解,在大多数现代英特尔 CPU 上,完成SSE add
需要三个周期,完成一个周期需要五个周期(例如参见Agner Fog 的“指令表”)。由于流水线,如果算法具有至少三个独立的求和,则每个周期可以获得一个吞吐量。由于打包版本和标量版本都是如此,并且 SSE 寄存器可以包含两个',因此吞吐量可以高达每个周期两个触发器。mul
add
addpd
addsd
double
此外,似乎(尽管我没有看到任何适当的文档)add
' 和mul
' 可以并行执行,理论上每个周期的最大吞吐量为四个触发器。
但是,我无法使用简单的 C/C++ 程序复制该性能。我最好的尝试导致大约 2.7 次失败/周期。如果有人可以贡献一个简单的 C/C++ 或汇编程序来展示最佳性能,那将不胜感激。
我的尝试:
编译:
在 Intel Core i5-750, 2.66 GHz 上产生以下输出:
也就是说,每个周期只有大约 1.4 次触发器。用主循环查看汇编代码
g++ -S -O2 -march=native -masm=intel addmul.cpp
对我来说似乎是最佳选择。
使用打包版本 (addpd
和mulpd
) 更改标量版本将使 flop 计数翻倍,而不会更改执行时间,因此每个周期我会得到 2.8 次 flop。有没有一个简单的例子可以实现每个周期四次翻转?
Mysticial 的小程序不错;这是我的结果(虽然只运行了几秒钟):
gcc -O2 -march=nocona
: 10.66 Gflops 中的 5.6 Gflops (2.1 flops/cycle)cl /O2
, openmp 已删除:10.66 Gflops 中的 10.1 Gflops(3.8 flops/cycle)
这一切似乎有点复杂,但到目前为止我的结论是:
gcc -O2
更改独立浮点运算的顺序,目的是 尽可能交替addpd
和's。mulpd
同样适用于gcc-4.6.2 -O2 -march=core2
。gcc -O2 -march=nocona
似乎保持了 C++ 源代码中定义的浮点运算的顺序。cl /O2
,来自SDK for Windows 7的 64 位编译器 会自动进行循环展开,并且似乎尝试并安排操作,以便三个 ' 的组与三个addpd
' 交替mulpd
(嗯,至少在我的系统和我的简单程序上) .我的Core i5 750(Nehalem 架构)不喜欢交替使用 add 和 mul,而且似乎无法同时运行这两个操作。但是,如果将其分组为 3,它会突然像魔术一样起作用。
如果其他架构(可能是Sandy Bridge和其他架构)在汇编代码中交替执行,它们似乎能够毫无问题地并行执行 add/mul。
虽然很难承认,但在我的系统上,我的系统
cl /O2
在低级优化操作方面做得更好,并且在上面的小 C++ 示例中实现了接近峰值的性能。我在 1.85-2.01 flops/cycle 之间测量(在 Windows 中使用了 clock() 并不那么精确。我想,需要使用更好的计时器 - 感谢 Mackie Messer)。我管理的最好
gcc
方法是手动循环展开并以三人一组的方式安排加法和乘法。我得到g++ -O2 -march=nocona addmul_unroll.cpp
的充其量0.207s, 4.825 Gflops
相当于 1.8 次失败/周期,我现在对此非常满意。
在 C++ 代码中,我将for
循环替换为:
程序集现在看起来像:
c++ - 如何在以下代码中最小化浮点运算
我需要最小化以下代码中的失败总数,任何人都可以快速查看并告诉我在哪里努力?我尝试了几种性能分析仪,但结果无关紧要..
谢谢,赵
c# - 如何测量我的 C# 应用程序使用的 FLOPS?
Microsoft 的并行编程白皮书描述了在各种 FLOPS 阈值下最佳的情况,并且 FLOPS 率是何时应使用特定实现的决策点。
如何在我的应用程序中测量 FLOPS?
cpu - 现代 FPGA 的性能相对于 CPU 和绝对值(GFlops/GIops)有多少?
现代 FPGA 相对于 CPU 的性能是多少,绝对以 (GFlops/GIops) 为单位,FPGA 上每秒 10 亿个整数运算的成本是多少?现在哪些任务有利于使用 FPGA?我只找到它: http: //www.hpcwire.com/hpcwire/2010-11-22/the_expanding_floating-point_performance_gap_between_fpgas_and_microprocessors.html
python - Python FLOPS 计算
我一直试图在我已经实现 Python 分布式处理程序的所有计算机上获得 FLOPS 的标准化估计。虽然我目前可以很好地计算 pystones,但 pystones 并不是特别为人所知,而且我不完全确定它们的准确度。
因此,我需要一种方法来计算(或已经完成它的模块)在各种机器上的 FLOPS,这些机器可能有任何种类的 CPU 等。因为 Python 是一种解释性语言,只需计算它所花费的时间一定数量的操作不会在例如 Linpack 的级别上执行。虽然我并不特别需要与基准测试中的大“名字”之一完全相同的估计,但我希望它至少相当接近。
因此,有没有办法或预先存在的模块让我获得 FLOPS?否则,我唯一的选择是编译成 Cython,或者尝试根据 CPU 时钟速度估计功能......
c++ - 如何比较两段代码的性能
我与编程领域的几个人进行了一场友好的竞争,最近我们对编写高效的代码非常感兴趣。我们的挑战是不惜一切代价(可读性、可重用性等)尝试优化代码(在 CPU 时间和复杂性方面)。
问题是,现在我们需要比较我们的代码,看看哪种方法比其他方法更好,但我们不知道任何用于此目的的工具。
我的问题是,是否有一些(任何!)工具将一段代码作为输入并计算运行它所需的触发器或 cpu 指令的数量?有什么工具可以衡量代码的优化吗?
PS 目标语言是 c++,但很高兴知道这些工具是否也适用于 java。