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

时间:2014-09-12 09:53:56

标签: c++ multithreading while-loop openmp break

我想使用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加速代码?

谢谢!

1 个答案:

答案 0 :(得分:4)

回答问题的标题并假设没有其他问题(在下面讨论),一个突破前向迭代器的一般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循环的唯一工作,所以没有意义使它并行,除非你切换到并发哈希表,例如在例如提供的concurrent_unordered_map中。

  2. 目前还不清楚insert何时可以返回false以及为何需要行的索引。可能在切换到另一个表实现之后,根本就没有必要。否则,通常情况下,多个线程可以同时对您的病情进行“回答”,您必须同步它们并减少到单个结果。最简单的OMP方法是使用临界区来选择和存储结果,否则就有可能在程序中引入竞争条件。