gpt4 book ai didi

c++ - 奇怪的执行时间

转载 作者:IT老高 更新时间:2023-10-28 23:21:37 25 4
gpt4 key购买 nike

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

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

为什么会这样?

最佳答案

在某些情况下,您的程序可能存在浮点溢出和导致 NaN 的操作(如果计算结果为无穷大/NaN,那么它会扩散到您的算法中,因此几乎所有数字都变为无穷大/NaN。这取决于 rand() 的输出。如果您使用 srand() 更改种子,对于 N=500 的情况,您可能不会减速) .

而且,因为你使用 long double,编译后的程序使用 FPU(你也可以用 floatdouble 重现这个,如果您为 FPU 而不是 SSE 编译)。看起来,FPU 处理无限数比正常数慢得多。

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

int main() {
volatile long double z = 2;

for (int i=0; i<10000000; i++) {
z *= z;
}

return z;
}

如果 z 使用 2,此程序运行缓慢(z 会溢出)。如果你用 1 代替它,它会变得很快(z 不会溢出)。

您可以在此处阅读更多信息:https://randomascii.wordpress.com/2012/05/20/thats-not-normalthe-performance-of-odd-floats/

以下是相关部分:

Performance implications on the x87 FPU

The performance of Intel’s x87 units on these NaNs and infinites is pretty bad. [...] Even today, on a SandyBridge processor, the x87 FPU causes a slowdown of about 370 to one on NaNs and infinities.

关于c++ - 奇怪的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com