Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance vgetmantps vs and Pd获取浮点尾数的指令_Performance_X86_Floating Point_Simd - Fatal编程技术网

Performance vgetmantps vs and Pd获取浮点尾数的指令

Performance vgetmantps vs and Pd获取浮点尾数的指令,performance,x86,floating-point,simd,Performance,X86,Floating Point,Simd,对于skylakex(agner fog的说明表): 这是否意味着使用位掩码和逻辑and来获取浮点的尾数比使用vgetmantps指令更快 将数字从float传输到int并返回到float的延迟是多少?对于实现log(x),您希望尾数和指数为float,而vgetmantps/vgetexpps非常适合。这就是这些指令的目的,并且确实加速了对log(2)的快速近似。(此外,它可以将有效值标准化为-0.5..+0.5,而不是0..1或其他精确范围,以创建多项式近似值log(x+1)或任何值的输入。

对于skylakex(agner fog的说明表):

这是否意味着使用位掩码和逻辑and来获取浮点的尾数比使用vgetmantps指令更快

将数字从float传输到int并返回到float的延迟是多少?

对于实现
log(x)
,您希望尾数和指数为
float
,而
vgetmantps
/
vgetexpps
非常适合。这就是这些指令的目的,并且确实加速了对
log(2)
的快速近似。(此外,它可以将有效值标准化为-0.5..+0.5,而不是0..1或其他精确范围,以创建多项式近似值
log(x+1)
或任何值的输入。请参阅。)

如果您只希望尾数是一个整数,那么确定并去掉其他位,您就在一条指令中完成了

(但请记住,对于NaN,尾数是NaN有效载荷,因此如果需要对NaN执行不同的操作,则需要检查指数。)

将数字从float传输到int再传输回float的延迟是多少

您已经有Agner Fog的指令表()。在Skylake(SKL和SKX)上,
VCVT(T)PS2DQ
是FMA端口的4c延迟,另一个方向也是如此

或者,您是否在询问使用FP指令(如
和ps
的输出)作为整数指令的输入时的旁路延迟

Agner Fog的Microach PDF提供了一些关于绕过vec int和fp域之间发送数据的延迟的信息,但没有太多细节

Skylake的旁路延迟很奇怪:与以前的UARCHE不同,它取决于指令实际选择的端口<如果在端口5上运行,则code>andps在FP指令之间没有旁路延迟,但如果在p0或p1上运行,则有额外的1c延迟

有关按域+执行端口细分的域交叉延迟表,请参阅《英特尔优化手册》

(更奇怪的是,这种旁路延迟会永远影响该寄存器,即使它肯定已写回物理寄存器,并且没有通过旁路网络转发。
vpaddd xmm0、xmm1、xmm2
如果其中一个输入来自
vmulps
,则两个输入的延迟都为2c。但是有些混乱和其他错误仍然存在指令在这两个领域都有效。我已经有一段时间没有尝试过了,我没有检查我的笔记,所以这个例子可能并不完全正确,但它是这样的。)


(英特尔的优化手册没有提到这种永久性的效果,这种效果会一直持续到你用一个新值覆盖体系结构寄存器为止。因此,在使用整数指令的循环之前,要小心创建FP常量。)

如果我也计算从浮点到int再到int再到float的转换,vgetmantps从浮点数组中提取尾数并将结果存储在适当位置的速度更快。显然,是的,它说and更快。但是,它们做的事情不同。
vgetmantps
得到一个规范化的有效位。这意味着它适合more浮点运算,而AND只获取原始位(没有适用于正常/低于正常数字的前导位)。这一级别的性能优化很大程度上取决于上下文。一条指令可能使用的处理器单元已经在相邻指令中使用。虽然看起来它们使用的是相同的单元?Agner Fog的
p01/05
表示法是什么意思?这是否意味着它使用了两个单元?@EricPostPhichil:p01/p05的意思是这样的xmm/ymm版本在p0或p1上运行(即在FMA单元上),但ZMM版本在p0或p5上运行。当512位UOP处于活动状态时,SKX关闭端口1,在p0上将这两个256位FMA单元合并为一个512位FMA单元,并在端口5上为额外的512位FMA单元通电。(一些SKX型号没有额外的端口5 FMA,因此对于需要FMA单元的512位UOP,只有一半吞吐量,这实际上是很多,包括整数乘法和移位)。我认为p5 FMA单元的延迟较差;它的物理距离较远。关于int/float延迟,我认为他们可能一直在询问对以前某个整数指令中的数据使用浮点指令的成本。尽管架构寄存器(如%xmm1)相同,但一些处理器保留不同的整数实例和浮点指令。当您更改指令时,数据必须在内部移动。但我认为ANDPS算作浮点指令,因此不会有任何成本。@EricPostFischil:啊,这使问题更有意义。已更新。
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
|      Instruction      |  Operands   | µops fused domain | µops unfused domain | µops each port | Latency | Reciprocal throughput |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
| VGETMANTPS/PD         | v,v,v       |                 1 |                   1 | p01/05         |       4 | 0.5-1                 |
| AND/ANDN/OR/ XORPS/PD | x,x / y,y,y |                 1 |                   1 | p015           |       1 | 0.33                  |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+