gpt4 book ai didi

c++ - 从 OpenMP 循环内部访问和编辑 aN ma 时出错

转载 作者:行者123 更新时间:2023-11-28 04:20:42 25 4
gpt4 key购买 nike

我正在用 c++ 中的 openmp 做一个循环,以从 QVector 向 QMAP 中提供一些值,在某些计算机中它说“程序停止工作”,但在某些计算机中它可以工作。

我看到 Qmap 不是线程安全的,但是我需要一个带有标签的容器(因为我使用 Qmap)来输入内部计算的结果并稍后在代码的串行部分中使用它。

我的代码示例如下: Being mystringlist一个QString , themapsQMap<QString, QMap<int, QVector<float>>>myvector一个QVector<float> .

#pragma omp parallel for  schedule(static) num_threads(std::thread::hardware_concurrency())
for (int i = 0; i < numb_of_iter; i++)
{
for each (auto var in mystringlist)
{
for (int j = 0; j < 33; j++)
{
themaps[var][i] << std::log10(j+1) + myvector[i];
}
}
}

在串行模式下,这段代码可以工作,但在并行 block 中有时会崩溃。所以我的想法是,如果有一种方法允许所有线程访问这个变量 themaps 这样它就不会崩溃,因为它们不会尝试写入相同的内存空间,每个线程都有自己的 i所以他们应该能够做到这一点。我不知道这样做的另一种选择,因为我需要使用这个变量 themaps稍后在代码上。

最佳答案

明智的解决方案:通过 mutex 保护您的共享变量.当然,您为此付出了性能代价,只有在计算新值比插入数据结构花费的时间长得多的情况下,这是可以接受的。

大胆的解决方案:预分配所有字段,这样数据结构就不会因为插入而改变。

您需要考虑两种影响:

  1. 如果您访问一个不存在的 QMap 键,将创建一个新字段。 map 将分离。这将更改内部数据布局。
  2. 如果您使用非常量方法访问 map ,如果您有多个对 map 的引用(Qt 的写时复制习惯用法), map 也会分离。

对于 QVector,使用 QVector::resize(n) 很简单。在此之后,您可以在 [0..n-1] 范围内设置任何字段值,只要没有其他人同时读取或写入该字段即可。

QMap 是一个不同的野兽。尽可能避免。
(提示:只有迭代器保证不返回项目的拷贝。)

关于c++ - 从 OpenMP 循环内部访问和编辑 aN ma 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55504260/

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