OpenMP: состояние гонки в пределах одного региона между барьерами - PullRequest
0 голосов
/ 19 сентября 2018

Рассмотрим следующий фрагмент кода, являющийся частью большего кода:

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 сообщает о гонке данных со следующим выводом:

Intel Inspector Output

Возможно, вам нужен полный пример, но я не думаю, что он необходим, учитывая мой простой вопрос:

Поскольку существует явный барьер перед одной областью и неявный барьер наконец одной области, если поток находится внутри одной области, все остальные потоки должны находиться между этими двумя барьерами, верно?

Другими словами, возможно ли, что один поток находится на линии 208 (внутриодин регион), в то время как другой поток находится на линии 202 (за пределами одного региона), как говорит Intel Inspector?Если нет, то это ложное срабатывание (или неопределенное поведение, которое нужно исправить, происходящее где-то еще в коде).

...