#pragma omp并行永不结束
我的代码如下,由于某种原因,我的程序似乎永远不会退出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;
那么我通过移动最后一节
#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;
}
}
出并行sectio的固定它并顺序执行(因为它已经是连续的)。 为什么这解决了我无能为力的问题。
根据注释,代码在Debug配置中工作,但不在Release配置中。这表明编译器正在进行阻止代码运行的优化。这些优化可能来自我建议阅读OpenMP内存模型的OpenMP内存模型)。原始代码中存在一些缺陷(语句中的竞争条件(“Converged = true”))。添加适当的同步将迫使编译器正确地更新变量Converged并可能使问题消失
干杯, -Michael
取决于如何声明'聚合',这可能是答案。我认为它是共享的,但它可能不是。关于“融合”是共享还是私有的更详细的信息可以在[这里]找到(http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg .doc/proguide/cuppvars.htm)(假设编译器的行为相似,这可能不是一个安全的假设)。 – 2014-10-20 13:15:30
您是否尝试过相同的代码,但没有OMP?调试OMP代码要困难得多。确保底层代码首先给出正确的结果。 – 2014-10-20 06:24:31
是的代码工作在顺序和输出是正确的并行,它只是永远不会退出代码块后完成虽然 – Spamus 2014-10-20 06:36:45
一些更多的建议:1)'desiredNumThreads'是1时会发生什么? 2)将'cout 2014-10-20 06:37:16