【问题标题】:C++ - OpenMP Tasks - map insertion, critical?C++ - OpenMP 任务 - 地图插入,关键吗?
【发布时间】:2015-01-03 10:14:08
【问题描述】:

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

我正在逐行加载文件,从内容中构建一个字符串,然后不时到达一个分隔符。在这个分隔符上,我创建了一个std::mapkey/value 对,并创建了一个对这个值进行操作的任务(见下文)。这个值是一对,第一个是管家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 指令,在map.insert 上使用#pragma omp critical 是否足够?每个任务都将在一个唯一键的值上运行,所以我认为我不需要做更多的事情。

提前干杯!


@Gilad 感谢您提供指向 YouTube 英特尔 OpenMP 教程的链接,

这些是特定的相关视频 -

Introduction to tasks and examples

Discussion of tasks in linked list example

【问题讨论】:

标签: c++ concurrency task openmp std


【解决方案1】:

使用@Gilad 在 cmets 中链接的英特尔 OpenMP 教程,很明显即使在任务的父范围内没有关键重复/关键区域,分派任务也没有问题。用于该任务的最终代码如下:

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

不幸的是性能很差,我会继续试验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2022-01-18
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多