请注意,64位和32位浮点运算之间的比率在不同的硬件上是不同的。例如,最近NVidia提高了64位性能,而32位性能保持不变。这让我好奇:给定足够宽的数据路径,当位数翻倍时,哪些因素决定了浮点运算必须达到多少?
出于这个问题的目的,假设当位数翻倍时,可以显著增加数据路径的宽度。不是无限的(否则理论上任何算术函数都可以使用查找表),而是足够宽,可以在独立位上并行执行算术运算。考虑到这一点,单词大小翻倍会减慢算术运算的速度,*,/?那么,诸如log、exp、sin、atan之类的内置基本函数呢?
编辑:
让我更清楚地解释一下我在这里要问什么。
首先,我们知道,如果理论上一个人有无限的电路/面积,那么他可以对O(log N)中的N位输入计算任何数学运算。只需创建一个大小为2^N(对于sin(x)等1操作数函数)或2^N(2*N)(对于2操作数函数)的大型哈希表,并使用输入作为哈希键查找所需的值。不用说,这是完全不切实际的,我对这样的答案不感兴趣。然而,这表明,在给定数据路径的任意宽度的情况下,理论上无法证明任何操作都需要超过O(log N)的时间。
其次,我们也知道,即使是相对简单的运算,例如加法器,ω(log N)也是一个下限。这与输出位之间的依赖深度有关,因此与电路的深度有关。
真正的问题是:给定电路大小的合理界限(例如,不超过多项式(N)门),实现算术和初等函数运算的最佳电路的延迟的渐近行为是什么?
已知加法器的答案是O(log N),由进位前瞻加法器实现。我不知道乘法的答案,但怀疑也可以将其实现为O(log N)电路,因为乘法归结为常量时间布尔值,然后添加多个操作数,将进位前瞻扩展到多操作数加法器似乎并不太难。
我不知道除法和平方根的渐近值是多少。
我还对常见的初等函数感到好奇,如log、exp、sin等。
逻辑复杂性的增加会影响电路延迟,这有两个方面。一个是对管道级的影响,其中一个或多个组合延迟将是限制最小时钟周期的“关键路径”。几乎可以任意地(尽管工作量不同),您可以采用复杂的电路并在任意数量的阶段中对其进行管道化。更多的阶段会更多地分割逻辑,增加周期中的延迟,但也会减少最小时钟周期,从而提高吞吐量。请注意,随着阶段的增加,您会遇到递减的回报,因为管道寄存器的开销是恒定的。此外,更多的流水线阶段意味着相关指令必须等待更长的时间才能获得输入,尽管这不会因为高线程并行性而对GPU造成太大影响。
为了解决这个问题,我要提到增加电路面积总是会间接影响性能。更大的电路意味着更复杂的布局和路由,这意味着组合延迟不会随着逻辑门的数量线性扩展。我们暂时忽略它。
在某些情况下,将数据路径宽度加倍不会对组合延迟产生任何影响。例如,如果您有一个按位AND操作,则每个位都是独立计算的。因此,抽象地说,将数据路径宽度加倍不会影响周期时间。
现在,你问的是浮点,但是浮点管道将由整数块组成,这些块可以做加法(和减法)、乘法和移位。我在这里是基于内存的,所以有人可能需要纠正我,但是这里。
进位先行加法或子单元通常会随着位数的增加而对数增加,因此将数据路径宽度加倍(同样,忽略放置和路由的影响)只会增加一点点延迟。
IIRC,桶形移位器与add/sub具有相同的增长率。
乘法器将随宽度线性增加,因为它或多或少是一个全加器的2D数组,但可以进行一些优化。因此,如果您将数据路径宽度加倍,我认为您将使电路延迟加倍。因此,在这种情况下,您可能希望将乘数分为两个阶段。
问题内容: 我想在两次通话之间延迟5秒…我该如何在jQuery中执行此操作…似乎jQuery对此不起作用… 问题答案: 您可以使用普通的javascript,这将在5秒后调用一次your_func: 如果您的函数没有参数且没有显式接收器,则可以直接调用我曾经用过一个插件。它具有和方法。
本文向大家介绍一定延迟后如何调用jQuery函数?,包括了一定延迟后如何调用jQuery函数?的使用技巧和注意事项,需要的朋友参考一下 要在一定延迟后调用jQuery函数,请使用方法。在这里,几秒钟后调用jQuery函数。 您可以尝试运行以下代码,以了解如何使用jQuery中的方法在延迟后调用jQuery函数- 示例
问题内容: 有一种方法可以配置javascript方法以立即执行该方法,然后使用计时器执行 问题答案: 第一次直接直接调用函数是最简单的: 但是,有充分的理由要避免-尤其是在某些情况下,整个事件负荷可以彼此紧接着立即到达而没有任何延迟。另一个原因是,如果要停止循环,则必须显式调用,这意味着必须记住原始调用返回的句柄。 因此,另一种方法是使用以下方法触发自己的后续调用: 这样可以确保两次调用之间 至
如标题所示,在中,是否有方法在延迟(例如1秒)后调用函数?
AWK具有以下内置位操作功能 - and 执行按位AND操作。 例子 (Example) [jerry]$ awk 'BEGIN { num1 = 10 num2 = 6 printf "(%d AND %d) = %d\n", num1, num2, and(num1, num2) }' 执行此代码时,您将获得以下结果 - 输出 (Output) (10 AND 6) = 2
我想在一个HTML页面上做一个值,每5秒更新一次,这样就不会让服务器不堪重负。结果表明,我的函数中的setTimeout()没有适当延迟,而是立即被调用。有人能帮我找个线索吗?我真的不想给我的服务器太多的工作,因为我必须实现更多的Ajax。 代码如下: