Эти коды не эквивалентны: в первом случае a и b являются общими переменными (так как shared является поведением переменных по умолчанию), во втором случае это переменные, относящиеся к частным потокам, которые не существуют вне области действияпараллельный регион.
Кроме того, оператор return
в параллельном регионе во втором фрагменте кода недопустим и должен вызывать ошибку компиляции.
Как видно, например, в этом Справочная карта OpenMP 4.0
Исполняемая директива OpenMP применяется к последующему структурированному блоку или конструкции OpenMP.Каждая директива начинается с #pragma omp.Остальная часть директивы следует соглашениям стандартов C и C ++ для директив компилятора.Структурный блок - это отдельный оператор или составной оператор с одной записью вверху и одним выходом внизу.
Блок, содержащий оператор return
, не является структурированнымблок, поскольку у него нет единственного выхода внизу (т. е. закрывающая скобка }
- не единственный выход, поскольку return
- еще один).Это не может юридически следовать директиве #pragma omp parallel
.