/usr/include/TiledArray/pmap/cyclic_pmap.h is in libtiledarray-dev 0.6.0-5.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | /*
* This file is a part of TiledArray.
* Copyright (C) 2013 Virginia Tech
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Justus Calvin
* Department of Chemistry, Virginia Tech
*
* cyclic_pmap.h
* May 1, 2012
*
*/
#ifndef TILEDARRAY_PMAP_CYCLIC_PMAP_H__INCLUDED
#define TILEDARRAY_PMAP_CYCLIC_PMAP_H__INCLUDED
#include <TiledArray/pmap/pmap.h>
namespace TiledArray {
namespace detail {
/// Maps cyclically a sequence of indices onto a 2-d matrix of processes
/// Consider a sequence of indices \f$ \{ k | k \in [0,N) \} \f$,
/// organized into a matrix, \f$ \{ \{i,j\} | i \in [0,N_{\rm row}),j\in[0,N_{\rm col})\} \f$,
/// in row-major form, i.e. index \f$ k \f$ corresponds to
/// \f$ \{ k_{\rm row}, k_{\rm col} \} \equiv \{ k / N_{\rm col}, k \% N_{\rm col} \} \f$.
/// Similarly, a sequence of processes is organized into a matrix with \f$ P_{\rm row} \f$ rows
/// and \f$ P_{\rm cols} \f$ columns, i.e process \f$ p \equiv \{ p_{\rm row}, p_{\rm col} \} \f$.
/// Then index \f$ \{ k_{\rm row}, k_{\rm col} \} \f$ maps to process
/// \f$ \{ p_{\rm row}, p_{\rm col} \} = \{ k_{\rm row} \% N_{\rm row}, k_{\rm col} \% N_{\rm col} \} \f$
///
/// \note This class is used to map <em>tile</em> indices to processes.
class CyclicPmap : public Pmap {
protected:
// Import Pmap protected variables
using Pmap::rank_; ///< The rank of this process
using Pmap::procs_; ///< The number of processes
using Pmap::size_; ///< The number of tiles mapped among all processes
using Pmap::local_; ///< A list of local tiles
private:
const size_type rows_; ///< Number of tile rows to be mapped
const size_type cols_; ///< Number of tile columns to be mapped
const size_type proc_cols_; ///< Number of process columns
const size_type proc_rows_; ///< Number of process rows
public:
typedef Pmap::size_type size_type; ///< Size type
/// Construct process map
/// \param world The world where the tiles will be mapped
/// \param rows The number of tile rows to be mapped
/// \param cols The number of tile columns to be mapped
/// \param proc_rows The number of process rows in the map
/// \param proc_cols The number of process columns in the map
/// \throw TiledArray::Exception When <tt>proc_rows > rows</tt>
/// \throw TiledArray::Exception When <tt>proc_cols > cols</tt>
/// \throw TiledArray::Exception When <tt>proc_rows * proc_cols > world.size()</tt>
CyclicPmap(World& world, size_type rows, size_type cols,
size_type proc_rows, size_type proc_cols) :
Pmap(world, rows * cols), rows_(rows), cols_(cols),
proc_cols_(proc_cols), proc_rows_(proc_rows)
{
// Check that the size is non-zero
TA_ASSERT(rows_ >= 1ul);
TA_ASSERT(cols_ >= 1ul);
// Check limits of process rows and columns
TA_ASSERT(proc_rows_ >= 1ul);
TA_ASSERT(proc_cols_ >= 1ul);
TA_ASSERT((proc_rows_ * proc_cols_) <= procs_);
// Initialize local tile list
if(rank_ < (proc_rows_ * proc_cols_)) {
// Compute rank coordinates
const size_type rank_row = rank_ / proc_cols_;
const size_type rank_col = rank_ % proc_cols_;
const size_type local_rows =
(rows_ / proc_rows_) + ((rows_ % proc_rows_) < rank_row ? 1ul : 0ul);
const size_type local_cols =
(cols_ / proc_cols_) + ((cols_ % proc_cols_) < rank_col ? 1ul : 0ul);
// Allocate memory for the local tile list
local_.reserve(local_rows * local_cols);
// Iterate over local tiles
for(size_type i = rank_row; i < rows_; i += proc_rows_) {
const size_type row_end = (i + 1) * cols_;
for(size_type tile = i * cols_ + rank_col; tile < row_end; tile += proc_cols_) {
TA_ASSERT(CyclicPmap::owner(tile) == rank_);
local_.push_back(tile);
}
}
}
}
virtual ~CyclicPmap() { }
/// Access number of rows in the tile index matrix
size_type nrows() const { return rows_; }
/// Access number of columns in the tile index matrix
size_type ncols() const { return cols_; }
/// Access number of rows in the process matrix
size_type nrows_proc() const { return proc_rows_; }
/// Access number of columns in the process matrix
size_type ncols_proc() const { return proc_cols_; }
/// Maps \c tile to the processor that owns it
/// \param tile The tile to be queried
/// \return Processor that logically owns \c tile
virtual size_type owner(const size_type tile) const {
TA_ASSERT(tile < size_);
// Compute tile coordinate in tile grid
const size_type tile_row = tile / cols_;
const size_type tile_col = tile % cols_;
// Compute process coordinate of tile in the process grid
const size_type proc_row = tile_row % proc_rows_;
const size_type proc_col = tile_col % proc_cols_;
// Compute the process that owns tile
const size_type proc = proc_row * proc_cols_ + proc_col;
TA_ASSERT(proc < procs_);
return proc;
}
/// Check that the tile is owned by this process
/// \param tile The tile to be checked
/// \return \c true if \c tile is owned by this process, otherwise \c false .
virtual bool is_local(const size_type tile) const {
return (CyclicPmap::owner(tile) == rank_);
}
}; // class CyclicPmap
} // namespace detail
} // namespace TiledArray
#endif // TILEDARRAY_PMAP_CYCLIC_PMAP_H__INCLUDED
|