【发布时间】:2013-01-18 16:30:30
【问题描述】:
我正在研究 GPU 上的动态分支粒子系统。我需要一个具有以下属性的并行数据结构:
- 一个线程必须能够在恒定时间内一个一个地删除元素。返回的元素对算法并不重要——只要 some 元素在非空时返回。为了更加精彩,请更改为任意数量的线程。
- 任何数量的线程都必须能够在恒定时间内向数据结构添加元素。请注意,允许(并且是必要的)一些锁定,但它仍然必须与线程数无关地扩展。即,更多线程不应该减慢速度。
基本的同步原语(互斥体、信号量)以及任何可以使用它们实现的东西都是可用的。
我曾玩弄过链表的想法,但这违反了条件二(因为对于 m 个线程,添加将是 O(m),因为必须考虑锁定)。我不确定这样的数据结构是否存在——但我想我会问。
【问题讨论】:
-
您需要订购元素吗?如果没有,您可以使用哈希表并在哈希级别使用互斥锁(因此只有在发生哈希冲突时才会锁定)。编辑:您可以更进一步,使用无锁哈希表,例如this one。
-
@smocking 你如何找到要从哈希表中删除的元素?我希望找到下一个非空桶会相当慢。或者你会在上面放一些数据结构吗?
-
@ErikP。在大多数实现中,您可以迭代到 O(1) 中的下一个键,但不会定义键的顺序,即它不会是您插入元素的顺序。如果需要保留插入顺序,可以使用红黑树或 B-树;对于您描述的操作,它们具有 log(N) 最坏情况复杂性,并且锁定也不会失控。
-
元素可以是无序的,remove操作可以移除任意随机元素(所以不,插入顺序不重要)。摊销哈希冲突可能是可以的。我将进一步研究 GPU 哈希表。
-
@smocking 我明白了 - 谢谢!我说的是OP的无序案例。我想您可以通过增加和缩小存储桶数组来确保您的哈希表中始终有 O(N) 条目,然后转到下一个非空存储桶来完成这项工作(至少在摊销意义上)。
标签: algorithm data-structures parallel-processing gpgpu