将 FPU 异常或 INF 投入工作是否可能/有效
is it possible/efficient to put fpu exception or inf into work?
我得到了这样的代码
环路 10 M:
if( fz != 0.0)
{
fhx += hx/fz;
}
这被称为 10 M 次循环需要非常快 - 我需要捕捉 fz 不为零的情况,而不是使div 由零错误,但这是非常罕见的情况,确实在 10M 的情况下它应该是零,我不知道一次、两次或更新
我可以以某种方式摆脱这 10M 的 ifs 并使用"nan/inf",或者可能捕获异常并继续吗?(如果 fz 为零,我需要 fhx += 0.0,我的意思是什么都没有继续?将 FPU 异常或 INF 投入工作是否可能/有效?
(我使用 c++/mingw32(
你可以,但它可能不是那么有用。在这种情况下,遮罩也没有用。
异常发生时非常慢,首先必须在CPU进入内核级异常处理程序之前发生许多微编码的复杂事情,然后它也必须以复杂而缓慢的方式将其移交给您的进程。另一方面,当它们不发生时,它们不会花费任何费用。
但是比较和分支实际上也不会花费任何费用,只要分支是可预测的,而基本上从未被采用的分支是可预测的。当然,要使它们发生需要一点吞吐量,但它们不在关键路径中......但即使是这样,这里真正的问题是每次迭代中的分裂。
无论如何,该除法的通量是每 14 个循环 1 个(在 Haswell 上 - 在其他 μarchs 上更糟(,除非fz
特别"好",即使这样,它也是每 8 个周期 1 个(同样在 Haswell 上(。在 Core2 上,它更像是 19 和 5,在 P4 上,它更像(以典型的 P4 方式(每 71 个周期一个除法。
一个预测良好的分支和一个比较就消失在其中。在我的 4770K 上,有比较和分支之间的差异消失在噪音中(也许如果我运行它足够多的次数,我最终会获得统计上显着的差异,但它会很小(,他们俩都随机获胜大约一半时间。我用于此基准测试的代码是
global bench
proc_frame bench
push r11
[endprolog]
xor ecx, ecx
mov rax, rcx
mov ecx, -10000000
vxorps xmm1, xmm1
vxorps xmm2, xmm2
vmovapd xmm3, [rel doubleone]
_bench_loop:
imul eax, ecx, -0xAAAAAAAB ; distribute zeroes somewhat randomly
shr eax, 1 ; increase to make more zeroes
vxorps xmm0, xmm0
vcvtsi2sd xmm0, eax
vcomisd xmm0, xmm1 ; #
jz _skip ; #
vdivsd xmm0, xmm3, xmm0
vaddsd xmm2, xmm0
_skip:
add ecx, 1
jnz _bench_loop
vmovapd xmm0, xmm2
pop r11
ret
endproc_frame
另一个函数是相同的,但用#标记的两行被注释掉了。
当零数增加时,最终始终获胜的版本是带有分支的版本,表明除以零比分支错误预测要慢得多。这甚至没有使用异常机制来创建程序员可见的异常,它只是来自微编码的"奇怪案例修复"运行的成本。但是你没有那么多零,所以,
TL;DR 实际上没有区别。
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 我如何知道作为参数的size_t在函数中是否有效?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 此递归模板类型定义是否有效C++?
- 将 C 函数转换为 C++ 以检查数字是否有效
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 如何检查输入是否有效?
- 如何检查用户的输入是否有效以及我正在寻找的数字?
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 如何检查isupper(cstr)是否有效?
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何检查字符串格式在读取C++文本文件时是否有效?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 创建加密安全密码.并验证它是否有效