[英]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達到某個條件時,您需要所有其他線程
正如您所看到的,在大多數情況下這是不可能/不實用的。 因此,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.