OpenMP并行化并从列表向量中删除

时间:2010-10-14 19:46:03

标签: c++ openmp erase stdlist

团伙。首先,对问题的高级描述&方法

我有一个列表,其中包含每个图像中的图像和像素位置 - 列表列表。我想从该图像列表中随机选择 n 项目,并为每个想要迭代 k 随机像素位置的图像。我想要并行执行此操作。对于每个已处理的像素,我希望从列表中删除它。

我的方法是在所有线程中分配图像和像素列表 - 因此每个线程都有自己的图像列表和像素位置列表,但没有两个线程同时处理同一图像。我将它们存储到矢量中。

所以让我们说代码看起来像这样:

struct MyObject
{
  // Image index on disk
  int imageIndex_;
  // List of x,y locations
  std::list< Point > pixels_;
};

std::vector< std::list < MyObject > > mainList(NUM_THREADS);

然后,mainList[0]将包含要由ID为0的线程处理的图像。 我按以下方式启动线程:#pragma omp parallel num_threads(numThreads_)然后它们都运行相同的代码片段,从线程的图像列表中随机采样图像。

问题是,当一个像素被处理并且一个线程从像素列表中删除它时,例如mainList[0].begin()->pixels_.erase(someIter),我有时得到一个断言;它跟踪到删除操作符。

我知道写入std :: list不是线程安全的,但我很确定它对于列表列表是安全的,其中主列表中的每个列表仅由一个线程访问。我知道我提供了有限的代码,但问题归结为并行删除列表(或列表向量),当每个线程一次只能访问一个列表并且列表不在线程之间共享时。

我在这里缺少什么?我可以不从并行列表的向量中删除吗?

1 个答案:

答案 0 :(得分:1)

你提供的信息太少,无法猜出真正的问题,这里有一些想法:

您似乎访问了无效的迭代器(即删除一个元素两次)。这可能是由竞争条件或代码中的错误引起的,该错误确实会多次尝试删除项目。例如 - 您确定您生成的随机数是唯一的吗?在删除每个元素后,是否将模运算符应用于生成的随机数,以确保索引有效?

我首先要检查的是运行禁用OpenMP的程序。然后,您可以决定断言是否因竞争条件或其他错误而失败。

在不相关的说明中 - 您可能希望使用std::vector代替std::list。您正在访问容器中的随机元素,std::vector已针对随机访问进行了优化。