assembly fdiv使用dword或qword参数会更快吗?

8tntrjer  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(162)

我可以在以下80387指令之间进行选择:

fdiv dword ptr a

fdiv qword ptr b

数字ab是等价的,它们都是100%准确的。
我为什么要选择qword版本?我只能认为速度是一种好处。在现代处理器上有什么不同吗?80387和80487有区别吗?

hm2xizp9

hm2xizp91#

dword大小不会变慢。(除非由于一些次要影响,如此处较窄的内存位置导致一些 * 其他 * 数据未对齐。
在大多数CPU上,我认为当qword的值相同时,除了数据传输时间外,它的速度也相同。
在某些CPU上,如果尾数的低位不全为零(因此除数的有效位比双字浮点数的有效位多),则可能会更慢。除非“舍入数”,否则早出情况仅适用于具有少得多的有效位的数字。
在P5奔腾之前,传输一个qword比一个dword需要更多的周期,因为直到P5奔腾才将数据路径扩展到64位。(除非486 DX可以在FPU和其内部缓存之间传输64位?64位原子性保证是P5的新特性。)
我认为内存源FP数学运算相当于像fld一样先将1扩展到80位,就FPU本身看到的数据而言,因此表示与dword float 32完全相同的值的qword float 64将在完成加载内存操作数后导致实际FPU工作的相同输入。
对于fadd/fsub/fmul指令,性能不依赖于输入数据或x87控制字中的精度设置(输出必须产生多少个尾数位),至少在P5或更高版本上不依赖。
但是fdivfsqrt确实取决于精度设置。https://agner.org/optimize/指令表仅包括P5作为最早的。fdiv周期为19/33/39,分别用于P5上的24、53或64位输出尾数精度设置。降低精度可以加快fdiv/fsqrt的速度,但会损害所有内容的精度:有趣的事实:Direct3D by default would lower FPU precision to the minimum 24-bit,可能是因为3D几何学对向量的大小做了很多平方和除法。
在某些CPU上,fdiv性能取决于实际数据。在许多CPU上,Agner Fog的指令表都包含有关fdiv计时的注解。第一个这样的注解,对于AMD K7说“低值[时钟周期计数]是用于循环除数,例如。2的幂是最圆的,具有全零尾数,但是措辞暗示其他值也可以是稍微圆的并且花费更少的周期。
所以我猜不仅仅是2的幂快。一个qword float 64也是一个精确的float 32,有点圆:只有23个非零尾数位,低29位全为零。但这仍然可能有很多非零尾数位;也许太多了,任何特殊情况下适用,IDK。
后来的注解更加简洁,只是提到了“圆除数”,但据推测他的意思是一样的,而不仅仅是2的幂作为唯一的特例。
Pentium-M/ Core Solo/Duo具有fdiv吞吐量或8到37个周期(divsd也是如此),Agner Fog的注解说“高值是典型的,低值是低精度或舍入除数。我不知道“舍入除数”是否只意味着2的幂(全零尾数),或者是否有一个 * 如何 * 舍入的滑动尺度,比如有多少有效尾数位。对于P-M / Core 1上的整数div/idiv,注解的开头相同,但添加了“Core Solo/Duo在允许提前算法的舍入值的情况下比Pentium M更有效。
具有此类注解的CPU:

  • K7、K8:舍入除数更快

  • K10提到idiv的速度取决于 * 被除数 * 的绝对值中的有效位数,并查看AMD的优化手册。但没有fdiv注意,K10上的延迟/吞吐量已修复。山猫/美洲虎也一样。

  • 推土机-系列:fdiv的可变延迟和吞吐量(并且部分流水线化,吞吐量优于延迟),但没有说明何时。

  • 禅1:可变延迟和吞吐量,没有注解

  • 禅2禅4:fdiv延迟= 15个周期,吞吐量=每6个周期一个。

  • P5 Pentium:*FDIV需要19、33或39个时钟周期,分别用于24、53和64位精度。FIDIV需要3个时钟。精度由浮点控制字 * 的位8-9定义

  • P6 Pentium II / III:FDIV延迟取决于控制字中指定的精度:64位精度给出等待时间38,53位精度给出等待时间32,24位精度给出等待时间18。除以2的幂需要9个时钟。吞吐量的倒数是1/(延迟-1)。(不依赖于提及的数据值)

  • Pentium M / Core(1)Duo/Solo:* 高值为典型值,低值为低精度或舍入除数。*

  • 核心2 Merom和Wolfdale,以及Nehalem:* 舍入除数或低精度给予低值。*

  • 没有关于Sandybridge或更高版本的注解:fdiv定时,对于SnB,lat = 10- 24 c,recip吞吐量= 10- 24 c。IvB / Haswell稍微管道化它(吞吐量比延迟好几个周期),Broadwell是吞吐量明显优于延迟的时候。

  • 奔腾4:* 延迟和吞吐量倒数取决于F. P.中的精度设置。控制字单精度:23、双精度:38、长双精度(默认):43.* 以及 * 在使用FP-DIV单元期间FP-MUL单元的吞吐量降低。*(尽管fdiv是单个uop发出/分派。)

  • Atom / Silvermont / Goldmont(plus)/特雷蒙:fdiv延迟和吞吐量是固定的,甚至没有提到精度设置的帮助。

  • 通过Nano 2000 / 3000:fdiv延迟和吞吐量为15-42(Nano 2000)或14-23个周期(Nano 3000)。没有音符,所以可能只是精确控制。
    脚注1:加宽是相当微不足道的:在尾数底部填充零,并调整偏置指数字段,使其表示2的相同幂。80位格式还在尾数中使用显式而不是隐式的前导1(或0用于subnormal),因此该位从指数字段解码。

对于dword或qword加载,解码过程的工作量应该是相同的; P5 Pentium在单个时钟周期内运行fld m32 / m64

相关问题