2014-10-20 31 views
0

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

您是否尝试过相同的代码,但没有OMP?调试OMP代码要困难得多。确保底层代码首先给出正确的结果。 – 2014-10-20 06:24:31

+0

是的代码工作在顺序和输出是正确的并行,它只是永远不会退出代码块后完成虽然 – Spamus 2014-10-20 06:36:45

+0

一些更多的建议:1)'desiredNumThreads'是1时会发生什么? 2)将'cout <<“Thread”<< omp_get_thread_num()<<“started”<< endl;'添加到块的开头。你使用什么编译器/操作系统? – 2014-10-20 06:37:16

回答

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; 
 
     }     
 
    }

出并行sectio的固定它并顺序执行(因为它已经是连续的)。 为什么这解决了我无能为力的问题。

0

根据MSDN,线程的最大数目是10更改desiredNumThreads至10或更小,它应该工作。

+0

我尝试过2,10和5,它仍然没有终止。 :/有趣的是,当我刚才说32时,它仍然打印出0-31(零索引),当我添加了测试cout <<“Thread”<< omp_get_thread_num()<<“started”<< endl;部分。 – Spamus 2014-10-20 07:14:02

+0

@Spamus处理器看起来像循环一样繁忙,还是等待?另外,你的意思是说,当你指定一个特定的线程数时,它仍然会启动32? – 2014-10-20 09:57:50

0

根据注释,代码在Debug配置中工作,但不在Release配置中。这表明编译器正在进行阻止代码运行的优化。这些优化可能来自我建议阅读OpenMP内存模型的OpenMP内存模型)。原始代码中存在一些缺陷(语句中的竞争条件(“Converged = true”))。添加适当的同步将迫使编译器正确地更新变量Converged并可能使问题消失

干杯, -Michael

+0

取决于如何声明'聚合',这可能是答案。我认为它是共享的,但它可能不是。关于“融合”是共享还是私有的更详细的信息可以在[这里]找到(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