Вложенная открытая петля

0

У меня есть код в следующем стиле:

for (set=0; set < n; set++)  //For1
{
   #pragma omp parallel for num_threads(x)
    for (i=0; i < m; i++)   //For2: this loop can be executed in parallel
   {
      commands...
   }

   for (j=0; j < m; j++)   //For3: this loop depends on the output of the For2 and also should be executed in a sequential way
   {
     commands...
   }

}

Как вы заметили, у меня есть n независимых наборов (внешний цикл, т.е. For1). Каждый набор состоит из параллельного цикла (For2) и последовательного раздела (For3), который должен выполняться после For2.

Я уже использовал "#pragma omp parallel для num_threads (x)" для For2, чтобы сделать его параллельным.

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

Я очень признателен, если вы можете сообщить мне, как это возможно в openmp.

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

заранее спасибо.

Теги:
parallel-processing
openmp

3 ответа

1

Вы могли бы просто параллельно внешнему циклу

#pragma omp parallel for num_threads(x) private(i,j)
for (set=0; set < n; set++)  //For1
{
    for (i=0; i < m; i++)   //For2: this loop can be executed in parallel
   {
      commands...
   }

   for (j=0; j < m; j++)   //For3: this loop depends on the output of the For2 and also should be executed in a sequential way
   {
     commands...
   }

}
0

Для вас может быть оптимальным вариантом параллельного внешнего цикла, в зависимости от количества установленных вами наборов. Если на вашем компьютере больше, чем количество ядер, то это может быть быстрее, чем распараллеливание внутреннего цикла, поскольку в этом случае накладные расходы намного меньше.

Предполагая, что ваши операции связаны cpu, при параллельном внешнем цикле вы полностью используете все ядра на своем компьютере. Дальнейшая попытка распараллеливать внутренний цикл будет не быстрее, если все используемые ресурсы уже используются.

В случае, когда у вас меньше наборов, чем доступных ядер, распараллелите внутренний цикл, и вы, скорее всего, уже потребляете всю доступную вычислительную мощность.

Если вы действительно хотите распараллелить оба цикла, вам следует рассмотреть MPI и выполнить гибридную распараллеливание на нескольких компьютерах; внешний цикл, параллельный на нескольких компьютерах, и внутренний цикл, распараллеленный по всем ядрам одного компьютера.

0

Вы можете попробовать слить первый и второй контуры (см. Ниже). Я не знаю, поможет ли это, но стоит попробовать.

    #pragma omp parallel num_threads(x) private(set, i)
    {
        #pragma omp for schedule(static)
        for (k = 0; k < n*m; k++) //fused For1 and For2
        {
            set = k/m;
            i = k%m;
            //commands...
        }
        #pragma omp for schedule(static)
        for (set = 0; set < n; set++)
        {
            for (i = 0; i < m; i++) //For3 - j is not necessary so reuse i 
            {
                //commands...
            }
        }
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню