Рассмотрим следующий фрагмент кода, являющийся частью большего кода:
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?Если нет, то это ложное срабатывание (или неопределенное поведение, которое нужно исправить, происходящее где-то еще в коде).