请考虑以下代码摘录,这是较大代码的一部分:
201 for (int iMesh = _meshByThread[iThread][0]; iMesh <= _meshByThread[iThread][1]; iMesh++){
202 _eq[iMesh]->updateDataPreBC(*_sol[iMesh], t);
203 }
204 #pragma omp barrier
205 #pragma omp single
206 {
207 for (size_t iBC = 0; iBC < _bndConditions.size(); iBC++)
208 _bndConditions[iBC]->apply(_sol, t);
209 }
Intel Inspector报告数据竞赛,并显示以下输出:
您可能想要一个完整的示例,但鉴于我的简单问题,我认为不需要该示例:
由于在单个区域之前有一个显式障碍,而在单个区域的末尾有一个隐式障碍,所以如果一个线程在单个区域内,则所有其他线程都应该在这两个障碍之间,对吗?
换句话说,是否有一个线程位于208行(在单个区域内),而另一个线程位于202行(在单个区域外),如Intel Inspector所说?如果不是,则为假阳性(或未定义的行为,在代码中的其他地方发生)。