seb*_*ebf 1 performance gpgpu opencl
在这个OpenCL参考表(断开链接)的第3页,有两个内置的向量长度函数,它们具有相同的参数:length()和half_length().
这些功能有什么区别?我从名字中得到一个比另一个更快但在什么情况下?对于这种速度增加,它是否具有准确性?如果不是,为什么一个曾经使用length()过fast_length()?
根据OpenCL规范(版本1.1,第215页):
float length(floatn p):返回向量的长度p,即sqrt(p.x²+p.y²+...)
float fast_length(floatn p):返回p计算为的向量的长度half_sqrt(p.x²+p.y²+...)
所以fast_length使用时half_sqrt,length使用sqrt.您可以猜测,sqrt它可以更好地保证准确性,但可能会更慢.更重要的是:
sqrt:3ulp(精度最低的单位)half_sqrt最低准确度:8192ulp
因此,half_sqrt可以将大约sqrt11位精确度降低(实际上它可以精确到13位,因为没有要求sqrt不要更好,然后严格必要).由于float尾数为23bit(加一个隐含位),因此half_sqrt仅承诺大约10位精度(11位包括隐式1).但是,如果硬件具有这样的功能,它可能会更快.在硬件中,使用sqrt或rsqrt指令仅提供少量位(如10-14)并在指令之后使用Newton-Raphson迭代来获得必要的精度并不罕见.在这种情况下使用half_sqrt显然更快.