[英]How to reduce cache misses on graph traversal algorithms like DFS and BFS?
我想知道如何修改基本的BFS和DFS算法,以便在順序或並行實現它們時減少高速緩存未命中。
我讀到, 頂點(或)節點的排序可以在一定程度上幫助減少緩存丟失 ,但是我無法完全理解像RCM(Reverse Cuthill–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]].
等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.