OpenMP 无法使用映射迭代器并行化 for 循环

Posted

技术标签:

【中文标题】OpenMP 无法使用映射迭代器并行化 for 循环【英文标题】:OpenMP can't parallelize for loop with map iterator 【发布时间】:2022-01-18 07:01:35 【问题描述】:

代码如下。

int main()

    map<int,int> a;
    for (int i = 0; i < 6; i++)
    
        a.insert(make_pair(i, i+1));
    
    
    map<int,int>::iterator it;
#pragma omp parallel for default(none) shared(a)
    for (it = a.begin(); it != a.end(); it++)
    
        printf("the first is %d\n", it->first);
    
    return 0;

代码编译失败。但是我可以使用向量迭代器,代码如下:

    int main()
    
            vector<int> vec(23,1);
            vector<int>::iterator it;
            // map<int,int>::iterator it;
#pragma omp parallel for default(none) shared(vec)
            for (it = vec.begin(); it < vec.end(); it++)
            
                printf("the number is %d\n", *it);
            
        return 0;
    

向量迭代器可以正常工作。我怎样才能像使用向量迭代器一样直接将for循环与map迭代器并行化?最新的 OpenMP 版本 (5.2) 已发布,OpenMP website。我可以通过最新的 OpenMP API 做到这一点吗?

【问题讨论】:

能否包含编译器错误? 为什么不将地图迭代器存储在向量中,然后循环使用呢? 【参考方案1】:

std::map 的迭代器不是 random-access-iterator,因此它不能用作 OpenMP 并行 for 循环中的控制变量。 std::vector 的迭代器是随机访问迭代器,所以可以使用。

随机访问是必要的,以便 OpenMP 运行时可以将每个线程的循环计数器快速推进到其正确的初始值(以及稍后将为该线程计算的迭代值)。

【讨论】:

我编译了这两个版本,但没有一个是并行的。 如上所述:请包含实际的错误信息。 std::vector 循环应该可以很好地并行化。

以上是关于OpenMP 无法使用映射迭代器并行化 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

使用 openMP v. 2.0 并行化过滤器迭代器

OpenMP指定for循环迭代的线程号

非for循环的OpenMP并行化

哪个库用于迭代 1M*1k 次的并行 for 循环,OpenMP 或 boost::thread?

系统地并行化 fortran 2008 `do concurrent`,可能使用 openmp

为什么OpenMP没有并行化vtk IntersectWithLine代码