没有时间报告 我有一个C++程序,实现了高斯消去。 它在计算部分编译并运行正常,但在它应该告诉计算所花费的时间之前,它会因一个错误而崩溃 #include <iostream> #include <time.h> #include <omp.h> #include <vector> #include <cstdlib> using namespace std; int main() { const unsigned int N = 10; // initialize random seed: srand (time(NULL)); vector<vector <double> > a(N, vector<double>(N+1)) ; double buf; vector<double> x(N); unsigned int i,j,k; clock_t t; t = clock(); double prectime=omp_get_wtime(); //#pragma omp parallel for shared() private() num_threads() //matrix and right-side vector initialisation for(i = 0; i < N; i++) { for(j = 0; j < N+1; j++) { a[i][j]=(1+rand() % 100)/25.0; //cout << "a[" << i << "][" << j <<"] = " << a[i][j] << endl; } } //there for(i = 0; i < N -1; i++) { for(j = i + 1; j < N; j++) { buf=a[i][i]/a[j][i]; //cout << "buf = " << buf << endl; for (k = 0; k <= N; k++) { a[j][k] = a[j][k]*buf - a[i][k]; //cout << "a[" << j << "][" << k <<"] = " << a[j][k] << endl; } } } // & back again =) x[N-1] = a[N-1][N]/a[N-1][N-1]; for(i = N-2; i >= 0; i--) { buf = 0; for (j = i+1; j < N; j++) { buf += a[i][j] * x[j]; //cout << "buf = " << buf << endl; } x[i]=(a[i][N] - buf)/a[i][i]; cout << "x[" << i << "] = " << x[i] << endl; } prectime=omp_get_wtime()-prectime; t=clock()-t; cout << "The thingy is calculated in " << t << "clicks("<< ((float)t)/CLOCKS_PER_SEC <<" seconds) " << endl; cout << "Actual time spent is probably " << prectime << "seconds "<< endl; return 0; }

没有时间报告 我有一个C++程序,实现了高斯消去。 它在计算部分编译并运行正常,但在它应该告诉计算所花费的时间之前,它会因一个错误而崩溃 #include <iostream> #include <time.h> #include <omp.h> #include <vector> #include <cstdlib> using namespace std; int main() { const unsigned int N = 10; // initialize random seed: srand (time(NULL)); vector<vector <double> > a(N, vector<double>(N+1)) ; double buf; vector<double> x(N); unsigned int i,j,k; clock_t t; t = clock(); double prectime=omp_get_wtime(); //#pragma omp parallel for shared() private() num_threads() //matrix and right-side vector initialisation for(i = 0; i < N; i++) { for(j = 0; j < N+1; j++) { a[i][j]=(1+rand() % 100)/25.0; //cout << "a[" << i << "][" << j <<"] = " << a[i][j] << endl; } } //there for(i = 0; i < N -1; i++) { for(j = i + 1; j < N; j++) { buf=a[i][i]/a[j][i]; //cout << "buf = " << buf << endl; for (k = 0; k <= N; k++) { a[j][k] = a[j][k]*buf - a[i][k]; //cout << "a[" << j << "][" << k <<"] = " << a[j][k] << endl; } } } // & back again =) x[N-1] = a[N-1][N]/a[N-1][N-1]; for(i = N-2; i >= 0; i--) { buf = 0; for (j = i+1; j < N; j++) { buf += a[i][j] * x[j]; //cout << "buf = " << buf << endl; } x[i]=(a[i][N] - buf)/a[i][i]; cout << "x[" << i << "] = " << x[i] << endl; } prectime=omp_get_wtime()-prectime; t=clock()-t; cout << "The thingy is calculated in " << t << "clicks("<< ((float)t)/CLOCKS_PER_SEC <<" seconds) " << endl; cout << "Actual time spent is probably " << prectime << "seconds "<< endl; return 0; },c++,time,clock,C++,Time,Clock,,但我认为OpenMP部分现在可以忽略(在这个阶段不使用) 我做错了什么 编辑:如果我将-D\u GLIBCXX\u DEBUG添加到已使用的g++标志中,它将编译并运行OK,并按预期显示时间。尽管如此,这仍然不能帮助我理解为什么会出问题,以及是什么出了问题 unsigned int i; for(i = N-2; i >= 0; i--) i>=0将始终为真,这是一个无限循环,循环体将使用无效索引i访问a[i][j] 最好将循环更改为 for(i = N-1; i-- > 0;

,但我认为OpenMP部分现在可以忽略(在这个阶段不使用)

我做错了什么

编辑:如果我将
-D\u GLIBCXX\u DEBUG
添加到已使用的
g++
标志中,它将编译并运行OK,并按预期显示时间。尽管如此,这仍然不能帮助我理解为什么会出问题,以及是什么出了问题

unsigned int i;
for(i = N-2; i >= 0; i--)
i>=0
将始终为真,这是一个无限循环,循环体将使用无效索引i访问
a[i][j]

最好将循环更改为

for(i = N-1; i-- > 0; )

您正陷入一个无限循环

for(i = N-2; i >= 0; i--)
因为
i
是一个
无符号int
,因此当您希望它变为-1时,它会溢出(这意味着您对数组进行了错误的索引,因为超出了范围)。因此,您没有达到计时应该出现的点。一般来说,您应该首先确保您的程序是正确的,然后测量它的时间

尝试将
i
设置为
int
,而不是
无符号的


那么出了什么问题

要么你的程序会无限运行,因为有无限循环

它将崩溃,这是最可能发生的情况,因为
i
将采用一个非常大的值(系统中的最大值
unsigned int
),并将无效地访问数组
a
,从而导致越界访问,这可能会导致分段错误

通过将
i
更改为
int
,我们允许
i
也为负值,因此它可以得到值-1,使本答案中讨论的循环正常,因为当
i
变为负值时,它不会进入循环体

在处理无符号整数和减少计数器的循环时,请始终注意溢出的危险!为了消除此警告,通常会将计数器类型更改为
无符号整数
,而不是
整数

警告:有符号和无符号整数表达式之间的比较


但是,您永远不要忘记,应该谨慎使用递减无符号整数

首先在调试器中运行,找出崩溃发生的位置。然后检查所有相关变量的值,看看它们是否都正常。并确保你没有在任何地方建立索引。哦,你可能想更新你的问题标题,以实际表明问题(崩溃)。@JoachimPileborg,我应该这样做,但我真的无法正确表达。“没有时间报告,在那之前它就崩溃了”真的不是一个有用的话题。对WernerHenze来说,据我所知,所有
a
元素都是非零的。您应该在调试模式下构建。例如,MSVC在调试模式下向
vector::operator[]()
添加索引检查。关于您的编辑,这是在您已经发布的代码中发生的还是在我的建议中发生的?我觉得你很幸运,程序正常终止。尝试了更改的循环,得到了相同的结果。@Chiffa更改了你的代码,并在这里进行了尝试。有效。我将
unsgined int
更改为just
int
,并尝试了循环的原始版本和您和Samaras建议的版本。但两个都不管用,做了,没用。我养成了使用循环变量
无符号int
来停止编译器警告的习惯。我这么做可能是错的,不是真的。我也曾处于这个位置@Chiffa。您在哪里使用
int i
进入无限循环的?好的,谢谢。我可能会认为这是正确的答案,并进行到这个实验的并行部分=)额外感谢提到编译器警告和提醒循环逻辑。欢迎你@ Chiffa。在继续进行时间测量之前,务必确保您的程序正确。祝你好运,我有一个分布式项目正在启动,所以我感觉到你了!你也得到了我的+1警告案例。
for(i = N-2; i >= 0; i--)