2015-10-14 44 views
1

我有一個理論上的OpenMP問題給大家。 想象我做到以下幾點:使用任務分割使用OpenMP的動態變化鏈表

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
    while (!empty(linkedList)) { 
     #pragma omp task 
       doWork(); 
     } 
    } 
} 

如果的doWork()將元素放回列表中會發生什麼? 我擔心的是,在完成任務的線程完成之前,正在執行任務的單線程將終止。這可能意味着任何被doWork函數添加回列表的元素都會被忽略。有人知道這是如何工作的嗎?

謝謝!

回答

0

只需將生成器循環嵌入另一個循環,並在中間使用taskwait以確保所有任務已完成執行。您還必須確保鏈接列表在代碼的併發部分正確鎖定,例如通過使用關鍵部分(如下所示)或更細粒度的鎖。

doWork(element e) 
{ 
    // ... 
    #pragma omp critical(listOps) 
    insertElement(linkedList, newElement); 
    // ... 
} 

#pragma omp parallel 
{ 
    #pragma omp single 
    { 
     do 
     { 
     #pragma omp critical(listOps) 
     while (!empty(linkedList)) { 
      element e = removeElement(linkedList); 
      #pragma omp task 
      doWork(e); 
     } 
     #pragma omp taskwait 
     } while (!empty(linkedList)); 
    } 
}