Multithreading 如何减少图遍历算法(如DFS和BFS)上的缓存未命中?

Multithreading 如何减少图遍历算法(如DFS和BFS)上的缓存未命中?,multithreading,performance,algorithm,caching,memory-management,Multithreading,Performance,Algorithm,Caching,Memory Management,我想知道如何修改基本的BFS和DFS算法,以便在顺序或并行实现它们时产生更少的缓存未命中 我了解到,顶点(或)节点的排序可以在一定程度上帮助减少缓存未命中率,但我无法确切理解像RCM(Reverse Cutchill–McKee)这样的排序算法如何帮助减少基本Intel体系结构(例如具有专用L1、L2和共享L3的多核)上的缓存未命中率 除了对顶点排序之外,还有其他方法可以减少缓存未命中吗?我的观点是,重新排序可以帮助,但不能保证做到这一点。让我们以下面的结构为例,其中每一行上都有节点的邻居 No

我想知道如何修改基本的BFS和DFS算法,以便在顺序或并行实现它们时产生更少的缓存未命中

我了解到,顶点(或)节点的排序可以在一定程度上帮助减少缓存未命中率,但我无法确切理解像RCM(Reverse Cutchill–McKee)这样的排序算法如何帮助减少基本Intel体系结构(例如具有专用L1、L2和共享L3的多核)上的缓存未命中率


除了对顶点排序之外,还有其他方法可以减少缓存未命中吗?

我的观点是,重新排序可以帮助,但不能保证做到这一点。让我们以下面的结构为例,其中每一行上都有节点的邻居

Node 1: 4, 5, 37, 12, 11, 2, 3
Node 2: 67, 11, 33, 45
Node 3:
......
Node N: 65, 56, 99, 44, 32, 1, 3
例如,当您执行DFS时,您位于节点1。当您找到节点37时,您需要跳转到节点37,但是节点2在内存中可能更近,因此被缓存的可能性更高。因此,对顶点进行排序可以减少内存中的跳转步骤,从而减少缓存未命中

然而,我认为排序可以做得更聪明一些。例如,当您为节点(比如100)排序顶点时,节点1、2、3距离较远,因此您可能有兴趣将距离节点100较近的相邻节点放在第一位。因此基本上,根据与目标节点的距离对节点进行排序

这些技术可能有助于非常大的图,但在很大程度上取决于图的拓扑结构

为了提出一种图形结构,我想这样做:

我将使用2 x 1D阵列:

  • 一个用于存储每个节点的所有邻居
  • 每个节点存储一个索引,索引位于其邻居开始的第一个数组中
示例:

Neighbors: 1 2 3 4 2 4 5 6 7 9 0
Neighbor Indexes: 0 2 5 7 9

The neighbors of Node 0 will start from Neighbors[Neighbor Indexes[0]] until Neighbors[Neighbor Indexes[1]].
The neighbors of Node 1 will start from Neighbors[Neighbor Indexes[1]] until Neighbors[Neighbor Indexes[2]].

等等。

谢谢@VAndrei的回复。我知道订购会有什么帮助。1.我有一个疑问。假设我使用了一个数组a[100],node0将在[0]中,node1将在[1]中,依此类推。当我需要获取节点50的属性时,我将转到[50]。但现在由于订购,情况不再如此。我需要想办法弄清楚我的地点在[]的什么地方。我该怎么做(举个例子)?它在搜索节点时不会添加一个overhead!2.除了订购之外,还有其他优化方法吗?与使用最佳数据结构类似,如何存储每个节点(结构)、邻接列表等的属性@Shyam我认为您不需要对节点重新排序,但对于每个节点,请根据与目标节点的距离对顶点重新排序。请参阅我更新的文章,了解结构建议。“对于每个节点,根据与目标节点的距离重新排列顶点”-我很抱歉。我真的不明白你的意思。是否要根据与目标节点的距离对每个节点的邻接列表重新排序?在本例中,“邻居”是每个节点的邻接列表?请你再解释一下,对于节点[]和边[]的给定图,“邻居”和“邻居索引”代表什么。是的,邻居是每个节点的邻接列表。邻居索引[K]是节点K的邻居列表开始的邻居数组中的索引。排序时,需要对每个节点的邻接列表进行排序。因此,当您访问节点1000时,您希望首先访问相邻节点999、998,因为在保持图形的结构中,它们更接近,因此被缓存。如果您使用arraylist数组(基本上是指针数组),那么您的结构将在内存中被分段,从而降低缓存效率。我推荐我的解决方案,因为这样,图形结构在内存中是一个连续的块,缓存将更加有效,