|
|
1
6
问题是共享数据本身就是并行计算的祸根。理想情况下,您希望每个核心处理单独的数据,否则将有与同步相关的开销。(如何在没有共享状态的情况下进行通信?通过消息传递。) 此外,谈论数据结构正在加速也有点奇怪。我发现更自然地谈论正在加速的数据结构上的操作,因为不同数据结构上的不同操作具有不同的特征。您是否希望加快特定类型的访问速度? 编辑,作为对额外细节的回应:我假设目标是拥有一个可以并行访问的单个散列映射,其基础可以是多个散列表,但它将作为单个散列表透明地呈现给此数据结构的用户。当然,我们会担心在锁上花太多时间旋转。在这个级别上,我们还必须注意缓存一致性问题。也就是说,如果内核或处理器具有指向相同数据的单独缓存,并且其中一个修改了数据,那么另一个上的缓存数据将无效。如果这种情况反复发生,可能会带来巨大的成本,并行性可能比在单个内核上运行更糟糕。所以我对共享数据非常谨慎。 我的直觉是拥有一个线程池,每个线程都拥有哈希表的不同部分。散列将首先从键映射到散列表部分,然后映射到该部分内的偏移量。更新将作为消息传递给拥有该哈希表部分的线程。这样,就没有人试图同时修改同一个东西。自然,这在具有异步消息传递并发特性的语言(Erlang)中比在其他语言中更容易实现。 |
|
|
2
3
我每天都在处理这个问题。我发现像链表这样的东西真的很有用,因为你可以让你的并行算法的每一个线程构造自己的链表,然后在你完成的时候把它们缝合在一起。只要线程真正独立,几乎没有开销 如果每个线程都有数据数组要使用,我发现为每个线程分配一个较小的数组来处理几乎总是更好的,然后在完成后将小数组合并回主数组-事实上,如果您在集群环境中,甚至不可能使用“同一”数组!
如果您正在为CUDA(GPU)环境编写代码,您将很快了解到,整个世界可以(不,应该!)在操作之前重新构建为一个数组:) |
|
|
3
3
首先,我认为比较不合适
不过,您是对的,同步时间是瓶颈,而且越来越糟糕,因为它们必须转到CPU间总线/网桥/通道,而大多数其他数据结构都试图留在缓存中(甚至在卷影寄存器中)。 解决此问题有两个主要方向:
我很惊讶没有人对无锁结构有任何意见。检查 this (pdf)及 this (视频)关于Java中的无锁哈希表实现,它可以(几乎)线性扩展到300个CPU |
|
|
4
1
我认为您需要查看数据结构并询问“这其中有什么可以异步完成?” 对于很多数据结构,我所看到的几乎没有。 但对于一些更为深奥或使用较少的结构,我敢打赌是有的。我打赌重新平衡某些种类的树木是可以并行的。我打赌遍历图可能是(尽管这可能是算法多于数据结构)。我敢打赌,遍历双链接列表(从每一端)可能会很困难。 |
|
|
5
1
我不相信在一次查找中有太多的并行性。但是,如果您要查找整个项目列表,则情况就不同了。
或者选择一大串要插入的项目。将哈希表划分为每个CPU区域,并划分键列表。然后,每个CPU可以将项目填充到自己的哈希表中。 这也适用于向量、B+树和二叉树,尽管我相信哈希表可以构造为需要稍微少一点的更新锁定。 |
|
|
6
1
|
|
|
7
0
需要考虑的是,每个数据结构都有一个(或一个小的池)线程,并将访问视为“服务”。也就是说,它不会让线程在哈希映射中查找某些内容,而是向为该数据结构提供服务的线程发出同步请求。这将锁定操作本地化(只有为请求提供服务的线程必须知道锁定技术),但可能会使请求队列成为瓶颈。 我认为,正如其他人所说,利用并行性的最佳方法是通过您的算法,而不是数据结构。 |
|
|
8
0
|
|
|
Rishab · 在并行Java中运行函数 2 年前 |
|
|
Deep · 当您并行化代码时,如何保存两个独立的CSV? 2 年前 |
|
|
Setu · MPI代码的哪些部分是复制的,哪些是共享的? 2 年前 |
|
|
heyula · 如何在mpi中定义本地数组? 2 年前 |
|
|
Rebel · 如何以最有效的方式加速和并行化以下matlab代码? 3 年前 |