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 critical
在map.insert
?每项任务将以独特的钥匙价值运作,所以我不相信我需要做更多。
提前欢呼!
@Gilad感谢你的链接到YouTube的英特尔OpenMP的教程,
这些都是具体的相关视频 -
答
使用链接英特尔OpenMP的教程在@Gilad的评论中,很明显没有问题,假设没有关键字du就派遣任务即使在任务的父母范围内也会产生冲突/关键区域。用于该任务的最终代码沿着以下线:
#pragma omp task firstprivate(tmp), if (large tmp), untied
do_work_on_value(tmp, map[key])
表现很差,不幸的是,我会继续尝试。
请检查这个伟大的播放列表由英特尔https://www.youtube.com/playlist?list=PLLX-Q6B8xqZ8n8bwjGdzBJ25X2utwnoEG – Gilad