2013-11-06 9 views
0

У меня есть кусок кода в следующем стиле:Вложенный цикл OpenMP

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... 
    } 

} 

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

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

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

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

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

благодарит заранее.

ответ

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

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

#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... 
      } 
     } 
    } 
0

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

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

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

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

Смежные вопросы