【问题标题】:What is meant by "fixing up" floats?“修复”浮动是什么意思?
【发布时间】:2015-07-24 16:04:04
【问题描述】:

我正在查看 AVX-512 中的指令集,并注意到一组 fixup 指令。一些examples

_mm512_fixupimm_pd, 
_mm512_mask_fixupimm_pd, 
_mm512_maskz_fixupimm_pd

_mm512_fixupimm_round_pd, 
_mm512_mask_fixupimm_round_pd, 
_mm512_maskz_fixupimm_round_pd

这里的“修复”是什么意思?

【问题讨论】:

    标签: simd intrinsics avx512


    【解决方案1】:

    这是一个很好的问题。英特尔的答案(我的粗体字)在这里:

    本说明专门用于修复 涉及一个来源的算术计算的结果,因此它们 匹配规范,尽管它通常对修复 反映特殊数字的多指令序列的结果 输入。例如,考虑 rcp(0)。 输入0到rcp,你应该 根据 DX10 规范获取 INF。但是,通过评估 rcp Newton-Raphson,其中 x=approx(1/0),产生不正确的结果。到 处理这个,可以在 N-R 倒数之后使用 VFIXUPIMPS 序列将结果设置为正确的值(即 INF 当 输入为 0)。

    在以下位置查找 VFIXUPIMMPD:

    https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf

    【讨论】:

    • 比他们的在线文档详细很多,谢谢参考!
    • 如果你问我,这仍然是一本相当垃圾的手册。达不到正常的写作质量。如果我有 CPU 支持 AVX-512,我会试一试,看看实际发生了什么;)
    • @JCx:我认为它所做的伪代码描述已经足够详细(Operation 部分)。您引用的段落只是为您提供了用例,而不是操作细节。摘要:对于每个 src 元素,将其归类为八种“令牌”类型之一。使用该标记在第三个操作数的对应元素中查找一个动作(这是一个由八个 4 位代码组成的表)。该操作可以设置 dest=dest、dest=src、dest=NaN、dest=+/-Inf、dest=+/-0、dest=pi/2 或其他一些东西。请注意,dest 也是一个输入操作数,即使没有写掩码。
    【解决方案2】:

    英特尔在其"future extensions" instruction set reference manual 中的描述具有通常的Operation 部分,它完全指定了哪些位在哪里。

    Intrinsics Guide 还复制了 Operation 部分,与内部指南中其他一些记录不佳的条目相比,这是一个很好的变化。或者它可能是最近添加的。它仍然遗漏了表格和图表。我通常发现 insn ref 手册更有用,但有时在搜索我可能没有想到或不知道的说明时除外。

    该指令的操作部分长且难以理解,英文文字描述只是粗略的总结:

    执行以双精度编码的四字元素的修正 第一个源操作数(第二个操作数)中的浮点格式 使用相应的 32 位、两级查找表 第二个源操作数(第三个操作数)的四字元素 异常报告说明符 imm8

    ...

    两级查找表对每个 DP FP 输入数据进行修复 在第一个源操作数中通过将输入数据编码解码为 8 令牌类型。为每个令牌类型定义了一个响应表, 将第一个源操作数中的输入编码转换为 16 中的一个 响应动作。

    预期的用例是:

    • dest=rcppd(或类似)的结果 + newton-raphson 迭代
    • src=输入到近似值 + 细化
    • table=修复表。可以是广播内存操作数,因此在您希望向量的每个元素都使用同一个表的常见情况下,只需要 64 或 32 位内存。 (该表对于单精度和双精度都只有 32b,但 DP 版本的广播选项是 m64bcst。它的高 32 位是垃圾是可以的,但它不能跨越页面边界进入未映射的页面:那将可能有错。)

    也许更详细的英文描述将有助于弥合非常粗略的摘要和完整伪代码之间的差距:

    对于每个 src 元素:

    • tsrc = 如果设置了MXCSR.DAZ,则将非正规刷新为零。在此之后根本没有使用原始 src:没有 dest=src 操作,只有 dest=tsrc

    • tsrc 归类为八种“令牌”类型之一(QNAN、SNAN、零、+1、-Inf、+Inf、负值、正值)。如果 imm8 不为零,则在找到匹配类型的令牌时将触发异常。

    • 使用该类别标记在第三个操作数的对应元素中查找一个动作(这是一个由八个 4 位代码组成的表,每个标记一个)。

    • 动作可以是 dest=dest, dest=tsrc, dest=NaN, dest=+/-Inf, dest=Inf 符号为 tsrc, dest=+/-0, dest=+ /-1、dest=1/2、dest=90.0、dest=pi/2 或 dest=MAX/MIN_FLOAT。请参阅英特尔的文档,了解哪些代码对应于哪些操作。

    这个过程是针对每个向量元素单独完成的。

    一个典型的用法是将dest=dest 代码用于我们正在修复的结果已经正确的所有情况。请注意,dest 也是一个输入操作数,即使没有写掩码,因为 dest=dest 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-12
      • 2015-01-22
      • 2020-10-27
      • 2015-07-15
      • 2018-07-17
      • 2012-08-13
      • 2011-04-16
      • 1970-01-01
      相关资源
      最近更新 更多