26 #ifndef TILEDARRAY_CONVERSIONS_TO_ELEMENTAL_H__INCLUDED 27 #define TILEDARRAY_CONVERSIONS_TO_ELEMENTAL_H__INCLUDED 29 #if TILEDARRAY_HAS_ELEMENTAL 43 inline bool uniformly_blocked(TiledRange
const &trange){
44 for(
auto i = 0ul; i < trange.rank(); ++i){
45 auto const &tr1 = trange.data()[i];
47 auto it = tr1.begin();
48 auto end = --tr1.end();
55 auto blocksize = it->second - it->first;
59 for(; it != end; ++it){
60 auto size = it->second - it->first;
61 if(
size != blocksize){
70 template <
typename Array>
71 El::DistMatrix<typename Array::element_type> matrix_to_el(
72 Array const& A, El::Grid
const &g){
75 TiledRange
const &trange = A.trange();
79 auto elem_extent = trange.elements_range().extent_data();
80 const auto nrows = elem_extent[0];
81 const auto ncols = elem_extent[1];
84 auto el_A = El::DistMatrix<typename Array::element_type>(nrows, ncols, g);
88 const auto vol = trange.tiles_range().volume();
89 for(
auto i = 0ul; i < vol; ++i){
93 if(!A.is_zero(i) && A.is_local(i)){
94 auto tile = A.find(i).get();
96 auto lo = tile.range().lobound_data();
97 auto up = tile.range().upbound_data();
99 for(
auto m = lo[0]; m < up[0]; ++m){
100 for(
auto n = lo[1]; n < up[1]; ++n){
101 el_A.QueueUpdate(m,n,tile(m,n));
108 el_A.ProcessQueues();
115 DistArray<Tensor<T>, DensePolicy> el_to_matrix(
116 El::AbstractDistMatrix<T>
const &M, World& world,
117 TiledRange
const &trange){
119 TA_USER_ASSERT(uniformly_blocked(trange),
"The output TiledRange must be uniformly blocked.");
120 #if !defined(EL_RELEASE) 122 " can only with MAD_NUM_THREADS=1 (and without TBB). Recompile Elemental in Release mode to use MAD_NUM_THREADS>1 or to use TBB.");
126 auto const& tr1_row = trange.data()[0];
127 auto const& tr1_col = trange.data()[1];
128 auto row_bs = tr1_row.begin()->second - tr1_row.begin()->first;
129 auto col_bs = tr1_col.begin()->second - tr1_col.begin()->first;
132 El::DistMatrix<T, El::MC, El::MR, El::BLOCK> Mb(M.Height(), M.Width(), M.Grid(), row_bs, col_bs);
135 DistArray<Tensor<T>, DensePolicy> A(world, trange);
138 const auto vol = trange.tiles_range().volume();
139 for(
auto i = 0ul; i < vol; ++i){
141 auto range = trange.make_tile_range(i);
142 auto lo = range.lobound_data();
144 auto task = [&](Range rng){
145 auto lo = rng.lobound_data();
146 auto up = rng.upbound_data();
147 auto tile = Tensor<T>(rng, 0.0);
150 for(
auto m = lo[0]; m != up[0]; ++m){
151 for(
auto n = lo[1]; n != up[1]; ++n){
152 tile(m,n) = Mb.GetLocal(Mb.LocalRow(m),Mb.LocalCol(n));
160 if(Mb.IsLocal(lo[0], lo[1])){
161 auto tile_future = A.world().taskq.add(task, range);
162 A.set(i, tile_future);
165 A.world().gop.fence();
178 class TensorFlattening {
180 std::pair<std::vector<int>, std::vector<int>> flattening_;
185 flattening_(
std::make_pair(
std::vector<int>{0}, std::vector<int>{1}))
189 std::pair<std::vector<int>, std::vector<int>>
const& flattening) :
190 flattening_(flattening)
193 TensorFlattening(std::vector<int>
const& left,
194 std::vector<int>
const &right) :
195 flattening_(
std::make_pair(left, right))
198 std::vector<int>
const &left_dims()
const {
return flattening_.first; }
199 std::vector<int>
const &right_dims()
const {
return flattening_.second; }
207 template <
typename Array>
208 El::DistMatrix<typename Array::element_type> array_to_el(
209 Array const& A, El::Grid
const &g = El::Grid::Default(),
210 TensorFlattening
const &tf = TensorFlattening()){
212 if(A.trange().rank() == 2){
214 return detail::matrix_to_el(A, g);
216 TA_USER_ASSERT(
false,
"array_to_el currently only supports converting matrices, higher order tensor conversions will be supported at a latter date.");
227 DistArray<Tensor<T>, DensePolicy> el_to_array(
228 El::AbstractDistMatrix<T>
const &M, World& world,
229 TiledRange
const &trange,
230 TensorFlattening
const &tf = TensorFlattening()){
232 if(trange.rank() == 2){
234 return detail::el_to_matrix(M, world, trange);
236 TA_USER_ASSERT(
false,
"el_to_array currently only supports converting matrices, higher order tensor conversions will be supported at a latter date.");
243 #endif // TILEDARRAY_HAS_ELEMENTAL 245 #endif // TILEDARRAY_CONVERSIONS_TO_ELEMENTAL_H__INCLUDED
size_t size(const DistArray< Tile, Policy > &a)
constexpr std::size_t size(T(&)[N])
Array size accessor.
#define TA_USER_ASSERT(a, m)
DistArray< Tile, Policy > Array