OpenMP темы "Disobey" omp барьер - PullRequest
       4

OpenMP темы "Disobey" omp барьер

3 голосов
/ 23 января 2011

Итак, вот код:

#pragma omp parallel private (myId)
{
  set_affinity();

  myId = omp_get_thread_num(); 

  if (myId<myConstant)
  {
    #pragma omp for schedule(static,1)
    for(count = 0; count < AnotherConstant; count++)
      {
        //Do stuff, everything runs as it should
      }
  }

#pragma omp barrier //all threads wait as they should
#pragma omp single
 {
    //everything in here is executed by one thread as it should be
 }
   #pragma omp barrier //this is the barrier in which threads run ahead
   par_time(cc_time_tot, phi_time_tot, psi_time_tot);
   #pragma omp barrier
}
//do more stuff

Теперь объясним, что происходит.В начале моей параллельной области myId установлен в private, так что каждый поток имеет свой правильный идентификатор потока.set_affinity () контролирует, какой поток работает на каком ядре.Проблема, с которой я сталкиваюсь, связана с #pragma omp для расписания (static, 1).

блок:

  if (myId<myConstant)
  {
    #pragma omp for schedule(static,1)
    for(count = 0; count < AnotherConstant; count++)
      {
        //Do stuff, everything runs as it should
      }
  }

Представляет некоторую работу, которую я хочу распределить по определенному количеству потоков, от 0 до myConstant-1.В этих потоках я хочу равномерно (в соответствии с графиком (static, 1)) распределить итерации цикла.Это все выполняется правильно.

Затем код входит в одну область, все команды там выполняются в порядке.Но, скажем, я указываю myConstant равным 2. Тогда, если я запускаю с 3 потоками или более, все в одном материале выполняется правильно, но потоки с идентификатором 3 или выше не ожидают завершения всех команд в одном.

В пределах одного вызывается несколько функций, которые создают задачи, которые выполняются всеми потоками.Потоки с идентификатором 3 или более (обычно myConstant или более) продолжаются, выполняя par_time (), в то время как другие потоки все еще выполняют задачи, созданные функциями, выполняемыми в сингле.par_time () просто печатает некоторые данные для каждого потока.

Если я закомментирую прагму omp для расписания (static, 1) и просто заставлю один поток выполнить цикл for (например, сменим оператор if на if (myId == 0)), тогда все будет работать.Так что я просто не уверен, почему вышеупомянутые темы продолжаются.

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

1 Ответ

7 голосов
/ 23 января 2011

Если вы посмотрите на спецификацию OpenMP V3.0, раздел 2.5 Конструкции рабочего разделения, состояния:

Следующие ограничения применяются к конструкциям совместного использования:

  • Каждый регион совместного использованиядолжен встречаться всеми потоками в команде или вообще ни одним из них.
  • Последовательность обнаруженных областей разделения и барьерных областей должна быть одинаковой для всех потоков в команде.

Имея разделение рабочих мест в рамках if, вы нарушили оба эти ограничения, сделав вашу программу несоответствующей.Несоответствующая OpenMP-программа имеет «неопределенное» поведение в соответствии со спецификацией.

Относительно того, какие потоки будут использоваться для выполнения цикла for, с типом расписания «static, 1», первый чанкРабота - в этом случае count = 0 - будет назначена потоку 0. Следующий блок (count = 1) будет назначен потоку 1 и т. д., пока не будут назначены все фрагменты.Если чанков больше, чем потоков, то назначение будет возобновлено в потоке 0 циклическим образом.Точную формулировку можно прочитать в спецификации OpenMP, раздел 2.5.1 Конструкция цикла, под описанием, где говорится о предложении расписания.

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