Answers:
作为对moyner答案的扩展,片sqrt
上通常为rsqrt
,即计算的倒数平方根。因此,如果在您的代码中仅使用(如果您正在进行分子动力学),则可以直接进行计算并节省除数。之所以计算而不是计算,是因为其牛顿迭代没有除法,只有加法和乘法。r = rsqrt(r2)
rsqrt
sqrt
另外,除法也是迭代计算的,几乎和rsqrt
硬件一样慢。如果您正在寻找效率,那么最好去除多余的部分。
某些更现代的体系结构(例如IBM的POWER体系结构)rsqrt
本身并不提供此功能,而是提供精确到几位的估算值,例如FRSQRTE。当用户调用时rsqrt
,这将生成一个估计值,然后使用常规的乘法和加法生成牛顿算法或戈德施密特算法的一两次(根据需要而定)迭代。这种方法的优势在于,可以在不阻塞FPU的情况下将迭代步骤进行流水线处理和与其他指令交织(有关此概念的很好概述,尽管在较旧的体系结构上,请参见Rolf Strebel的博士学位论文)。
对于潜在的交互作用,sqrt
可以通过使用潜在函数的多项式插值来完全避免操作,但是我mdcore
在这一领域的工作(在中实现)表明,至少在x86类型的架构上,sqrt
指令足够快。
更新资料
既然这个答案似乎引起了相当多的关注,我也想解决您问题的第二部分,即,尝试改善/消除诸如这样的基本操作真的值得sqrt
吗?
在分子动力学模拟或任何具有截止限制相互作用的基于粒子的模拟的背景下,从用于邻居发现的更好算法中可以获得很多好处。如果您使用“ 单元格”列表或类似的列表来查找邻居或创建Verlet列表,则将计算大量的虚假成对距离。在幼稚的情况下,只有16%的粒子对实际上位于彼此的截止距离之内。尽管没有针对此类对计算任何交互,但是访问粒子数据并计算虚假的成对距离会带来巨大的成本。
我在此区域(此处,此处和此处)以及其他人(例如此处)所做的工作表明如何避免这些虚假计算。这些邻居发现算法,甚至在性能verlet的清单,说明这里。
我想强调的一点是,尽管通过更好地了解/利用底层硬件体系结构可能会有所改进,但是重新思考更高级别的算法也可能会有更大的收获。
平方根是在大多数处理器上的硬件中实现的,也就是说,有特定的汇编指令,并且在大多数语言中,性能应具有可比性,因为很难对实现进行模拟。由于FSQRT指令是由某些智能硬件设计师设计的,因此您可能永远无法击败它。
它在硬件中的实现方式可能有所不同,但可能是某种定点迭代,例如Newton-Raphson方法,该方法进行特定数量的迭代直到计算出所需位数为止。硬件中的迭代方法通常比其他操作慢得多,因为在准备好结果之前必须完成几个周期。
还有一些Streaming SIMD指令可在XMM寄存器上用于此处的快速矢量计算。这些寄存器很小,但是如果您有已知数量的坐标(例如,三维笛卡尔坐标系),它们的速度可能会更快一些。
如果您的语言水平足够低,则可以始终以较低的精度打字或将较低的精度数字用作坐标。单精度通常绰绰有余,并且据我所知,计算平方根时会更快,因为迭代可以更早地终止。
对不同的语言进行基准测试应该很容易:只需将一连串的随机数写入文件,使用不同的语言加载它,然后对平方根进行计时。
可以提高性能,但是首先应该了解一下,计算sqrt的倒数是瓶颈(而不是说加载位置和节省力量)。
GROMACS MD项目源自一个想法,即利用IEEE浮点格式的细节来播种Newton-Raphson迭代方案,以计算平方根倒数的可接受近似值(请参阅http:/的附录B.3)。/www.gromacs.org/Documentation/Manual),但在GROMACS仍采用此思想的情况下,没有使用HPC CPU。
rsqrtps
和AVXvrsqrtps
也是估计值,它们使前11到12位正确无误,如果需要更高的精度,则应使用一两个Newton迭代进行完善。这些是Sandy Bridge上的5/1和7/1(延迟/逆吞吐量)指令(请参阅Intel文档或Agner Fog的指令表,它们可与乘法相比。相反,全精度(v)sqrtps
(或双精度(v)sqrtpd
)需要10-43 / 10-43(有关详细信息,请参见说明表。)