【问题标题】:Data Structure Parallel Add Serial Remove Needed需要数据结构并行添加串行删除
【发布时间】:2013-01-18 16:30:30
【问题描述】:

我正在研究 GPU 上的动态分支粒子系统。我需要一个具有以下属性的并行数据结构:

  1. 一个线程必须能够在恒定时间内一个一个地删除元素。返回的元素对算法并不重要——只要 some 元素在非空时返回。为了更加精彩,请更改为任意数量的线程。
  2. 任何数量的线程都必须能够在恒定时间内向数据结构添加元素。请注意,允许(并且是必要的)一些锁定,但它仍然必须与线程数无关地扩展。即,更多线程不应该减慢速度。

基本的同步原语(互斥体、信号量)以及任何可以使用它们实现的东西都是可用的。

我曾玩弄过链表的想法,但这违反了条件二(因为对于 m 个线程,添加将是 O(m),因为必须考虑锁定)。我不确定这样的数据结构是否存在——但我想我会问。

【问题讨论】:

  • 您需要订购元素吗?如果没有,您可以使用哈希表并在哈希级别使用互斥锁(因此只有在发生哈希冲突时才会锁定)。编辑:您可以更进一步,使用无锁哈希表,例如this one
  • @smocking 你如何找到要从哈希表中删除的元素?我希望找到下一个非空桶会相当慢。或者你会在上面放一些数据结构吗?
  • @ErikP。在大多数实现中,您可以迭代到 O(1) 中的下一个键,但不会定义键的顺序,即它不会是您插入元素的顺序。如果需要保留插入顺序,可以使用红黑树或 B-树;对于您描述的操作,它们具有 log(N) 最坏情况复杂性,并且锁定也不会失控。
  • 元素可以是无序的,remove操作可以移除任意随机元素(所以不,插入顺序不重要)。摊销哈希冲突可能是可以的。我将进一步研究 GPU 哈希表。
  • @smocking 我明白了 - 谢谢!我说的是OP的无序案例。我想您可以通过增加和缩小存储桶数组来确保您的哈希表中始终有 O(N) 条目,然后转到下一个非空存储桶来完成这项工作(至少在摊销意义上)。

标签: algorithm data-structures parallel-processing gpgpu


【解决方案1】:

如果不知道您希望如何组织数据(排序?先进先出?后进先出?)我是。或者确定我是否可以给你一个确切的答案。但是,您所描述的听起来像是无锁结构的定义。存在堆栈和队列的无锁实现,即使有很多线程同时修改结构,它们也支持 O(1) 插入和删除。它们通常基于原子测试和设置操作。

如果锁没问题,并且您只想要一个高度并发的排序数据结构,请考虑查看并发跳过列表,它提供 O(log n) 排序的插入和删除以及多个活动线程。

希望这会有所帮助!

【讨论】:

  • 澄清一下:插入/删除顺序是无关紧要的(事实上,它更像是一个“集合”,而不是任何命令)。上面 cmets 中提到的哈希表呢?理想的算法应该有 O(n) 空间和 O(1) 插入和删除——即使 m 个线程正在读取和写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多