我的代码如下,由于某种原因,我的程序似乎永远不会退出parallel
区域。#pragma omp并行永不结束
我的代码获取到
cout<< omp_get_thread_num()<<" done"<< endl;
线,但它仅有史以来根(0)的过程中执行的,它从不获取到
cout<<"done2?"<< endl;
一部分。
这就像它已进入无限循环或什么。我甚至没有意识到每个线程都不会在cout
之前完成它,因为我在它之前添加了omp barrier
,所以每个线程在根甚至可以说完成之前必须达到它。感谢您的帮助。
#pragma omp parallel num_threads(desiredNumThreads)
{
double startTime;
#pragma omp master
{
startTime = omp_get_wtime();
}
while (!Converged)
{
#pragma omp master
{
iteration++;
}
#pragma omp for
for (int i = 0; i < matrixsize; i++)
{
oldX[i] = newX[i];
//newX[i] = Bmatrix[i];
}
#pragma omp for
for (int i = 0; i < matrixsize; i++)
{
newX[i] = Bmatrix[i]; //new part
for (int j = 0; j < matrixsize; j++)
{
if (j != i)
{
newX[i] = newX[i] - matrix[i][j] * oldX[j];
}
}
newX[i] = newX[i]/matrix[i][i]; //new part
}
#pragma omp master
{
Converged = true;
}
#pragma omp barrier
#pragma omp for
for (int i = 0; i<matrixsize; i++)
{
if (abs(oldX[i] - newX[i]) > Tolerance)
{
Converged = false;
}
}
}
#pragma omp master
{
double endTime = omp_get_wtime();
cout << "This took " << iteration << " iterations. " << endl;
cout << "This took " << endTime - startTime << " seconds" << endl;
cout << "File to Print answer to? ";
cin >> filename;
ofstream fout(filename);
for (int i = 0; i < matrixsize; i++)
{
fout << fixed << newX[i] << endl;
}
}
#pragma omp barrier
cout<<omp_get_thread_num()<<" done"<<endl;
}
cout<<"done2?"<<endl;
您是否尝试过相同的代码,但没有OMP?调试OMP代码要困难得多。确保底层代码首先给出正确的结果。 – 2014-10-20 06:24:31
是的代码工作在顺序和输出是正确的并行,它只是永远不会退出代码块后完成虽然 – Spamus 2014-10-20 06:36:45
一些更多的建议:1)'desiredNumThreads'是1时会发生什么? 2)将'cout <<“Thread”<< omp_get_thread_num()<<“started”<< endl;'添加到块的开头。你使用什么编译器/操作系统? – 2014-10-20 06:37:16