VS2017中嵌套循环的OMP

时间:2018-04-08 00:23:59

标签: c++ multithreading parallel-processing openmp nested-loops

我是 OpenMP 2.0 以及 MSVC ++ 2017 的新手。我正在使用大数据结构(引用为 bigMap ),因此我需要以最佳方式迭代时分配工作负载。我这样做的尝试是:

std::map<int, std::set<std::pair<double, double>>> bigMap;
///thousands of values are added here

int k;
int max_threads = omp_get_max_threads();
omp_set_num_threads(max_threads);
#pragma omp parallel default(none) private(k)
{
  #pragma omp for
  for(k = kMax; k > kMin; k--)
  {
    for (auto& myPair : bigMap[k])
    {
      int pthread = omp_get_thread_num();
      std::cout << "Thread " << pthread << std::endl;
      for (auto& item : myPair)
      {
         #pragma omp critical
         myMap[k-1].insert(std::make_pair(item, 0));
       }
    }
}

“pthread”的输出始终为“0”,执行时间与单线程相同(因此我假设没有创建新线程)。 为什么此代码不起作用以及 OMP 指令 / 子句 / 部分 是错误的?

更新

OMP现在正在运行,但下面的代码没有按预期工作:

#pragma omp parallel for schedule(static,1)
for (int i = 0; i < map_size; ++i) {
    #pragma omp critical
    bigMap[i] = std::set<int>();
}
bigMap[1] = { 10, 100, 1000 };

int i;
#pragma omp parallel for schedule(static) num_threads(8)
for (i = thread_num; i < map_size; i += thread_count)
{
    for (auto it = bigMap[i].begin(); it != bigMap[i].end(); ++it)
    {
        int elem = *it;
        bigMap[i + 1].insert(elem);
    }
}

我希望bigMap [1]中的3个元素插入bigMap的所有条目,相反,它们只插入一次,对于bigMap [2],为什么??

1 个答案:

答案 0 :(得分:0)

小虫......

#pragma omp parallel for schedule(static,1)
for (int i = 0; i < map_size; ++i) {
    #pragma omp critical
    bigMap[i] = std::set<int>();
}
bigMap[1] = { 10, 100, 1000 };

int i;
#pragma omp parallel for schedule(static) num_threads(8)
for (i = thread_num; i < map_size; i += thread_count)
{
    //here you loop on bigMap[i] which is empty execpt for i==1.
    //for (auto it = bigMap[i].begin(); it != bigMap[i].end(); ++it)
    for (auto it = bigMap[1].begin(); it != bigMap[1].end(); ++it)
    {
        int elem = *it;
        bigMap[i + 1].insert(elem);
    }
}

也许你错过了静态意味着什么。