我需要一些帮助来理解下面描述的代码的关键部分,特别是我如何使用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教程
这些是特定的相关视频 -
答案 0 :(得分:0)
使用@Gilad在评论中链接的英特尔OpenMP教程,很明显,即使在任务的父作用域中,假设没有关键重复/关键区域也没有调度任务的问题。用于该任务的最终代码如下:
#pragma omp task firstprivate(tmp), if (large tmp), untied
do_work_on_value(tmp, map[key])
不幸的是,表现很糟糕,我会继续尝试。