奇怪的执行时间

时间:2017-11-26 20:29:16

标签: c++ compiler-optimization execution-time

问题在于在各种输入大小的执行时间序列中获得一些不连续性。 具体来说,我一直在尝试这段代码:

long double a[2000][2000];
int iter = 0;
int main(int argc, char const *argv[]){
    istringstream is(argv[1]);
    int N;
    is >> N;
    for(int i = 0; i <= N; ++i){
        for (int J = 0; J <= N; ++J){
            a[i][J]  = (rand()%3+1)*(rand()%4+1);
        }
    }
    clock_t clk= clock();
    for(int k = 0; k < N; ++k){
        for(int i = k+1; i < N; ++i){
            a[i][k] = a[i][k]/a[k][k];
        }
        for(int i = k+1; i < N; ++i){
            for(int j = k+1; j < N; ++j){
                iter++;
                a[i][j] = a[i][j] - a[i][k]*a[k][j];
            }
        }
    }
    clk = clock() - clk;
    cout << "Time: " << ((double)clk)/CLOCKS_PER_SEC << "\n";
    cout << iter << endl;
}

使用g ++ 5.4.1进行C ++ 14编译。

我尝试了 N 的各种值的代码。然而,在N = 500附近发生了一些非常奇怪的事情。下面列出了执行时间。 (这些是N的各种值的代码输出。

N = 200 : 0.022136
N = 300 : 0.06792
N = 400 : 0.149622
N = 500 : 11.8341
N = 600 : 0.508186
N = 700 : 0.805481
N = 800 : 1.2062
N = 900 : 1.7092
N = 1000 : 2.35809

我尝试了很多次N = 500,而且在另一台机器上也只是为了得到类似的结果。

大约500个我们有以下内容:

N = 494 : 0.282626
N = 495 : 0.284564
N = 496 : 11.5308
N = 497 : 0.288031
N = 498 : 0.289903
N = 499 : 11.9615
N = 500 : 12.4032
N = 501 : 0.293737
N = 502 : 0.295729
N = 503 : 0.297859
N = 504 : 12.4154
N = 505 : 0.301002
N = 506 : 0.304718
N = 507 : 12.4385

为什么会这样?

1 个答案:

答案 0 :(得分:2)

您的程序可能会出现浮点溢出和操作,导致某些情况下出现NaN(如果计算结果为无穷大/ NaN,则会为您的算法进行扩展,因此几乎所有数字都变为无穷大/ NaN。这取决于{ {1}}输出。如果您使用rand()更改种子,则srand()案例可能不会减速。

并且,因为您使用N=500,编译的程序使用FPU(如果您为FPU而不是SSE编译,则可以使用long doublefloat重现此项。看起来,FPU处理的无限数字比正常数字慢得多。

您可以使用此代码段轻松重现此问题:

double

如果对int main() { volatile long double z = 2; for (int i=0; i<10000000; i++) { z *= z; } return z; } 使用2,则此程序运行缓慢(z将溢出)。如果将其替换为1,则会变快(z不会溢出)。

您可以在此处详细了解:https://randomascii.wordpress.com/2012/05/20/thats-not-normalthe-performance-of-odd-floats/

以下是相关部分:

  

对x87 FPU的性能影响

     

英特尔x87单元在这些NaN和无线上的性能是   很糟糕。 [...]即使在今天,在SandyBridge处理器上,x87 FPU   在NaN和无穷大上导致减速约370比1。