第一个数据集增加的执行时间是什么原因?组装说明是一样的。
在 DN_FLUSH 标志未打开的情况下,第一个数据集需要 63 毫秒,第二个数据集需要 15 毫秒。
启用 DN_FLUSH 标志后,第一个数据集需要 15 毫秒,第二个数据集需要约 0 毫秒。
因此,在这两种情况下,第一个数据集的执行时间要长得多。
有什么方法可以减少执行时间以更接近第二个数据集?
我正在使用 C++ Visual Studio 2005,/arch:SSE2/fp:fast 在 Intel Core 2 Duo T7700 @ 2.4Ghz Windows XP Pro 上运行。
#define NUMLOOPS 1000000
// Denormal values flushed to zero by hardware on ALPHA and x86
// processors with SSE2 support. Ignored on other x86 platforms
// Setting this decreases execution time from 63 milliseconds to 16 millisecond
// _controlfp(_DN_FLUSH, _MCW_DN);
float denormal = 1.0e-38;
float denormalTwo = 1.0e-39;
float denormalThree = 1;
tickStart = GetTickCount();
// Run First Calculation Loop
for (loops=0; loops < NUMLOOPS; loops++)
{
denormalThree = denormal - denormalTwo;
}
// Get execution time
duration = GetTickCount()-tickStart;
printf("Duration = %dms\n", duration);
float normal = 1.0e-10;
float normalTwo = 1.0e-2;
float normalThree = 1;
tickStart = GetTickCount();
// Run Second Calculation Loop
for (loops=0; loops < NUMLOOPS; loops++)
{
normalThree = normal - normalTwo;
}
// Get execution time
duration = GetTickCount()-tickStart;
printf("Duration = %dms\n", duration);
最佳答案
引用英特尔的优化手册:
至于如何避免这种情况,如果你不能刷新非规范化:尽你所能确保你的数据被适本地缩放,并且你首先不会遇到非规范化。通常这意味着延迟应用一些比例因子,直到您完成所有其他计算。
或者,在 double
中进行计算,它具有更大的指数范围,因此一开始就不太可能遇到非正规数。
关于c++ - 浮点数学执行时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2051534/