2012-04-17 2 views
4

Я оптимизирую код с OpenMP. Если NO_VALUE встречается в цикле, я бы хотел его сломать. Однако компилятор говорит мне, что это запрещено с помощью openMP. Как я могу справиться с этим?OpenMP не поддерживает перерыв в петле

#pragma omp parallel 
{ 
    #pragma omp for reduction(+:functionEvaluation) schedule(dynamic) nowait 
    for (int j=m_colStart;j<m_colEnd+1;j++) 
      { 
       double d = command_->execute().toDouble(); 
       if(d==NO_VALUE) 
       { 
        functionEvaluation = NO_VALUE; 
                break; 
       } 
       else 
       { 
        functionEvaluation += d; 
       } 
       delete command_; 
      } 
} 

Как я мог работать? благодаря!

ответ

9

Нет проблем с Qt.
вы не можете иметь разрыв в цикле, который был распараллелен с помощью openMP.

Рассуждение за этим: Допустим, у вас есть петля с 10 итерациями. Теперь вы хотите, чтобы разорвать петлю на итерации 5. Вы говорите,

if (iteration==5) 
    break; 

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

  1. определить это
  2. отменить свой выход
  3. Не обрабатывать больше итераций
  4. сделать это динамически и для всех различных политик планирования.

как вы можете видеть, это невозможно/практически в большинстве случаев. Следовательно, OpenMP запретил использовать разрыв в параллельном цикле.

Теперь скажите, что вы знаете, что определенное условие для взлома очень редко встречается в вашей петле, и вы чертовски настроены на разрыв в вашем параллельном цикле.

Thread i 
Check input condition 
If input leads to breaking flag a marker break_loop 
******** barrier across all threads ************* 
if flag break_loop is true 
then 
    discontinue this operation 
    mark a variable 
    discontinue all the remaining iterations 
endif 
do your normal work 

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

+0

Nice описание. –

+1

, если он решает ваш вопрос, вы можете принять его :) –

+0

Я написал это неправильно Qt для openMP (название довольно явно) – octoback

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