You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
9.0 KiB
177 lines
9.0 KiB
2 years ago
|
<!-------- @HEADER
|
||
|
!
|
||
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
|
!
|
||
|
! Zoltan Toolkit for Load-balancing, Partitioning, Ordering and Coloring
|
||
|
! Copyright 2012 Sandia Corporation
|
||
|
!
|
||
|
! Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
||
|
! the U.S. Government retains certain rights in this software.
|
||
|
!
|
||
|
! Redistribution and use in source and binary forms, with or without
|
||
|
! modification, are permitted provided that the following conditions are
|
||
|
! met:
|
||
|
!
|
||
|
! 1. Redistributions of source code must retain the above copyright
|
||
|
! notice, this list of conditions and the following disclaimer.
|
||
|
!
|
||
|
! 2. Redistributions in binary form must reproduce the above copyright
|
||
|
! notice, this list of conditions and the following disclaimer in the
|
||
|
! documentation and/or other materials provided with the distribution.
|
||
|
!
|
||
|
! 3. Neither the name of the Corporation nor the names of the
|
||
|
! contributors may be used to endorse or promote products derived from
|
||
|
! this software without specific prior written permission.
|
||
|
!
|
||
|
! THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
|
||
|
! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
|
! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
|
||
|
! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||
|
! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||
|
! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||
|
! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||
|
! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
!
|
||
|
! Questions? Contact Karen Devine kddevin@sandia.gov
|
||
|
! Erik Boman egboman@sandia.gov
|
||
|
!
|
||
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||
|
!
|
||
|
! @HEADER
|
||
|
------->
|
||
|
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||
|
<html>
|
||
|
<head>
|
||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||
|
<meta name="GENERATOR" content="Mozilla/4.7 [en] (X11; U; SunOS 5.6 sun4m) [Netscape]">
|
||
|
<meta name="sandia.approved" content="SAND99-1376">
|
||
|
<meta name="author" content="karen devine, kddevin@sandia.gov">
|
||
|
<title> Zoltan Developer's Guide: ParMETIS/Jostle</title>
|
||
|
|
||
|
</head>
|
||
|
<body bgcolor="#FFFFFF">
|
||
|
|
||
|
<div align=right><b><i><a href="dev.html">Zoltan Developer's Guide</a>
|
||
|
| <a href="dev_phg.html">Next</a> | <a href="dev_rib.html">Previous</a></i></b></div>
|
||
|
|
||
|
<h2>
|
||
|
Appendix: <a href="https://www-users.cs.umn.edu/~karypis/metis/parmetis/">ParMETIS</a>
|
||
|
and <a href="https://www.gre.ac.uk/jostle">Jostle</a></h2>
|
||
|
|
||
|
<h3>
|
||
|
Overview of structure (algorithm)</h3>
|
||
|
This part of Zoltan provides an interface to various graph-based load-balancing
|
||
|
algorithms. Currently two libraries are supported: <a href="../ug_html/ug_alg_parmetis.html">ParMETIS
|
||
|
</a>and
|
||
|
<a href="../ug_html/ug_alg_jostle.html">Jostle.</a>
|
||
|
Each of these libraries contain several algorithms.
|
||
|
<h4>
|
||
|
Interface algorithm</h4>
|
||
|
The structure of the code is as follows: Each package
|
||
|
(<a href="https://www-users.cs.umn.edu/~karypis/metis/parmetis/">ParMETIS</a>,
|
||
|
<a href="https://www.gre.ac.uk/jostle">Jostle</a>)
|
||
|
has its own wrapper routine that performs initialization and sets parameters.
|
||
|
The main routine is <b>Zoltan_ParMetis_Jostle,</b> which constructs an appropriate
|
||
|
graph data structure using Zoltan's query functions. After the graph structure
|
||
|
has been constructed, the appropriate library is called and the import/export
|
||
|
list is created and returned.
|
||
|
<p>Please note that <a href="https://www-users.cs.umn.edu/~karypis/metis/parmetis/">ParMETIS</a>
|
||
|
and <a href="https://www.gre.ac.uk/jostle">Jostle</a> are not integral parts
|
||
|
of Zoltan. These libraries must be obtained and installed separately.
|
||
|
(<a href="https://www-users.cs.umn.edu/~karypis/metis/parmetis/">ParMETIS</a>
|
||
|
may be bundled with Zoltan, but it is an independent package developed
|
||
|
at Univ. of Minnesota.) Zoltan merely provides an interface to these libraries.
|
||
|
<p>The most complex task in the interface code is the construction of the
|
||
|
graph data structure. This structure is described in the next section.
|
||
|
The routine uses the Zoltan query functions to get a list of objects and
|
||
|
edges on each processor. Each object has a unique global ID which is mapped
|
||
|
into a unique (global) number between 1 and <i>n</i>, where <i>n</i> is
|
||
|
the total number of objects. The construction of the local (on-processor)
|
||
|
part of the graph is straightforward. When an edge goes between objects
|
||
|
that reside on different processors, global communication is required.
|
||
|
We use Zoltan's unstructured communication library for this. A hash function
|
||
|
(<a href="dev_services_hash.html"><b>Zoltan_Hash</b></a>) is used to efficiently map global IDs to integers.
|
||
|
The graph construction algorithm has parallel complexity
|
||
|
<i>O(max<sub>j</sub> {n<sub>j</sub>+m<sub>j</sub>+p})</i>, where
|
||
|
<i>n<sub>j</sub></i> is the number of objects on processor j,
|
||
|
<i>m<sub>j</sub></i> is the number of edges on processor j, and
|
||
|
<i>p</i> is the number of processors.
|
||
|
<p>One other feature of the interface code should be mentioned. While
|
||
|
Zoltan allows objects and edges to have real (float) weights, both ParMETIS and Jostle
|
||
|
currently require integer weights. Therefore, Zoltan first checks if the
|
||
|
object weights are integers. If not, the weights are automatically scaled
|
||
|
and rounded to integers. The scaling is performed such that the weights
|
||
|
become large integers, subject to the constraint that the sum of (any component
|
||
|
of) the weights is less than a large constant MAX_WGT_SUM < INT_MAX.
|
||
|
The scaled weights are rounded up to the nearest integer to ensure that
|
||
|
nonzero weights never become zero.
|
||
|
Note that for multidimensional weights, each weight component is scaled independently.
|
||
|
(The source code is written such that this scaling is simple to change.)
|
||
|
<p>Currently Zoltan constructs and discards the entire graph structure
|
||
|
every time a graph-based method (ParMETIS or Jostle) is called. Incremental
|
||
|
update of the graph structure may be supported in the future.
|
||
|
<p>The graph construction code in <b>Zoltan_ParMetis_Jostle </b>can also be
|
||
|
used to interface with other graph-based algorithms.
|
||
|
<h4>
|
||
|
Algorithms used in ParMETIS and Jostle libraries</h4>
|
||
|
There are two main types of algorithms used in ParMETIS and Jostle. The
|
||
|
first is multilevel graph partitioning. The main idea is to take a large
|
||
|
graph and construct a sequence of smaller and simpler graphs that
|
||
|
in some sense approximate the original graph. When the graph is sufficiently
|
||
|
small it is partitioned using some other method. This smallest graph and
|
||
|
the corresponding partition is then propagated back through all the levels
|
||
|
to the original graph. A popular local refinement strategy known as Kernighan-Lin
|
||
|
is employed at some or every level.
|
||
|
<p>The second main strategy is diffusion. This method assumes that an initial
|
||
|
partition (balance) is given, and load balance is achieved by repeatedly
|
||
|
moving objects (nodes) from parts (processors) that have too heavy
|
||
|
load to neighboring parts (processors) with too small load.
|
||
|
<p>For further details about the algorithms in a specific library, please
|
||
|
refer to the documentation that is distributed with that library.
|
||
|
<h3>
|
||
|
Data structures</h3>
|
||
|
We use the ParMETIS parallel graph structure. This is implemented using
|
||
|
5 arrays:
|
||
|
<ol>
|
||
|
<li>
|
||
|
<i>vtxdist</i>: gives the distribution of the objects (vertices) to processors</li>
|
||
|
|
||
|
<li>
|
||
|
<i>xadj</i>: indices (pointers) to the <i>adjncy</i> array</li>
|
||
|
|
||
|
<li>
|
||
|
<i>adjncy</i>: neighbor lists</li>
|
||
|
|
||
|
<li>
|
||
|
<i>adjwgt</i>: edge weights</li>
|
||
|
|
||
|
<li>
|
||
|
<i>vwgt</i>: vertex (object) weights</li>
|
||
|
</ol>
|
||
|
The <i>vtxdist</i> array is duplicated on all processors, while the other
|
||
|
arrays are local.
|
||
|
<br>For more details, see the ParMETIS User's Guide.
|
||
|
<h3>
|
||
|
Parameters</h3>
|
||
|
Zoltan supports the most common parameters in ParMETIS and Jostle. These
|
||
|
parameters are parsed in the package-specific wrapper routine (<b>Zoltan_ParMetis</b>
|
||
|
or <b>Zoltan_Jostle</b>) and later passed on to the desired library via <b>Zoltan_ParMetis_Jostle</b>.
|
||
|
<p>In addition, Zoltan has one graph parameter of its own: <a href="../ug_html/ug_alg_parmetis.html">CHECK_GRAPH</a>.
|
||
|
This parameter is set in <b>Zoltan_ParMetis_Jostle</b> and specifies the amount
|
||
|
of verification that is performed on the constructed graph. For example, it
|
||
|
is required that the graph is symmetric and that the weights are non-negative.
|
||
|
<h3>
|
||
|
Main routine</h3>
|
||
|
The main routine is <b>Zoltan_ParMetis_Jostle</b> but it should always be accessed
|
||
|
through either <b>Zoltan_ParMetis</b> or <b>Zoltan_Jostle</b>.
|
||
|
<p>
|
||
|
<hr WIDTH="100%">
|
||
|
<br>[<a href="dev.html">Table of Contents</a> | <a href="dev_phg.html">Next:
|
||
|
Hypergraph Partitioning</a> | <a href="dev_rib.html">Previous:
|
||
|
Recursive Inertial Bisection (RIB)</a> | <a href="https://www.sandia.gov/general/privacy-security/index.html">Privacy and Security</a>]
|
||
|
</body>
|
||
|
</html>
|