Почему переменная-член класса x не разрешена для совместного использования (x) в OpenMP? - PullRequest
6 голосов
/ 06 января 2011

В функции-члене я могу распараллелить, используя переменную общего члена int *x вот так

#pragma omp parallel for default(shared)
for(int i=0;i<size;i++) {
  x[i]=i;
}

Но если я попытаюсь

#pragma omp parallel for default(none) shared(x,size)
for(int i=0;i<size;i++) {
  x[i]=i;
}

, я получу ошибку: 'obj::x' is not a variable in clause 'shared'.Я бы предпочел вторую версию, потому что она объявляет общие переменные, с которыми она работает, и напоминает мне, что нужно убедиться, что нет условий гонки или подобных проблем.

Что происходит с этим OpenMP, утверждает, что obj::x не являетсяПеременная?

Ответы [ 2 ]

13 голосов
/ 15 февраля 2011

Большинство реализаций OpenMP обрисовывают параллельную область.То есть они делают это функцией.Частные переменные обычно передаются этой функции, а общие переменные могут передаваться или находиться в области действия функции.Проблема с членами класса данных заключается в том, что они не совпадают с переменными.

Когда компилятор выделяет параллельную область, переменные имеют определенные места хранения, которые компилятор может настроить для передачи в функцию.Члены данных не могут быть созданы (т. Е. Выделено хранилище), пока класс не будет вызван во время выполнения программы.Это означает, что компилятор не может приватизировать элементы данных самостоятельно.Это также должно быть сделано во время выполнения, и это вызовет гораздо больше работы и повлияет на производительность как последовательных, так и параллельных программ.До сих пор ни одна реализация не пыталась выполнить эту работу, и поскольку спецификация OpenMP написана на основе консенсуса, было принято решение запретить использование элементов данных во всех разделах.В противном случае было бы слишком запутанным утверждать, что они разрешены в общих предложениях, но не в других.

1 голос
/ 20 января 2011

Точно не знаю - но посмотрите 32 ловушек OpenMP для разработчиков на C ++ , чтобы разобраться с большинством проблем OpenMP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...