如何存储图形以最大化图形缩减算法的局部性?

时间:2015-08-12 03:33:01

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

我正在实施一种基于图减少规则的算法。 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;
};

在内存中组织此图形的最佳方法是什么,以便最大化这种图形算法的局部性和缓存效率?

1 个答案:

答案 0 :(得分:0)

我只知道两种“存储”图表的方法。通过“存储”我的意思是实现。

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

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

使用linked-list方法,只存储存在的内容,使用矩阵方法存储每条边即使它不存在,你必须为它提供一个值。