我对使用Sandy-Bridge和Haswell可以完成每个核心每个循环的触发器感到困惑.据我所知,对于SSE,每个核心每个周期应该为4个触发器,对于AVX/AVX2,每个核心每个周期应该有8个触发器.
这似乎在这里得到验证, 如何实现每个周期4个FLOP的理论最大值? ,这里, Sandy-Bridge CPU规范.
然而,下面的链接似乎表明,Sandy-bridge每个核心每个周期可以执行16个触发器,每个核心每个循环使用Haswell 32个触发器 http://www.extremetech.com/computing/136219-intels-haswell-is-an-前所未有-threat-to-nvidia-amd.
谁可以给我解释一下这个?
编辑:我现在明白为什么我感到困惑.我认为术语FLOP仅指单浮点(SP).我现在看到如何在每个循环中实现理论最大值4 FLOP的测试?实际上是双浮点(DP),因此它们为SSE实现4个DP FLOP /周期,为AVX实现8个DP FLOP /周期.在SP上重做这些测试会很有趣.
我被要求测量一个解决多CPU系统微分方程的fortran程序的性能.我的雇主坚持认为我测量FLOP/s(每秒浮动操作)并将结果与基准(LINPACK)进行比较,但我不相信它是要走的路,因为没有人可以向我解释什么是FLOP.
我做了一些关于FLOP究竟是什么的研究,我得到了一些相当矛盾的答案.我得到的最受欢迎的答案之一是'1 FLOP =加法和乘法运算'.真的吗?如果是这样,再次,在物理上,究竟是什么意思?
无论我最终使用哪种方法,它都必须是可扩展的.一些版本的代码解决了具有数百万未知数的系统,并且需要数天才能执行.
在我的案例中,还有哪些其他有效的衡量绩效的方法(我的案例摘要是'fortran代码,它在数百个CPU上反复进行了大量的算术计算)?
十年或两年前,编写数字代码以避免使用乘法和除法并使用加法和减法是值得的.一个很好的例子是使用前向差异来评估多项式曲线,而不是直接计算多项式.
是否仍然如此,或者现代计算机架构已经发展到*,/不再比+慢很多倍, - ?
具体来说,我对在现代典型x86芯片上运行的编译C/C++代码感兴趣,这些代码具有广泛的板载浮点硬件,而不是一个小型微软试图在软件中进行FP.我意识到流水线和其他架构增强功能排除了特定的循环计数,但我仍然希望获得有用的直觉.
什么是深度学习领域的 FLOPS?为什么我们不只使用 FLO 一词?
我们使用术语 FLOPS 来衡量冻结的深度学习网络的操作次数。
按照维基百科,FLOPS = 每秒浮点运算。当我们测试计算单元时,我们应该考虑时间。但是在测量深度学习网络的情况下,我如何理解这个时间概念?我们不应该只使用 FLO(浮点运算)这个术语吗?
为什么人们使用术语 FLOPS?如果有什么我不知道的,那是什么?
====附件===
我提到的冻结深度学习网络只是一种软件。这与硬件无关。在深度学习领域,人们使用术语 FLOPS 来衡量运行网络模型需要多少次操作。在这种情况下,在我看来,我们应该使用 FLO 一词。我认为人们对 FLOPS 一词感到困惑,我想知道其他人是否有同样的想法,或者我是否错了。
请看这些案例:
https://iq.opengenus.org/floating-point-operations-per-second-flops-of-machine-learning-models/
我们必须实现一个ASM程序,用于以坐标方案格式(COOS)和压缩行格式(CSR)乘以稀疏矩阵.现在我们已经实现了所有这些算法,我们想知道它们与通常的矩阵乘法相比有多高效.我们已经实现了代码来测量所有这些算法的运行时间,但现在我们决定我们还想知道我们可以执行的每秒浮点运算数(FLOPS).有关如何测量/计算这个的任何建议吗?
这里有一些关于二手系统的背景信息:
processor : 0
model name : ARMv7 Processor rev 2 (v7l)
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc08
CPU revision : 2
Run Code Online (Sandbox Code Playgroud)
我们现在的第一个想法是实现一种FPO计数器,我们在每次浮点运算(算术运算以及比较和移动运算)之后递增,但这意味着我们必须在我们的代码中插入递增运算,这也会减慢关闭应用程序...有没有人知道是否有某种硬件计数器可以计算浮点运算的数量,或者可能存在某种性能工具,可用于监控我们的程序并测量FPO的数量.任何建议或指示将不胜感激.
下面是使用计数方法评估矩阵乘法的FLOP.我们首先测量了我们感兴趣的每条指令的插入计数器的运行时间,之后我们计算了每秒的浮点运算次数.

最近我一直在对一些CNN进行基准测试,包括时间,乘加操作数(MAC),参数数量和模型大小.我已经看到了一些类似的SO问题(这里和这里),在后者中,他们建议使用Netscope CNN Analyzer.这个工具允许我通过输入我的Caffe网络定义来计算我需要的大部分东西.
然而,我在论文和互联网上看到的一些架构的乘加操作的数量与Netscope输出的不匹配,而其他架构匹配.我总是将FLOP或MAC与netscope中的MACC列进行比较,但是在某些时候我忘记了一个~10倍的因素(查看下表以获取更多细节).
Architecture ---- MAC (paper/internet) ---- macc column in netscope
VGG 16 ~15.5G ~157G
GoogLeNet ~1.55G ~16G
Run Code Online (Sandbox Code Playgroud)
在Netscope中引用GoogLeNet macc编号和VGG16 macc编号.
是否有人使用该工具可以指出我在阅读Netscope输出时我正在做的错误?
我和编程领域的几个人进行了友好的竞争,最近我们对编写高效代码非常感兴趣.我们的挑战是尝试不惜任何代价(可读性,可重用性等)优化代码(在cpu时间和复杂性方面).
问题是,现在我们需要比较我们的代码,看看哪种方法比其他方法更好,但我们不知道任何工具用于此目的.
我的问题是,是否有一些(任何!)工具将一段代码作为输入并计算运行它所需的触发器或CPU指令的数量?有没有工具可以衡量代码的最佳性?
PS目标语言是c ++,但很高兴知道这些工具是否也存在于java中.
假设我有一个伪程序的C程序:
For i=0 to 10
x++
a=2+x*5
next
Run Code Online (Sandbox Code Playgroud)
对于30 FLOPS,这个(1 [x ++] + 1 [x*5] + 1 [2+(x + 5))]*10 [循环]的FLOP数量是多少?我无法理解翻牌是什么.
请注意[...]表示我从中获取"操作"的计数.
flops ×10
cpu ×2
performance ×2
architecture ×1
arm ×1
assembly ×1
avx ×1
benchmarking ×1
c ×1
c++ ×1
caffe ×1
intel ×1
mips ×1
neon ×1
optimization ×1
python ×1
rfid ×1
tensorflow ×1
x86 ×1