使用OpenMP处理单链表



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

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

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

也许不是真正的答案,但我不能在注释中格式化代码…

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

#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);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新