dehne_gotz_min_spanning_tree.html 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
  7. <title>Parallel BGL Minimum Spanning Tree</title>
  8. <link rel="stylesheet" href="../../../../rst.css" type="text/css" />
  9. </head>
  10. <body>
  11. <div class="document" id="logo-minimum-spanning-tree">
  12. <h1 class="title"><a class="reference external" href="http://www.osl.iu.edu/research/pbgl"><img align="middle" alt="Parallel BGL" class="align-middle" src="pbgl-logo.png" /></a> Minimum Spanning Tree</h1>
  13. <!-- Copyright (C) 2004-2008 The Trustees of Indiana University.
  14. Use, modification and distribution is subject to the Boost Software
  15. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  16. http://www.boost.org/LICENSE_1_0.txt) -->
  17. <p>The Parallel BGL contains four <a class="reference external" href="http://www.boost.org/libs/graph/doc/graph_theory_review.html#sec:minimum-spanning-tree">minimum spanning tree</a> (MST)
  18. algorithms <a class="citation-reference" href="#dg98" id="id1">[DG98]</a> for use on undirected, weighted, distributed
  19. graphs. The graphs need not be connected: each algorithm will compute
  20. a minimum spanning forest (MSF) when provided with a disconnected
  21. graph.</p>
  22. <p>The interface to each of the four algorithms is similar to the
  23. implementation of 'Kruskal's algorithm'_ in the sequential BGL. Each
  24. accepts, at a minimum, a graph, a weight map, and an output
  25. iterator. The edges of the MST (or MSF) will be output via the output
  26. iterator on process 0: other processes may receive edges on their
  27. output iterators, but the set may not be complete, depending on the
  28. algorithm. The algorithm parameters are documented together, because
  29. they do not vary greatly. See the section <a class="reference internal" href="#selecting-an-mst-algorithm">Selecting an MST
  30. algorithm</a> for advice on algorithm selection.</p>
  31. <p>The graph itself must model the <a class="reference external" href="http://www.boost.org/libs/graph/doc/VertexListGraph.html">Vertex List Graph</a> concept and the
  32. Distributed Edge List Graph concept. Since the most common
  33. distributed graph structure, the <a class="reference external" href="distributed_adjacency_list.html">distributed adjacency list</a>, only
  34. models the Distributed Vertex List Graph concept, it may only be used
  35. with these algorithms when wrapped in a suitable adaptor, such as the
  36. <a class="reference external" href="vertex_list_adaptor.html">vertex_list_adaptor</a>.</p>
  37. <div class="contents topic" id="contents">
  38. <p class="topic-title first">Contents</p>
  39. <ul class="simple">
  40. <li><a class="reference internal" href="#where-defined" id="id12">Where Defined</a></li>
  41. <li><a class="reference internal" href="#parameters" id="id13">Parameters</a></li>
  42. <li><a class="reference internal" href="#dense-boruvka-minimum-spanning-tree" id="id14"><tt class="docutils literal"><span class="pre">dense_boruvka_minimum_spanning_tree</span></tt></a><ul>
  43. <li><a class="reference internal" href="#description" id="id15">Description</a></li>
  44. <li><a class="reference internal" href="#complexity" id="id16">Complexity</a></li>
  45. <li><a class="reference internal" href="#performance" id="id17">Performance</a></li>
  46. </ul>
  47. </li>
  48. <li><a class="reference internal" href="#merge-local-minimum-spanning-trees" id="id18"><tt class="docutils literal"><span class="pre">merge_local_minimum_spanning_trees</span></tt></a><ul>
  49. <li><a class="reference internal" href="#id2" id="id19">Description</a></li>
  50. <li><a class="reference internal" href="#id3" id="id20">Complexity</a></li>
  51. <li><a class="reference internal" href="#id4" id="id21">Performance</a></li>
  52. </ul>
  53. </li>
  54. <li><a class="reference internal" href="#boruvka-then-merge" id="id22"><tt class="docutils literal"><span class="pre">boruvka_then_merge</span></tt></a><ul>
  55. <li><a class="reference internal" href="#id5" id="id23">Description</a></li>
  56. <li><a class="reference internal" href="#id6" id="id24">Complexity</a></li>
  57. <li><a class="reference internal" href="#id7" id="id25">Performance</a></li>
  58. </ul>
  59. </li>
  60. <li><a class="reference internal" href="#boruvka-mixed-merge" id="id26"><tt class="docutils literal"><span class="pre">boruvka_mixed_merge</span></tt></a><ul>
  61. <li><a class="reference internal" href="#id8" id="id27">Description</a></li>
  62. <li><a class="reference internal" href="#id9" id="id28">Complexity</a></li>
  63. <li><a class="reference internal" href="#id10" id="id29">Performance</a></li>
  64. </ul>
  65. </li>
  66. <li><a class="reference internal" href="#selecting-an-mst-algorithm" id="id30">Selecting an MST algorithm</a><ul>
  67. <li><a class="reference internal" href="#performance-on-sparse-graphs" id="id31">Performance on Sparse Graphs</a></li>
  68. <li><a class="reference internal" href="#performance-on-dense-graphs" id="id32">Performance on Dense Graphs</a></li>
  69. </ul>
  70. </li>
  71. </ul>
  72. </div>
  73. <div class="section" id="where-defined">
  74. <h1><a class="toc-backref" href="#id12">Where Defined</a></h1>
  75. <p>&lt;<tt class="docutils literal"><span class="pre">boost/graph/distributed/dehne_gotz_min_spanning_tree.hpp</span></tt>&gt;</p>
  76. </div>
  77. <div class="section" id="parameters">
  78. <h1><a class="toc-backref" href="#id13">Parameters</a></h1>
  79. <dl class="docutils">
  80. <dt>IN: <tt class="docutils literal"><span class="pre">Graph&amp;</span> <span class="pre">g</span></tt></dt>
  81. <dd>The graph type must be a model of <a class="reference external" href="http://www.boost.org/libs/graph/doc/VertexListGraph.html">Vertex List Graph</a> and
  82. <a class="reference external" href="DistributedEdgeListGraph.html">Distributed Edge List Graph</a>.</dd>
  83. <dt>IN/OUT: <tt class="docutils literal"><span class="pre">WeightMap</span> <span class="pre">weight</span></tt></dt>
  84. <dd>The weight map must be a <a class="reference external" href="distributed_property_map.html">Distributed Property Map</a> and a <a class="reference external" href="http://www.boost.org/libs/property_map/ReadablePropertyMap.html">Readable
  85. Property Map</a> whose key type is the edge descriptor of the graph
  86. and whose value type is numerical.</dd>
  87. <dt>IN/OUT: <tt class="docutils literal"><span class="pre">OutputIterator</span> <span class="pre">out</span></tt></dt>
  88. <dd>The output iterator through which the edges of the MSF will be
  89. written. Must be capable of accepting edge descriptors for output.</dd>
  90. <dt>IN: <tt class="docutils literal"><span class="pre">VertexIndexMap</span> <span class="pre">index</span></tt></dt>
  91. <dd><p class="first">A mapping from vertex descriptors to indices in the range <em>[0,
  92. num_vertices(g))</em>. This must be a <a class="reference external" href="http://www.boost.org/libs/property_map/ReadablePropertyMap.html">Readable Property Map</a> whose
  93. key type is a vertex descriptor and whose value type is an integral
  94. type, typically the <tt class="docutils literal"><span class="pre">vertices_size_type</span></tt> of the graph.</p>
  95. <p class="last"><strong>Default:</strong> <tt class="docutils literal"><span class="pre">get(vertex_index,</span> <span class="pre">g)</span></tt></p>
  96. </dd>
  97. <dt>IN/UTIL: <tt class="docutils literal"><span class="pre">RankMap</span> <span class="pre">rank_map</span></tt></dt>
  98. <dd><p class="first">Stores the rank of each vertex, which is used for maintaining
  99. union-find data structures. This must be a <a class="reference external" href="http://www.boost.org/libs/property_map/ReadWritePropertyMap.html">Read/Write Property Map</a>
  100. whose key type is a vertex descriptor and whose value type is an
  101. integral type.</p>
  102. <p class="last"><strong>Default:</strong> An <tt class="docutils literal"><span class="pre">iterator_property_map</span></tt> built from an STL vector
  103. of the <tt class="docutils literal"><span class="pre">vertices_size_type</span></tt> of the graph and the vertex index map.</p>
  104. </dd>
  105. <dt>IN/UTIL: <tt class="docutils literal"><span class="pre">ParentMap</span> <span class="pre">parent_map</span></tt></dt>
  106. <dd><p class="first">Stores the parent (representative) of each vertex, which is used for
  107. maintaining union-find data structures. This must be a <a class="reference external" href="http://www.boost.org/libs/property_map/ReadWritePropertyMap.html">Read/Write
  108. Property Map</a> whose key type is a vertex descriptor and whose value
  109. type is also a vertex descriptor.</p>
  110. <p class="last"><strong>Default:</strong> An <tt class="docutils literal"><span class="pre">iterator_property_map</span></tt> built from an STL vector
  111. of the <tt class="docutils literal"><span class="pre">vertex_descriptor</span></tt> of the graph and the vertex index map.</p>
  112. </dd>
  113. <dt>IN/UTIL: <tt class="docutils literal"><span class="pre">SupervertexMap</span> <span class="pre">supervertex_map</span></tt></dt>
  114. <dd><p class="first">Stores the supervertex index of each vertex, which is used for
  115. maintaining the supervertex list data structures. This must be a
  116. <a class="reference external" href="http://www.boost.org/libs/property_map/ReadWritePropertyMap.html">Read/Write Property Map</a> whose key type is a vertex descriptor and
  117. whose value type is an integral type.</p>
  118. <p class="last"><strong>Default:</strong> An <tt class="docutils literal"><span class="pre">iterator_property_map</span></tt> built from an STL vector
  119. of the <tt class="docutils literal"><span class="pre">vertices_size_type</span></tt> of the graph and the vertex index map.</p>
  120. </dd>
  121. </dl>
  122. </div>
  123. <div class="section" id="dense-boruvka-minimum-spanning-tree">
  124. <h1><a class="toc-backref" href="#id14"><tt class="docutils literal"><span class="pre">dense_boruvka_minimum_spanning_tree</span></tt></a></h1>
  125. <pre class="literal-block">
  126. namespace graph {
  127. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  128. typename VertexIndexMap, typename RankMap, typename ParentMap,
  129. typename SupervertexMap&gt;
  130. OutputIterator
  131. dense_boruvka_minimum_spanning_tree(const Graph&amp; g, WeightMap weight_map,
  132. OutputIterator out,
  133. VertexIndexMap index,
  134. RankMap rank_map, ParentMap parent_map,
  135. SupervertexMap supervertex_map);
  136. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  137. typename VertexIndex&gt;
  138. OutputIterator
  139. dense_boruvka_minimum_spanning_tree(const Graph&amp; g, WeightMap weight_map,
  140. OutputIterator out, VertexIndex index);
  141. template&lt;typename Graph, typename WeightMap, typename OutputIterator&gt;
  142. OutputIterator
  143. dense_boruvka_minimum_spanning_tree(const Graph&amp; g, WeightMap weight_map,
  144. OutputIterator out);
  145. }
  146. </pre>
  147. <div class="section" id="description">
  148. <h2><a class="toc-backref" href="#id15">Description</a></h2>
  149. <p>The dense Boruvka distributed minimum spanning tree algorithm is a
  150. direct parallelization of the sequential MST algorithm by
  151. Boruvka. The algorithm first creates a <em>supervertex</em> out of each
  152. vertex. Then, in each iteration, it finds the smallest-weight edge
  153. incident to each vertex, collapses supervertices along these edges,
  154. and removals all self loops. The only difference between the
  155. sequential and parallel algorithms is that the parallel algorithm
  156. performs an all-reduce operation so that all processes have the
  157. global minimum set of edges.</p>
  158. <p>Unlike the other three algorithms, this algorithm emits the complete
  159. list of edges in the minimum spanning forest via the output iterator
  160. on all processes. It may therefore be more useful than the others
  161. when parallelizing sequential BGL programs.</p>
  162. </div>
  163. <div class="section" id="complexity">
  164. <h2><a class="toc-backref" href="#id16">Complexity</a></h2>
  165. <p>The distributed algorithm requires <em>O(log n)</em> BSP supersteps, each of
  166. which requires <em>O(m/p + n)</em> time and <em>O(n)</em> communication per
  167. process.</p>
  168. </div>
  169. <div class="section" id="performance">
  170. <h2><a class="toc-backref" href="#id17">Performance</a></h2>
  171. <p>The following charts illustrate the performance of this algorithm on
  172. various random graphs. We see that the algorithm scales well up to 64
  173. or 128 processors, depending on the type of graph, for dense
  174. graphs. However, for sparse graphs performance tapers off as the
  175. number of processors surpases <em>m/n</em>, i.e., the average degree (which
  176. is 30 for this graph). This behavior is expected from the algorithm.</p>
  177. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_5.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_5.png" />
  178. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_5_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_5_speedup_1.png" />
  179. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_5.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_5.png" />
  180. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_5_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_5_speedup_1.png" />
  181. </div>
  182. </div>
  183. <div class="section" id="merge-local-minimum-spanning-trees">
  184. <h1><a class="toc-backref" href="#id18"><tt class="docutils literal"><span class="pre">merge_local_minimum_spanning_trees</span></tt></a></h1>
  185. <pre class="literal-block">
  186. namespace graph {
  187. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  188. typename VertexIndexMap&gt;
  189. OutputIterator
  190. merge_local_minimum_spanning_trees(const Graph&amp; g, WeightMap weight,
  191. OutputIterator out,
  192. VertexIndexMap index);
  193. template&lt;typename Graph, typename WeightMap, typename OutputIterator&gt;
  194. inline OutputIterator
  195. merge_local_minimum_spanning_trees(const Graph&amp; g, WeightMap weight,
  196. OutputIterator out);
  197. }
  198. </pre>
  199. <div class="section" id="id2">
  200. <h2><a class="toc-backref" href="#id19">Description</a></h2>
  201. <p>The merging local MSTs algorithm operates by computing minimum
  202. spanning forests from the edges stored on each process. Then the
  203. processes merge their edge lists along a tree. The child nodes cease
  204. participating in the computation, but the parent nodes recompute MSFs
  205. from the newly acquired edges. In the final round, the root of the
  206. tree computes the global MSFs, having received candidate edges from
  207. every other process via the tree.</p>
  208. </div>
  209. <div class="section" id="id3">
  210. <h2><a class="toc-backref" href="#id20">Complexity</a></h2>
  211. <p>This algorithm requires <em>O(log_D p)</em> BSP supersteps (where <em>D</em> is the
  212. number of children in the tree, and is currently fixed at 3). Each
  213. superstep requires <em>O((m/p) log (m/p) + n)</em> time and <em>O(m/p)</em>
  214. communication per process.</p>
  215. </div>
  216. <div class="section" id="id4">
  217. <h2><a class="toc-backref" href="#id21">Performance</a></h2>
  218. <p>The following charts illustrate the performance of this algorithm on
  219. various random graphs. The algorithm only scales well for very dense
  220. graphs, where most of the work is performed in the initial stage and
  221. there is very little work in the later stages.</p>
  222. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_6.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_6.png" />
  223. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_6_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_6_speedup_1.png" />
  224. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_6.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_6.png" />
  225. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_6_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_6_speedup_1.png" />
  226. </div>
  227. </div>
  228. <div class="section" id="boruvka-then-merge">
  229. <h1><a class="toc-backref" href="#id22"><tt class="docutils literal"><span class="pre">boruvka_then_merge</span></tt></a></h1>
  230. <pre class="literal-block">
  231. namespace graph {
  232. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  233. typename VertexIndexMap, typename RankMap, typename ParentMap,
  234. typename SupervertexMap&gt;
  235. OutputIterator
  236. boruvka_then_merge(const Graph&amp; g, WeightMap weight, OutputIterator out,
  237. VertexIndexMap index, RankMap rank_map,
  238. ParentMap parent_map, SupervertexMap
  239. supervertex_map);
  240. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  241. typename VertexIndexMap&gt;
  242. inline OutputIterator
  243. boruvka_then_merge(const Graph&amp; g, WeightMap weight, OutputIterator out,
  244. VertexIndexMap index);
  245. template&lt;typename Graph, typename WeightMap, typename OutputIterator&gt;
  246. inline OutputIterator
  247. boruvka_then_merge(const Graph&amp; g, WeightMap weight, OutputIterator out);
  248. }
  249. </pre>
  250. <div class="section" id="id5">
  251. <h2><a class="toc-backref" href="#id23">Description</a></h2>
  252. <p>This algorithm applies both Boruvka steps and local MSF merging steps
  253. together to achieve better asymptotic performance than either
  254. algorithm alone. It first executes Boruvka steps until only <em>n/(log_d
  255. p)^2</em> supervertices remain, then completes the MSF computation by
  256. performing local MSF merging on the remaining edges and
  257. supervertices.</p>
  258. </div>
  259. <div class="section" id="id6">
  260. <h2><a class="toc-backref" href="#id24">Complexity</a></h2>
  261. <p>This algorithm requires <em>log_D p</em> + <em>log log_D p</em> BSP supersteps. The
  262. time required by each superstep depends on the type of superstep
  263. being performed; see the distributed Boruvka or merging local MSFS
  264. algorithms for details.</p>
  265. </div>
  266. <div class="section" id="id7">
  267. <h2><a class="toc-backref" href="#id25">Performance</a></h2>
  268. <p>The following charts illustrate the performance of this algorithm on
  269. various random graphs. We see that the algorithm scales well up to 64
  270. or 128 processors, depending on the type of graph, for dense
  271. graphs. However, for sparse graphs performance tapers off as the
  272. number of processors surpases <em>m/n</em>, i.e., the average degree (which
  273. is 30 for this graph). This behavior is expected from the algorithm.</p>
  274. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_7.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_7.png" />
  275. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_7_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_7_speedup_1.png" />
  276. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_7.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_7.png" />
  277. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_7_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_7_speedup_1.png" />
  278. </div>
  279. </div>
  280. <div class="section" id="boruvka-mixed-merge">
  281. <h1><a class="toc-backref" href="#id26"><tt class="docutils literal"><span class="pre">boruvka_mixed_merge</span></tt></a></h1>
  282. <pre class="literal-block">
  283. namespace {
  284. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  285. typename VertexIndexMap, typename RankMap, typename ParentMap,
  286. typename SupervertexMap&gt;
  287. OutputIterator
  288. boruvka_mixed_merge(const Graph&amp; g, WeightMap weight, OutputIterator out,
  289. VertexIndexMap index, RankMap rank_map,
  290. ParentMap parent_map, SupervertexMap
  291. supervertex_map);
  292. template&lt;typename Graph, typename WeightMap, typename OutputIterator,
  293. typename VertexIndexMap&gt;
  294. inline OutputIterator
  295. boruvka_mixed_merge(const Graph&amp; g, WeightMap weight, OutputIterator out,
  296. VertexIndexMap index);
  297. template&lt;typename Graph, typename WeightMap, typename OutputIterator&gt;
  298. inline OutputIterator
  299. boruvka_mixed_merge(const Graph&amp; g, WeightMap weight, OutputIterator out);
  300. }
  301. </pre>
  302. <div class="section" id="id8">
  303. <h2><a class="toc-backref" href="#id27">Description</a></h2>
  304. <p>This algorithm applies both Boruvka steps and local MSF merging steps
  305. together to achieve better asymptotic performance than either method
  306. alone. In each iteration, the algorithm first performs a Boruvka step
  307. and then merges the local MSFs computed based on the supervertex
  308. graph.</p>
  309. </div>
  310. <div class="section" id="id9">
  311. <h2><a class="toc-backref" href="#id28">Complexity</a></h2>
  312. <p>This algorithm requires <em>log_D p</em> BSP supersteps. The
  313. time required by each superstep depends on the type of superstep
  314. being performed; see the distributed Boruvka or merging local MSFS
  315. algorithms for details. However, the algorithm is
  316. communication-optional (requiring <em>O(n)</em> communication overall) when
  317. the graph is sufficiently dense, i.e., <em>m/n &gt;= p</em>.</p>
  318. </div>
  319. <div class="section" id="id10">
  320. <h2><a class="toc-backref" href="#id29">Performance</a></h2>
  321. <p>The following charts illustrate the performance of this algorithm on
  322. various random graphs. We see that the algorithm scales well up to 64
  323. or 128 processors, depending on the type of graph, for dense
  324. graphs. However, for sparse graphs performance tapers off as the
  325. number of processors surpases <em>m/n</em>, i.e., the average degree (which
  326. is 30 for this graph). This behavior is expected from the algorithm.</p>
  327. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_8.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_8.png" />
  328. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_8_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeSparse_columns_8_speedup_1.png" />
  329. <img align="left" alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_8.png" class="align-left" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_8.png" />
  330. <img alt="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_8_speedup_1.png" src="chart_php_generator_ER_SF_SW_dataset_TimeDense_columns_8_speedup_1.png" />
  331. </div>
  332. </div>
  333. <div class="section" id="selecting-an-mst-algorithm">
  334. <h1><a class="toc-backref" href="#id30">Selecting an MST algorithm</a></h1>
  335. <p>Dehne and Gotz reported <a class="citation-reference" href="#dg98" id="id11">[DG98]</a> mixed results when evaluating these
  336. four algorithms. No particular algorithm was clearly better than the
  337. others in all cases. However, the asymptotically best algorithm
  338. (<tt class="docutils literal"><span class="pre">boruvka_mixed_merge</span></tt>) seemed to perform more poorly in their tests
  339. than the other merging-based algorithms. The following performance
  340. charts illustrate the performance of these four minimum spanning tree
  341. implementations.</p>
  342. <p>Overall, <tt class="docutils literal"><span class="pre">dense_boruvka_minimum_spanning_tree</span></tt> gives the most
  343. consistent performance and scalability for the graphs we
  344. tested. Additionally, it may be more suitable for sequential programs
  345. that are being parallelized, because it emits complete MSF edge lists
  346. via the output iterators in every process.</p>
  347. <div class="section" id="performance-on-sparse-graphs">
  348. <h2><a class="toc-backref" href="#id31">Performance on Sparse Graphs</a></h2>
  349. <img align="left" alt="chart_php_generator_ER_dataset_TimeSparse_columns_5_6_7_8.png" class="align-left" src="chart_php_generator_ER_dataset_TimeSparse_columns_5_6_7_8.png" />
  350. <img alt="chart_php_generator_ER_dataset_TimeSparse_columns_5_6_7_8_speedup_1.png" src="chart_php_generator_ER_dataset_TimeSparse_columns_5_6_7_8_speedup_1.png" />
  351. <img align="left" alt="chart_php_generator_SF_dataset_TimeSparse_columns_5_6_7_8.png" class="align-left" src="chart_php_generator_SF_dataset_TimeSparse_columns_5_6_7_8.png" />
  352. <img alt="chart_php_generator_SF_dataset_TimeSparse_columns_5_6_7_8_speedup_1.png" src="chart_php_generator_SF_dataset_TimeSparse_columns_5_6_7_8_speedup_1.png" />
  353. <img align="left" alt="chart_php_generator_SW_dataset_TimeSparse_columns_5_6_7_8.png" class="align-left" src="chart_php_generator_SW_dataset_TimeSparse_columns_5_6_7_8.png" />
  354. <img alt="chart_php_generator_SW_dataset_TimeSparse_columns_5_6_7_8_speedup_1.png" src="chart_php_generator_SW_dataset_TimeSparse_columns_5_6_7_8_speedup_1.png" />
  355. </div>
  356. <div class="section" id="performance-on-dense-graphs">
  357. <h2><a class="toc-backref" href="#id32">Performance on Dense Graphs</a></h2>
  358. <img align="left" alt="chart_php_generator_ER_dataset_TimeDense_columns_5_6_7_8.png" class="align-left" src="chart_php_generator_ER_dataset_TimeDense_columns_5_6_7_8.png" />
  359. <img alt="chart_php_generator_ER_dataset_TimeDense_columns_5_6_7_8_speedup_1.png" src="chart_php_generator_ER_dataset_TimeDense_columns_5_6_7_8_speedup_1.png" />
  360. <img align="left" alt="chart_php_generator_SF_dataset_TimeDense_columns_5_6_7_8.png" class="align-left" src="chart_php_generator_SF_dataset_TimeDense_columns_5_6_7_8.png" />
  361. <img alt="chart_php_generator_SF_dataset_TimeDense_columns_5_6_7_8_speedup_1.png" src="chart_php_generator_SF_dataset_TimeDense_columns_5_6_7_8_speedup_1.png" />
  362. <img align="left" alt="chart_php_generator_SW_dataset_TimeDense_columns_5_6_7_8.png" class="align-left" src="chart_php_generator_SW_dataset_TimeDense_columns_5_6_7_8.png" />
  363. <img alt="chart_php_generator_SW_dataset_TimeDense_columns_5_6_7_8_speedup_1.png" src="chart_php_generator_SW_dataset_TimeDense_columns_5_6_7_8_speedup_1.png" />
  364. <hr class="docutils" />
  365. <p>Copyright (C) 2004 The Trustees of Indiana University.</p>
  366. <p>Authors: Douglas Gregor and Andrew Lumsdaine</p>
  367. <table class="docutils citation" frame="void" id="dg98" rules="none">
  368. <colgroup><col class="label" /><col /></colgroup>
  369. <tbody valign="top">
  370. <tr><td class="label">[DG98]</td><td><em>(<a class="fn-backref" href="#id1">1</a>, <a class="fn-backref" href="#id11">2</a>)</em> Frank Dehne and Silvia Gotz. <em>Practical Parallel Algorithms
  371. for Minimum Spanning Trees</em>. In Symposium on Reliable Distributed Systems,
  372. pages 366--371, 1998.</td></tr>
  373. </tbody>
  374. </table>
  375. </div>
  376. </div>
  377. </div>
  378. <div class="footer">
  379. <hr class="footer" />
  380. Generated on: 2009-05-31 00:21 UTC.
  381. Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
  382. </div>
  383. </body>
  384. </html>