2016-03-19 4 views
1

Привет, я читаю этот сайт http://www.viva64.com/en/a/0054/ и для номера 17, он говорит, что код ниже без барьера неправильный. Зачем ? Я читал в http://bisqwit.iki.fi/story/howto/openmp/#BarrierDirectiveAndTheNowaitClause, в конце каждого параллельного блока есть неявный барьер, а в конце каждого раздела - для и для одного оператора, если не используется директива nowait.Неявный барьер OpenMP

struct MyType 
{ 
    ~MyType(); 
}; 
MyType threaded_var; 
#pragma omp threadprivate(threaded_var) 
int main() 
{ 
    #pragma omp parallel 
    { 
      ... 
      #pragma omp barrier // code is wrong without barrier. 
    }  
} 

Кто-то объяснит мне, пожалуйста. Thanks

+1

насколько я понимаю [есть осущий icit барьер в конце параллельной области] (https://computing.llnl.gov/tutorials/openMP/#ParallelRegion). Предполагая, что это правда, я думаю, что точка № 17 неверна в ссылке. –

+0

Просто проверил спецификацию OpenMP 4.5, и он говорит: «В конце параллельной конструкции есть неявный барьер». –

+0

В спецификации указано: «Сохранение всех копий переменной threadprivate освобождается в соответствии с тем, как статические переменные обрабатываются на базовом языке, но в неопределенной точке программы». –

ответ

0

Связанная веб-страница не соответствует этой точке. На самом деле в конце параллельного раздела есть неявный барьер.

Поскольку веб-сайт, кажется, фокус для Windows и MS поддерживает только OpenMP стандарт 2.0, может быть, стоит отметить, что этот неявный барьер не только в текущем стандарте 4.5, но в версии 2.0:

После завершения параллельной конструкции, нити в команде синхронизации в неявном барьере, [...]

http://www.openmp.org/mp-documents/cspec20.pdf

Смежные вопросы