我的代碼如下,由於某種原因,我的程序似乎永遠不會退出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