Tpetra parallel linear algebra Version of the Day
Loading...
Searching...
No Matches
Tpetra_Distribution.hpp
1// @HEADER
2// ***********************************************************************
3//
4// Tpetra: Templated Linear Algebra Services Package
5// Copyright (2008) Sandia Corporation
6//
7// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8// the U.S. Government retains certain rights in this software.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ************************************************************************
40// @HEADER
41
42// Build maps for 1D or 2D matrix distribution
43// Assumes square matrix
44// Karen Devine, SNL
45//
46
47#ifndef __TPETRA_DISTRIBUTION_HPP
48#define __TPETRA_DISTRIBUTION_HPP
49
50#include <cstdio>
51#include <cstdlib>
52#include <iostream>
53#include <fstream>
54#include <set>
55#ifndef __cplusplus
56#define __cplusplus
57#endif
58
59#include "Teuchos_Comm.hpp"
60
61namespace Tpetra
62{
63
64enum DistributionType {
65 TwoDRandom, // 2D randomly permuted distribution
66 TwoDLinear, // 2D linear distribution
67 TwoDVec, // 2D distribution based on vector assignment in file
68 OneDRandom, // 1D randomly permuted distribution
69 OneDLinear, // 1D linear distribution
70 OneDVec, // 1D distribution based on vector assignment in file
71 LowerTriangularBlock, // Seher Acer's lower-triangular block distrib
72 // for triangle counting
73 MMFile // Use values in matrix-market file as part assignment
74};
75
77template <typename gno_t, typename scalar_t>
78class Distribution {
79public:
80
81 Distribution(size_t nrows_,
82 const Teuchos::RCP<const Teuchos::Comm<int> > &comm_,
83 const Teuchos::ParameterList &params) :
84 comm(comm_), me(comm_->getRank()), np(comm_->getSize()),
85 nrows(nrows_) { }
86
87 virtual ~Distribution() {};
88
89 // Return the DistributionType for this distribution.
90 virtual enum DistributionType DistType() = 0;
91
92 // Return whether this rank owns nonzero (i,j)
93 virtual bool Mine(gno_t i, gno_t j) = 0;
94 virtual bool Mine(gno_t i, gno_t j, int p) = 0;
95
96 // Return whether this rank owns vector entry i
97 virtual bool VecMine(gno_t i) = 0;
98
99 // Map of nonzeros needed for redistribution, handy for other things
100 using NZindex_t = std::pair<gno_t, gno_t>;
101 struct compareNzIndex { // sort nonzeros by row, then column
102 bool operator() (const NZindex_t &lhs, const NZindex_t &rhs) const
103 { if (lhs.first < rhs.first) return true;
104 if ((lhs.first == rhs.first) && (lhs.second < rhs.second)) return true;
105 return false;
106 }
107 };
108
109 using LocalNZmap_t = std::map<NZindex_t, scalar_t, compareNzIndex>;
110
111 // Redistribute nonzeros according to the needs of the Distribution
112 // Needed only when the final distribution cannot be determined until
113 // all nonzeros are known (e.g., final distribution depends on the number
114 // of nonzeros in a row).
115 // If the final distribution can be determined before all nonzeros (e.g.,
116 // Trilinos' traditional row map), the redistribution routine is a no-op.
117 // Thus, the default implementation is a no-op.
118 virtual void Redistribute(LocalNZmap_t &localNZ) { };
119
120
121protected:
122 const Teuchos::RCP<const Teuchos::Comm<int> > comm;
123 int me; // my rank
124 int np; // number of ranks
125 size_t nrows; // global number of rows in the input matrix
126
127 int HashToProc(gno_t i) {
128 // TODO PUT A GOOD HASH FUNCTION HERE!!!
129 // TODO FOR INITIAL TESTING, USE A CYCLIC HASH. LAME!
130 return(i % np);
131 }
132};
133
134}
135
136#include "Tpetra_Distribution2D.hpp"
137#include "Tpetra_Distribution1D.hpp"
138#include "Tpetra_DistributionMM.hpp"
139#include "Tpetra_DistributionLowerTriangularBlock.hpp"
140
141#endif
Namespace Tpetra contains the class and methods constituting the Tpetra library.