[英]how to use openmp with a break in a while-loop
我想使用openmp加速代碼,如下所示。
代碼只是解釋操作,而不是真實的。
Iterator iterator(records);
while(iterator.next())
{
int current_id = iterator.current_row_index();
bool result = index.find(records[current_id])
if (result == false)
if (index.insert(records[current_id]) == false)
break;
}
return iterator.current_row_index();
索引由所有線程共享。
以下是我的一些想法:
但我真的懷疑加速,因為幾乎所有的操作都很關鍵。
有沒有一些建議使用openmp來加速代碼?
謝謝!
回答問題的標題並假設沒有其他問題(下面討論),一個帶有中斷迭代器的一般while循環可以這樣翻譯:
Iterator iterator(records);
#pragma omp parallel
{
#pragma omp single nowait
{
while(iterator.next())
{
int current_id = iterator.current_row_index();
#pragma omp task firstprivate(current_id)
{
if ( should_stop(current_id)) ) {
// below requires OpenMP 4.0
#pragma omp cancel parallel
}
}
}
}
}
但是,您的問題中存在更復雜的問題,實際上這些問題應該得到單獨的問題。
index
表的使用表明它不是線程安全的。 因此,您無法安全地訪問它並同時插入。 並且由於它是while循環的唯一工作,除非你切換到並發哈希表,例如在tbb , ppl , boost中提供的concurrent_unordered_map ,否則沒有意義使它並行
不清楚insert何時可以返回false以及為什么在發生時需要行的索引。 可能在切換到另一個表實現之后,根本就沒有必要。 否則,通常情況下,多個線程可以同時對您的病情進行“回答”,您必須同步它們並減少到單個結果。 最簡單的OMP方法是使用臨界區來選擇和存儲結果,否則存在向程序引入競爭條件的危險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.