C++ - OpenMP任务 - 地图插入,关键?

问题描述:

我需要一些帮助来理解下面描述的代码的关键部分,特别是我如何使用std::map是线程安全的。C++ - OpenMP任务 - 地图插入,关键?

我一行一行地加载一个文件,从内容中构建一个字符串,然后每隔一段时间到达一个分隔符。在此分隔符上,我创建一个std::map键/值对,并创建一个任务以对此值进行操作(请参见下文)。这个值是一对,第一个是管家int,第二个是uint64_t的矢量。

#pragma omp parallel num_threads(4) 
#pragma omp single 
{ 
    while (getline(fin, line) && ...) 
    { 
     if (line[0] == '>') 
     { 
      #pragma omp task 
      do_work_on_value(tmp, map[key]) 

      tmp.clear(); 

      // insert map entry (new key!) 
      map.insert(...); 
     } 
     else 
      tmp += line; 
    } 
} 

... 

static void do_work_on_value(string vals, pair<int, vector<uint64_t>> &val) 
{ 
    ... 
} 

所以,关键的操作是:

  • 添加新的键/值对,而在不同的值
  • 上的值的矢量(push_back和一些算术/按位上的工作运行内容)

我使用this answer了解了一些OpenMP指令,是否足够使用#pragma omp criticalmap.insert?每项任务将以独特的钥匙价值运作,所以我不相信我需要做更多。

提前欢呼!


@Gilad感谢你的链接到YouTube的英特尔OpenMP的教程,

这些都是具体的相关视频 -

Introduction to tasks and examples

Discussion of tasks in linked list example

+1

请检查这个伟大的播放列表由英特尔https://www.youtube.com/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG – Gilad

使用链接英特尔OpenMP的教程在@Gilad的评论中,很明显没有问题,假设没有关键字du就派遣任务即使在任务的父母范围内也会产生冲突/关键区域。用于该任务的最终代码沿着以下线:

#pragma omp task firstprivate(tmp), if (large tmp), untied 
do_work_on_value(tmp, map[key]) 

表现很差,不幸的是,我会继续尝试。