使用OpenMP处理单链表

时间:2015-07-31 09:59:24

标签: c++ linked-list openmp

我要并行化的代码有以下简单形式:

for(const ListItem* item = myList; item; item = item->getNext())
  doSthWith(item);

我在MSVC 2013上编译,支持omp 2.0。是否有可能以干净有效的方式将其并行化?我偶然发现的第一个问题是我需要一个完整的循环计数器。我显然可以使用一个int并在循环中分配指针,但这已经开始感觉像一种肮脏的解决方法。 像这样的迭代类型是否支持我的omp标准,或者最终可能会在UB中结束?

1 个答案:

答案 0 :(得分:0)

也许不是真正的答案,但我不能在评论中格式化代码......

假设列表没有被修改,你可以写一些像这样有点不愉快的东西(在这里键入,未编译,未测试)。

#pragma omp parallel
{
    int nThreads = omp_get_num_threads();
    int me       = omp_get_thread_num();
    int itemNo   = 0;

    for(const ListItem* item = myList; 
        item; 
        (item = item->getNext()), itemNo++)
    {
        if (itemNo%nThreads == me)
        {
            doSthWith(item);
        }
    }
}