【发布时间】: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