什么是"修复"浮动?

时间:2015-05-13 11:34:46

标签: simd intrinsics avx512

我正在查看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

这里的意思是"修复"?

2 个答案:

答案 0 :(得分:4)

这是一个很好的问题。英特尔的答案(我的大胆)就在这里:

  

此说明专门用于修复   算术计算的结果涉及一个来源,以便它们   符合规范,虽然它通常有用于修复   多指令序列的结果反映特殊数字   投入。例如,考虑rcp(0)。 输入0到rcp,你应该   根据DX10规范获取INF。但是,评估rcp via   Newton-Raphson,其中x =约(1/0),产生不正确的结果。至   处理这个问题,VFIXUPIMMPS可以在N-R倒数后使用   序列将结果设置为正确的值(即当时的INF   输入是0)。

在以下位置查找VFIXUPIMMPD:

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

答案 1 :(得分: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 = fixup table。可以是广播内存操作数,因此在需要为向量的每个元素使用相同表的常见情况下,只需要64或32位内存。 (对于单精度和双精度,该表只有32b,但DP版本的广播选项是m64bcst。它的上部32位可以是垃圾,但不能跨越页面边界到未映射的页面:这可能是错误的。)

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

对于每个src元素:

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

  • tsrc分类为八个"令牌"之一类型(QNAN,SNAN,零,+ 1,-Inf,+ Inf,负值,正值)。如果imm8非零,则在找到匹配类型的标记时将触发异常。

  • 使用该类别标记在第3个操作数的相应元素中查找操作(这是一个包含8个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操作,pathExtension也是输入操作数,即使没有写掩码也是如此。