我有以下代码,我认为应该显示一个近似整个过程进度的进度条(因为循环的每个并行线程应该以大致相同的速率进行)
#pragma omp parallel for
for(long int x=0;x<elevations.size1();x++){
#pragma omp master
{
progress_bar(x*omp_get_num_threads()); //Todo: Should I check to see if ftell fails here?
}
........
}
但是,我收到以下错误:
warning: master region may not be closely nested inside of work-sharing or explicit task region [enabled by default]
现在,当我运行代码时,我确实得到了所需的结果。但我不喜欢警告。为什么这会给我一个警告,是否有更好的方法来实现这一目标?
谢谢!
答案 0 :(得分:6)
它正在给你警告,因为 主区域可能不会紧密嵌套在工作共享,原子或显式任务区域内。
#pragma omp master
是一个主要区域,顾名思义,#pragma omp parallel for
是一个任务共享区域。
它们是紧密嵌套的,因为没有函数调用或语句将它们分开。
为了避免警告,请用{/ p>之类的内容替换#pragma omp master
tid = omp_get_thread_num();
if(tid == 0)
{
progress_bar(x*omp_get_num_threads());
}
根据示例here。
有关更多信息和示例,请参阅Guide into OpenMP: Easy multithreading programming for C++。
有关详细信息,请参阅OpenMP Specification或查看Intel's Documentation on Improper nesting of OpenMP constructs。