gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:39 24 4
gpt4 key购买 nike

我需要一些帮助来理解下面描述的代码的关键部分,特别是我使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com