[英]OpenMP can't parallelize for loop with map iterator
代碼如下。
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;
}
向量迭代器可以正常工作。我怎樣才能像使用向量迭代器一樣直接使用 map 迭代器並行化 for 循環? 最新的 OpenMP 版本(5.2)已經發布, OpenMP 網站。 我可以通過最新的 OpenMP API 做到這一點嗎?
std::map
的迭代器不是random-access-iterator ,因此它不能用作 OpenMP 並行 for 循環中的控制變量。 std::vector
的迭代器是隨機訪問迭代器,因此可以使用。
隨機訪問是必要的,以便 OpenMP 運行時可以將每個線程的循環計數器快速推進到其正確的初始值(以及稍后將為該線程計算的迭代值)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.