为什么这段代码,
const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8,
1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6};
const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812,
1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690};
float y[16];
for (int i = 0; i < 16; i++)
{
y[i] = x[i];
}
for (int j = 0; j < 9000000; j++)
{
for (int i = 0; i < 16; i++)
{
y[i] *= …Run Code Online (Sandbox Code Playgroud) c++ floating-point performance compilation visual-studio-2010
我最近遇到了非规范化的定义,我理解有些数字不能用标准化的形式表示,因为它们太小而不适合它的相应类型.根据IEEE
所以我试图做的是当一个非规范化数字作为参数传递时捕获,以避免使用这个数字进行计算.如果我理解正确,我只需要在非规范化范围内查找数字
private bool IsDenormalizedNumber(float number)
{
return Math.Pow(2, -149) <= number && number<= ((2-Math.Pow(2,-23))*Math.Pow(2, -127)) ||
Math.Pow(-2, -149) <= number && number<= -((2 - Math.Pow(2, -23)) * Math.Pow(2, -127));
}
Run Code Online (Sandbox Code Playgroud)
我的解释是否正确?
根据我之前的问题,我的想法是在系数m_a,m_b为1.0或0.0时通过去除计算来优化算法.现在我尝试优化算法并得到一些我无法解释的奇怪结果.
第一个分析仪运行100k样品.从文件(!)读取参数值:
b0 = 1.0 b1 = -1.480838022915731 b2 = 1.0
a0 = 1.0 a1 = -1.784147570544337 a2 = 0.854309980957510

第二个分析仪运行相同的100k样本.从文件(!)读取参数值:
b0 = 1.0 b1 = -1.480838022915731 b2 = 1.0
a0 = 1.0 a1 = -1.784147570544337 a2 = 0.0 <---只有a2不同!

在图中,左侧的数字(灰色背景)表示所需的CPU周期.因为参数a2 = 0.0的清晰可见的第二次运行要快得多.
我检查了调试和发布代码之间的区别.发布代码更快(正如预期的那样).修改参数a2时,调试和释放代码具有相同的奇怪行为.
然后我检查了ASM代码.我注意到使用了SSE指令.这是有效的,因为我用/ arch:SSE2编译.因此我禁用了SSE.生成的代码不再使用SSE,性能不再依赖于参数值a2(如预期的那样)
因此,我得出的结论是,当使用SSE并且SSE引擎检测到a2为0.0时,它们是某种性能优势,因此省略了过时的乘法和减法.我从来没有听说过这个,并试图找到信息,但没有成功.
那么有人对我的表现结果有解释吗?
为完整起见,这是发布版本的相关ASM代码:
00F43EC0 mov edx,dword ptr [ebx]
00F43EC2 movss xmm0,dword ptr [eax+edi*4]
00F43EC7 cmp edx,dword ptr [ebx+4]
00F43ECA je $LN419+193h (0F43F9Dh)
00F43ED0 mov esi,dword ptr [ebx+4]
00F43ED3 lea eax,[edx+68h]
00F43ED6 lea …Run Code Online (Sandbox Code Playgroud)