簡體   English   中英

OpenMP不支持中斷循環

[英]OpenMP not supporting break in loop

我正在使用OpenMP優化一些代碼。 如果在循環中滿足NO_VALUE ,我希望它能夠破解。 但是,編譯器告訴我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_;
            }
 }

我該怎么辦? 謝謝!

Qt沒有問題。
你不能在使用openMP並行化的循環中休息。

這背后的推理:假設你有一個包含10次迭代的循環。 現在,你想在迭代5中打破循環。你說,

if (iteration==5) 
    break;

現在進入並行上下文,您已經創建了10個線程,並且每個線程並行執行各自的迭代。 因此,當thread5達到某個條件時,您需要所有其他線程

  1. 確定這個
  2. 撤消他們的輸出
  3. 不再處理迭代
  4. 動態地執行此操作以及所有不同的調度策略。

正如您所看到的,在大多數情況下這是不可能/不實用的。 因此,OpenMP不允許在並行for循環中使用break。

現在,假設您知道在您的循環中某種破壞條件是非常罕見的,並且您很可能會在並行循環中中斷。

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

openmp不支持break in for子句。

我將此作為正確的答案添加; 想一想:你得到一個有條件停止的循環,例如: for(int a=0; a<10; a++) ...

如果,在循環中,你只需將a設置為9,並執行一個continue語句,它將隱式地打破循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM