我的代码如下,由于某些原因,我的程序似乎永远不会退出parallel
区域。
我的代码进入
cout<< omp_get_thread_num()<<" done"<< endl;
行,但它只是由root(0)进程执行,它永远不会到达
cout<<"done2?"<< endl;
一部分。
它已进入无限循环或其他东西。对我来说,每个线程都没有cout
这样做是没有意义的,因为我在它之前添加了omp barrier
所以每个线程都必须在它之前到达它root甚至可以说已经完成了。感谢您的帮助。
#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;
答案 0 :(得分:0)
根据MSDN,最大线程数为10.将desiredNumThreads
更改为10或更少,它应该可以正常工作。
答案 1 :(得分:0)
根据评论,代码在Debug配置中工作,但在Release配置中不起作用。这向我表明编译器正在进行优化以阻止代码运行。这些优化可能来自OpenMP内存模型,我建议阅读有关OpenMP内存模型的内容。原始代码中存在若干缺陷(语句中的竞争条件(&#34; Converged = true&#34;)。添加适当的同步将强制编译器正确更新变量Converged,并可能使问题消失。 / p>
干杯, -Michael
答案 2 :(得分:0)
我通过移动最后一节来修复它
#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;
}
}
&#13;
离开并行部分并按顺序执行(因为它已经是顺序的)。 为什么这解决了我无能为力的问题。