Доступ к приватной памяти потока в OpenMP - PullRequest
6 голосов
/ 17 ноября 2011

В соответствии с OpenMP Memory Model , следующее неверно:

int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
  int x;
  // THREAD 0              // THREAD 1
  p0 = &x;                 p1 = &x;
  *p1 ...                  *p0 ...
}

Хотя мой пример выглядит следующим образом:

int *p0 = NULL, *p1 = NULL;
#pragma omp parallel shared(p0,p1)
{
  int x;
  // THREAD 0              // THREAD 1
  p0 = &x;                 p1 = &x;
  #pragma omp flush

  #pragma omp barrier
  *p1 ...                  *p0 ...
  #pragma omp barrier
}

Это было бы неправильно? Я не могу найти что-то в модели памяти, которая бы это запретила

Я предполагаю, что мой игрушечный пример верен, так как в модели памяти в 3.1 они позволяют задаче иметь доступ к закрытой переменной, пока программист гарантирует, что она все еще жива. Учитывая тот факт, что задачи могут быть развязаны, они теоретически могут выполняться в другом рабочем потоке, что позволяет потоку OpenMP обращаться к частной памяти другого.

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Кстати, это аналогично попытке прочитать локальную переменную внутри некоторой функции, которую вы вызвали, присвоив эту локальную переменную глобальной переменной, а затем прочитав глобальную переменную.

Аналогия здесьв том, что глобальная переменная действует как разделяемая переменная в многопоточности, по сути, давая доступ к тому, что должно было быть приватным потоком (например, локальная переменная, которая должна быть видима только внутри функции).

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

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

2 голосов
/ 17 ноября 2011

Это должно работать.Flush синхронизирует все общие переменные и барьер гарантирует, что среда mp со всеми потоками все еще активна.Пока вы не используете p0 в назначении p1s или наоборот, все должно быть хорошо.Хотя я не могу себе представить, почему кто-то так поступил.Может быть, вы можете рассказать больше о причинах этой конструкции.

Поскольку p0 и p1 все еще живы после параллельной области, вы можете выполнять все назначения там также без барьеров и т.

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