我尝试使用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;
}
}
请注意,输出仍然可能是无序和重叠的,但这是另一个主题。