库功能的FLOP计数


13

当用一个简单的函数评估FLOP的数量时,通常只需按基本算术运算符就可以了。但是,在涉及偶数除法的数学语句的情况下,不能做到这一点,并且希望能够与仅具有加法和乘法功能的FLOP计数进行比较。当在库中执行该操作时,情况甚至更糟。因此,必须对特殊功能的性能有一些合理的认识。

通过特殊功能,我们的意思是:

  • exp()
  • sqrt()
  • sin / cos / tan()

通常由系统库提供。

确定它们的复杂性的进一步困惑在于,它们中的许多是自适应的并且具有依赖于输入的复杂性。例如,exp()的数字稳定实现通常会自适应地重新缩放并使用查找。我最初的印象是,在这种情况下最好的方法是确定函数的平均行为。

当然,整个讨论高度依赖于体系结构。在此讨论中,我们可以将自己局限于传统的通用体系结构,并排除具有特殊功能单元(GPU等)的那些体系结构。

为了系统与系统之间的比较,人们可以找到相当简单的尝试来针对特定体系结构进行标准化,但是如果人们在乎方法与方法的性能,这是不可接受的。确定这些功能的FLOP复杂度的哪些方法被认为可以接受?有什么大陷阱吗?


彼得,快速评论。尽管您提供了数学库提供的几个好的函数示例,但浮点除法通常是由浮点单元实现的。
阿隆·艾玛迪亚

谢谢!我还不够清楚。我只是进行编辑以提供更好的对比度。
彼得·布鲁恩

我很惊讶地发现sin,cos和sqrt实际上都在x86指令的x87浮点子集中实现了。我想我明白你的意思,但我认为公认的做法是将它们视为具有稍大常数的浮点运算:)
Aron Ahmadia 2012年

@AronAhmadia十多年来没有理由使用x87。除法和sqrt()在SSE / AVX中进行,但它们花费的时间比加法和多重化长得多。而且,它们在Sandy Bridge AVX上的矢量化效果很差,所需时间是SSE指令的两倍(宽度的一半)。例如,双精度AVX(4倍宽)可以在每个周期(假设没有依赖性或内存停顿)进行一次压缩乘法和压缩加法,每个周期8次触发器。除法需要20到44个周期才能完成“ 4触发器”。
杰德·布朗

sqrt()在PowerPC上是可选的。该架构的许多嵌入式芯片均未实现该指令,例如Freescale MPC5xxx系列。
Damien 2014年

Answers:


10

听起来您似乎想要一种方法来评估代码与FPU绑定的程度,或者您使用FPU的效率如何,而不是根据“触发器”的过时定义来计算触发器的数量。换句话说,如果每个浮点单元每个周期都以最大容量运行,则您希望指标达到相同的峰值。让我们看一看英特尔Sandy Bridge,看看这可能会如何解决。

硬件支持的浮点运算

该芯片支持AVX指令,因此寄存器的长度为32个字节(保持4个双精度)。超标量体系结构允许指令重叠,大多数算术指令需要几个周期才能完成,即使一条新指令可能能够在下一个周期开始。这些语义通常通过写等待时间/逆吞吐量来缩写,值5/2表示该指令需要5个周期才能完成,但是您可以每隔一个周期开始一条新指令(假设操作数可用,因此没有数据)依赖性,而不是等待内存)。

每个内核有三个浮点运算单元,但是第三个与我们的讨论无关,我们将相关的两个称为A和M单元,因为它们的主要功能是加法和乘法。示例说明(请参阅Agner Fog的表

  • vaddpd:打包加法,占用单元A 1个周期,延迟/逆吞吐量为3/1
  • vmulpd:压缩乘法,单位M,5/1
  • vmaxpd:打包选择成对最大值,单位A,3/1
  • vdivpd:填充分隔,单位M(和一些A),取决于输入21/20至45/44
  • vsqrtpd:压缩平方根,一些A和M,取决于输入21/21至43/43
  • vrsqrtps:用于单精度输入的压缩低精度倒数平方根(8 floats

什么可以重叠的精确语义vdivpdvsqrtpd显然是微妙的,据我所知,没有任何相关文档。在大多数使用中,我认为重叠的可能性很小,尽管手册中的措辞表明该指令中多个线程可能提供重叠的更多可能性。如果我们在每个周期开始执行vaddpd,则可以达到峰值触发器vmulpd,每个周期总共8次触发器。密集矩阵-矩阵乘法(dgemm)可以合理地接近此峰值。

在对触发器进行特殊说明时,我会看一下FPU占用了多少。假设在您的输入范围内,vdivpd平均需要24个周期才能完成,完全占用了单元M,但是(如果有)加法可以同时执行一半周期。FPU能够在这些周期(完全交错vaddpdvmulpd)中执行24个压缩乘法和24个压缩加法,但是对于a vdivpd,我们能做的最好的是12个额外的压缩加法。如果我们假设进行除法的最佳方法是使用硬件(合理的),则可以将vdivpd“ 36个装箱的”触发器” 算为数字,这表示我们应将每个标量除法算作“ 36个触发器”。

使用平方根的倒数,有时可以击败硬件,尤其是在不需要完全精度或输入范围狭窄的情况下。如上所述,该vrsqrtps指令非常便宜,因此(如果采用单精度)可以先执行一次,vrsqrtps然后进行一到两次牛顿迭代来清理。这些牛顿迭代只是

y *= (3 - x*y*y)*0.5;

如果需要执行这些操作中的许多操作,则这可能会比单纯评估快得多y = 1/sqrt(x)。在提供硬件近似的平方根倒数之前,一些对性能敏感的代码使用臭名昭著的整数运算来查找牛顿迭代的初始猜测。

图书馆提供的数学函数

我们可以将类似的启发式方法应用于库提供的数学函数。您可以通过分析来确定SSE指令的数量,但是,正如我们已经讨论的那样,这还不是全部内容,并且一个花费所有时间来评估特殊功能的程序可能看起来不会接近高峰,这可能是对的,但事实并非如此。告诉您所有时间都花在FPU的控制上,这没什么用。

我建议使用良好的矢量数学库作为基准(例如Intel的VML,属于MKL)。测量每个呼叫的周期数,然后乘以该周期数上可达到的峰值触发器。因此,如果压缩指数需要50个周期来评估,则将其计数为100触发器乘以寄存器宽度。不幸的是,矢量数学库有时很难调用并且没有所有特殊功能,因此您可能最终要进行标量数学,在这种情况下,您会将我们假设的标量指数算作100 flops(即使可能仍需要50 flops)周期,因此,如果所有时间都花在评估这些指数上,您将只获得25%的“峰值”。

正如其他人提到的那样,您可以使用PAPI或各种接口来计数周期和硬件事件计数器。对于简单的周期计数,您可以使用rdtsc带有内联汇编代码段的指令直接读取周期计数器。


7

您可以使用PAPI在真实系统上对它们进行计数,该API授予对硬件计数器和简单测试程序的访问权限。我最喜欢的PAPI接口/包装器是IPM(集成性能监视器),但是还存在其他解决方案(例如TAU)。这样应该可以对方法进行比较稳定的比较。


4

我将回答这个问题,就像您问的那样:

“如何分析地比较或预测高度依赖特殊函数的算法的性能,而不是数值线性代数的传统乘加FLOP计数”

我同意您的第一个前提,即许多特殊功能的性能取决于体系结构,并且尽管您通常可以将这些功能中的每一个视为具有恒定成本,但是该常数的大小也会有所不同,即使两个相同的处理器之间也是如此。公司,但具有不同的体系结构(请参阅Agner Fog的指令时间表以供参考)。

但是,我不同意比较的重点应该放在各个浮点运算的成本上。我认为对FLOP进行计数在某种程度上还是有用的,但是在比较两个可能的算法时,还有一些更重要的考虑因素可能会使特殊功能的成本不太相关,因此在进行比较之前应先明确检查这些因素。浮点运算:

  1. 可伸缩性-具有可在并行体系结构上有效实现的任务的算法,在可预见的未来将占据科学计算领域的主导地位。具有更好“可扩展性”的算法(通过较低的通信量,较少的同步需求或更好的自然负载平衡)可能会使用更慢的特殊功能,因此对于少量进程来说会更慢,但最终会赶上数量的处理器数量增加。

  2. 参考的时间局部性-算法是否在任务之间重用数据,从而使处理器避免不必要的内存通信?算法遍历的内存层次结构的每个级别(大约)为每个内存访问增加了另一个数量级的成本。结果,在较大的内存区域中,具有特殊运算密度的算法可能会比具有相同数量的简单函数运算的算法快得多。

  3. 内存占用量-与先前的观点有很强的联系,但是随着计算机越来越大,每个内核的内存量实际上正在下降。较小的内存占用量有两个好处。首先是少量程序数据将可能完全适合处理器缓存。第二个问题是,对于非常大的问题,具有较小内存占用空间的算法可能能够适合处理器内存,从而可以解决原本会超出计算机能力的问题。


我会声称知道FLOPS / sec可以让您很好地区分出哪个瓶颈机制(内存,通信)。例如,考虑牛顿-克里洛夫(Newton-Krylov)方法,该方法花费大量时间进行矩阵运算。Matvecs在每个矩阵条目中执行一两个FLOP,仅此而已。未组装的平滑器有可能做得更好。Jed和我也一直在谈论这个问题,另一个想法是查看您在FLOP绑定计算中花费了多少个周期。但是,这可能需要非常精细的监视,并且总FLOPS /秒​​可能更实用。
彼得·布鲁恩

阿隆(Aron),大部分答案似乎是在回避彼得的问题,而希望回答另一个问题:scicomp.stackexchange.com/questions/114
杰德·布朗

@JedBrown,我同意,感谢您抽出宝贵的时间来提出更可靠的答案。
阿隆·艾玛迪亚

0

为什么要烦恼翻牌圈?只需计算每个操作的周期,您就会获得一些通用的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.