我可以将映射迭代器与 OpenMP 并行使用吗?



我尝试使用OpenMP的std::map<int, int>迭代器并行化循环。但是我收到以下错误消息:

error: invalid controlling predicate

我的 gcc 版本是 7.4,OpenMP 版本(也许(超过 4.0。

std::map<int, int>迭代器可以与 OpenMP 并行使用吗? 感谢!

#include <iostream>
#include <map>
#include <vector>
#include <omp.h>
using namespace std;
int main() {
map<int, int> t;
for(int i=0; i<100; i++) t[i]=i;
#pragma omp parallel for
for (map<int, int>::iterator iter = t.begin(); iter != t.end(); iter++) {
iter.operator*().second += 100;
std::cout << iter.operator*().second << std::endl;
}
std::cout << "Hello, World!" << std::endl;
return 0;
}

使用命令构建:

g++ main.cpp -o main -fopenmp

不是直接的。您只能将随机访问迭代器与 OpenMP 循环一起使用。

请注意,您收到的错误与使用!=作为关系运算符有关。从技术上讲,这是可能的,因为OpenMP 5.0,在您必须使用<,<=,>=,>之前,但是您的方法仍然无法正常工作。

只要不修改地图本身(仅修改存储的值(,就可以使用以下手动工作共享方法:

// note no "for"
#pragma omp parallel
{
ssize_t i = 0;
for (auto elem : t) {
// in practice, store the result of these functions in local variables
if (i++ % omp_get_num_threads() != omp_get_thread_num()) {
continue; // only execute loops that this thread is responsible for
}
elem.second += 100;
std::cout << elem.second << std::endl;
}
}

请注意,输出仍然可能是无序和重叠的,但这是另一个主题。

最新更新