C++ - OpenMP 任务 - map 插入,关键吗?

标签 c++ concurrency task openmp std

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

我正在逐行加载一个文件,从内容中构建一个字符串,并且时不时地到达一个分隔符。在这个分隔符上,我创建了一个 std::map 键/值对,并创建了一个任务来操作这个值(见下文)。这个值是一对,第一个是管家 int,第二个是 uint64_t 的 vector 。

#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)
{
    ...
}

因此,关键操作是:

  • 添加新的键/值对,同时操作不同的值
  • 处理值的 vector (push_back 和内容的一些算术/按位)

我使用 this answer 了解了一些 OpenMP 指令,在 map.insert 上使用 #pragma omp critical 是否足够?每个任务都将根据唯一键的值进行操作,因此我认为我不需要做更多的事情。

提前干杯!


@Gilad 感谢您链接到 YouTube Intel OpenMP 教程,

这些是特定的相关视频 -

Introduction to tasks and examples

Discussion of tasks in linked list example

最佳答案

使用@Gilad 评论中链接的英特尔 OpenMP 教程,很明显即使在任务的父范围内,假设没有键重复项/关键区域,也可以毫无问题地分派(dispatch)任务。用于该任务的最终代码如下:

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

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

关于C++ - OpenMP 任务 - map 插入,关键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27753756/

相关文章:

c# - ICommand Execute() 任务.ContinueWith()

c# - xamarin 表单中的异步 Task<T> 问题

c++ - QRCode中的Zxing汉字字符

c++ - 确定小数点右边的非零位数

java - 有选择地实现同步以促进最大并发性

java - Spring @Async 和同步

java - 该代码适用于notifyAll,但不适用于notify

c# - 使用 c# 的 Thread 和 Task 之间的性能比较

C++ 将包含对象的 vector 转换为包含 double 的 vector

c++ - 我可以使用按位运算符而不是逻辑运算符吗?