OpenMP并行化和从一个列表向量中删除元素

3

首先,对问题和解决方案进行高级描述。

我有一个包含图像及其每个图像中像素位置的列表 - 一个列表的列表。我想从该图像列表中随机挑选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个回答

1

您所提供的信息太少,无法猜测真正的问题,以下是一些想法:

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

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

另外一件事 - 您可能希望使用 std::vector 而不是 std::list。您正在访问容器中的随机元素,并且 std::vector 优化了随机访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接