OpenMP совместно с firstprivate производительности - PullRequest
6 голосов
/ 23 октября 2011

У меня есть #pragma omp parallel for цикл внутри метода класса.Каждый поток только для чтения имеет доступ к нескольким локальным переменным метода, нескольким частным данным вызова и параметру метода.Все они объявлены в предложении shared.Мои вопросы:

  • Производительность не должна иметь никакого значения, объявляйте эти переменные shared или firstprivate.Правильно?
  • Верно ли то же самое, если я не проявляю осторожности в том, чтобы переменная не разделяла одну и ту же строку кэша?
  • Если одна из общих переменных является указателем, а внутри потока я читаюзначение через это, есть ли проблема с наложением, как в обычных циклах?

Завтра я попытаюсь профилировать мой код.А пока спасибо за совет!

1 Ответ

10 голосов
/ 23 октября 2011
  1. Ну, это не одно и то же.С shared они распределяются между всеми потоками.С firstprivate каждый поток получает свою собственную копию.Если вы только читаете переменную, лучше оставить ее как shared, чтобы избежать ее копирования.(В C ++ firstprivate будет неявно вызывать конструктор копирования.)

  2. Правильное чтение и запись в несколько потоков в значения, которые находятся на одной и той же кеш-линии, называется ложное совместное использование .Строка кэша будет отскакивать назад и вперед между ядрами, которые обращаются к ней - что может привести к значительному замедлению, если это происходит достаточно часто.

  3. Если вы просто читаете данные через общий ресурсуказатель, то проблем быть не должно.Но если вы тоже пишете, вам нужно убедиться, что у вас нет состояния гонки.

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