floating-point - 向量双双浮点运算
问题描述
存在双精度浮点不够充分的工作负载,因此需要四精度。这很少在硬件中提供,因此一种解决方法是使用 double-double,其中 128 位数字由一对 64 位数字表示。这不是真正的 IEEE-754 四倍精度 - 一方面,您不会得到任何额外的指数位 - 但在许多方面都足够接近,并且比纯软件实现要快得多。
许多计算机提供向量浮点运算,最好将它们用于双双运算。这可能吗?特别是,在https://github.com/JuliaMath/DoubleDouble.jl/blob/master/src/DoubleDouble.jl查看双双的实现,在我看来,每个算术运算都需要至少一个条件分支中间,我认为这意味着不能使用 SIMD 矢量运算,除非我遗漏了什么?
解决方案
我认为您正在考虑加法和减法的实现,例如:
# Dekker add2
function +{T}(x::Double{T}, y::Double{T})
r = x.hi + y.hi
s = abs(x.hi) > abs(y.hi) ? (((x.hi - r) + y.hi) + y.lo) + x.lo : (((y.hi - r) + x.hi) + x.lo) + y.lo
Double(r, s)
end
在某些架构上,解决方案可能是使用 SIMD 指令并行计算两个分支,然后执行一个操作来检索两者的正确结果。例如,x.hi + y.hi
从错误的操作数中减去所产生的错误结果可能总是带有负号,因此取最大值可能总是提取正确的结果。(在这个晚上,我不能保证这在这种情况下是有效的,但对于某些操作,一般的方法是。)
另一个可能是比较向量{x.hi, y.hi} > {y.hi, x.hi}
以形成位掩码。(这是伪代码,不是 Julia 语法。)位掩码和潜在结果对的按位与将保持正确结果不变,并将不正确的 1 的所有位设置为零。然后,使用按位或减少掩码向量会产生正确的结果。不需要分支。
给定的 ISA 可能还有其他可行的技巧,例如条件指令。或者还有除 Dekker 之外的其他算法。
推荐阅读
- c# - 部署 VS 2019 500 内部错误时 Web Api 不起作用
- graphql - graphQL: SyntaxError: Unexpected token " 在 JSON 中的位置 0
- python - Python 中更优雅的 arr
- ionic-framework - 如何仅在 Ion 5 网格中的 lg 设备中添加填充
- gitlab - 从多项目管道运行手动作业
- laravel - 在 laravel 8 中创建购物车的最佳方法是什么?
- flutter - 如何使用 audio_service 和 just_audio 在 Flutter 中查找当前歌曲时长
- vue.js - 避免 vue 3 输入组件上的 eslint 错误的最佳方法,它将一个值分成两个
- data-structures - 显示通用树并查找其中节点总数的时间复杂度
- python - 将字典转换为数据框,然后将列融合/堆叠为行