请注意,64位和32位浮点运算之间的比率在不同的硬件上是不同的。例如,最近NVidia提高了64位性能,而32位保持不变。这让我很好奇:给定足够宽的数据通路,当你将位数加倍时,有哪些因素可以决定某些浮点运算必须是多少?
出于此问题的目的,假设在将位数加倍时可以显着增加数据路径的宽度。不是无限制的(否则理论上对于任何算术函数都是可能的查找表),但是足够宽以在独立位上并行地执行算术运算。鉴于此,通过什么因素加倍字大小会减慢算术运算+,*,/?那么内置的基本功能如log,exp,sin,atan?
编辑:
让我更清楚地解释一下我在这里问的问题。
首先,众所周知,如果理论上有一个具有无限的电路/区域,则可以在O(log N)中计算对N位输入的任何数学运算。所有人要做的就是创建一个大小为2 ^ N的大型哈希表(对于单操作数函数,如sin(x))或2 ^(2 * N)(对于2操作数函数)并查找所需的值使用输入作为哈希键。不用说这完全是不切实际的,我对这样的答案不感兴趣。然而,这表明理论上无法在给定数据路径的任意宽度的情况下证明任何操作必然需要超过O(log N)的时间。
其次,还知道Omega(log N)是即使是相对简单的操作(例如加法器)的下限。这与输出位之间的依赖性深度有关,因此也与电路的深度有关。
问题实际上是:给定电路大小的合理界限(比如,不超过多项式(N)门),实现算术和基本函数运算的最优电路的延迟的渐近行为是什么?
对于加法器,已知答案是O(log N),通过进位前瞻加法器实现。我不知道乘法的答案,但怀疑可以将它实现为O(log N)电路,因为乘法归结为const时间布尔值,然后添加多个操作数,并将进位超前扩展到多操作数加法器看起来并不太难。
我不知道除法和平方根的渐近是什么。
我也对常见的基本功能感到好奇,例如log,exp,sin等。
答案 0 :(得分:1)
有两个维度,其中增加的逻辑复杂性将影响电路延迟。一个是对管道阶段的影响,其中一个或多个组合延迟将是关键路径"限制最小时钟周期。几乎是任意的(尽管工作量不同),您可以采用复杂的电路并在任何阶段对其进行管道处理。更多阶段将更多地削减逻辑,增加周期中的延迟,但也减少最小时钟周期,这增加了吞吐量。请注意,当您增加阶段时,会遇到递减收益,因为管道寄存器具有不变的开销。此外,更多的流水线阶段意味着相关指令必须等待更长时间才能获得输入,尽管由于高线程并行性而不会对GPU造成太大影响。
为了解决这个问题,我提到增加电路面积会间接影响性能。更大的电路意味着更复杂的布局和布线,这意味着组合延迟不会随着逻辑门的数量线性扩展。我们暂时忽略它。
将某些事物的数据路径宽度加倍不会对组合延迟产生任何影响。例如,如果您有逐位AND运算,则每个位都是独立计算的。因此,在摘要中,将数据路径宽度加倍不会影响您的循环时间。
现在,您要问浮点,但浮点流水线将由整数块组成,这些整数块执行添加(和减法),乘法和移位等操作。我在这里基于记忆去了,所以有人可能需要纠正我,但是这里有。
进位超前加或子单元通常会随着位数的增加而呈对数增加,因此数据路径宽度加倍(再次忽略放置和布线的影响)只会稍微增加延迟。
IIRC,桶形移位器的增长率与add / sub相同。乘数将随宽度线性增加,因为它或多或少是全加器的2D数组,但可以进行一些优化。因此,如果您将数据路径宽度加倍,我认为您将使电路延迟加倍。因此,在这种情况下,您可能希望将乘数分为两个阶段。