#pragma omp parallel永远不会结束

时间:2014-10-20 06:15:43

标签: c++ openmp

我的代码如下,由于某些原因,我的程序似乎永远不会退出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;

3 个答案:

答案 0 :(得分:0)

根据MSDN,最大线程数为10.将desiredNumThreads更改为10或更少,它应该可以正常工作。

答案 1 :(得分:0)

根据评论,代码在Debug配置中工作,但在Release配置中不起作用。这向我表明编译器正在进行优化以阻止代码运行。这些优化可能来自OpenMP内存模型,我建议阅读有关OpenMP内存模型的内容。原始代码中存在若干缺陷(语句中的竞争条件(&#34; Converged = true&#34;)。添加适当的同步将强制编译器正确更新变量Converged,并可能使问题消失。 / p>

干杯,         -Michael

答案 2 :(得分:0)

我通过移动最后一节来修复它

&#13;
&#13;
#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;
&#13;
&#13;

离开并行部分并按顺序执行(因为它已经是顺序的)。 为什么这解决了我无能为力的问题。