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

时间:2015-01-03 10:14:09

标签: c++ concurrency task openmp std

我需要一些帮助来理解下面描述的代码的关键部分,特别是我如何使用std::map是线程安全的。

我逐行加载文件,从内容构建一个字符串,然后不时地到达分隔符。在此分隔符上,我创建了一个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 critical上使用map.insert就足够了吗?每个任务都将按照唯一键的值运行,因此我不认为我需要做更多的事情。

提前干杯!


@Gilad感谢您链接到YouTube英特尔OpenMP教程

这些是特定的相关视频 -

Introduction to tasks and examples

Discussion of tasks in linked list example

1 个答案:

答案 0 :(得分:0)

使用@Gilad在评论中链接的英特尔OpenMP教程,很明显,即使在任务的父作用域中,假设没有关键重复/关键区域也没有调度任务的问题。用于该任务的最终代码如下:

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

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