簡體   English   中英

如何在while循環中使用openmp和break

[英]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();

索引由所有線程共享。

以下是我的一些想法:

  • 使用omp parallel指令,確保線程按順序運行。
  • 使用omp critical指令來操作迭代器。
  • 使用omp critical指令在索引中查找並插入索引。

但我真的懷疑加速,因為幾乎所有的操作都很關鍵。

有沒有一些建議使用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
                }
            }
        }
    }
}

但是,您的問題中存在更復雜的問題,實際上這些問題應該得到單獨的問題。

  1. index表的使用表明它不是線程安全的。 因此,您無法安全地訪問它並同時插入。 並且由於它是while循環的唯一工作,除非你切換到並發哈希表,例如在提供的 ,否則沒有意義使它並行

  2. 不清楚insert何時可以返回false以及為什么在發生時需要行的索引。 可能在切換到另一個表實現之后,根本就沒有必要。 否則,通常情況下,多個線程可以同時對您的病情進行“回答”,您必須同步它們並減少到單個結果。 最簡單的OMP方法是使用臨界區來選擇和存儲結果,否則存在向程序引入競爭條件的危險。

暫無
暫無

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

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