【问题标题】:How to store graphs in order to maximize locality for graph-reduction algorithms?如何存储图形以最大化图形缩减算法的局部性?
【发布时间】:2015-11-04 11:50:00
【问题描述】:

我正在实现基于图形缩减规则的算法。 This video 比文字更好地解释了算法,但是,为了完整起见,这里有一个快速总结:

该算法在一个图中运行,其中每个节点都有 3 条边,其中一条是“主”边。当主边相交时,一个节点被认为是活动的,并且应用了缩减规则。还值得注意的是,当两个节点交互时,很可能另一个非常接近它们的节点会变得活跃。

我目前正在存储此图,没有任何位置感:我只是将新节点附加到缓冲区。这是我正在使用的天真的分配策略的代码,原型是 JavaScript:

function Node(type,tag){
    var idx = garbage.pop() || memory.length;
    memory[idx+0] = type;      // Node type (used on readback)
    memory[idx+1] = 0;         // Port 0 target port
    memory[idx+2] = 0;         // Port 1 target port
    memory[idx+3] = 0;         // Port 2 target port
    memory[idx+4] = 0;         // Port 0 target node
    memory[idx+5] = 0;         // Port 1 target node
    memory[idx+6] = 0;         // Port 2 target node
    memory[idx+7] = ++next_id; // Unique id
    memory[idx+8] = tag;       // Tag (used to decide which reduction rule apply)
    return idx;
};

在内存中组织此图以最大限度地提高这种图算法的局部性和缓存效率的更好方法是什么?

【问题讨论】:

  • 我将其标记为 C/C++,因为我将在其中一个中重写实现,而这可能就是具有这方面专业知识的人所在的地方。但是这个问题通常与语言无关,所以我不确定我应该保留哪些标签。

标签: c++ c algorithm language-agnostic cpu-cache


【解决方案1】:

我只知道“存储”图表的两种方法。 “存储”是指实施。

边存储在每个节点的链表中,具有所有好处:添加和删除边很快,但找到一个很长。

边存储在节点矩阵中,Array[node1][node2] 的值是边的权重。添加和删​​除一个节点很长,但是找到一个节点或一条边很快。

使用链表方法,你只存储存在的东西,使用矩阵方法,你存储每条边,即使它不存在,你必须为它提供一个值。

【讨论】:

  • 还有很多其他方法可以以更局部的方式实现图形,例如看 CSR(压缩稀疏行格式)
猜你喜欢
  • 2021-09-14
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多