View Concepts for PGAS HPC Applications MUC 2017

  • Slides: 18
Download presentation
View Concepts for PGAS HPC Applications MUC++ 2017 -09 -13 Tobias Fuchs, LMU t.

View Concepts for PGAS HPC Applications MUC++ 2017 -09 -13 Tobias Fuchs, LMU t. fuchs@mnm-team. org @fuchsto dash-project. org 1

Containers in Partitioned Global Address Space 2

Containers in Partitioned Global Address Space 2

Containers in Partitioned Global Address Space 3

Containers in Partitioned Global Address Space 3

Containers in Partitioned Global Address Space dash: : Array<int> arr( size, dash: : BLOCKED);

Containers in Partitioned Global Address Space dash: : Array<int> arr( size, dash: : BLOCKED); 4

Containers in Partitioned Global Address Space dash: : Array<int> arr( size, dash: : BLOCKED);

Containers in Partitioned Global Address Space dash: : Array<int> arr( size, dash: : BLOCKED); auto l_arr = arr. local; int l_size = l_arr. size(); int * l_bg = l_arr. begin(); 5

Algorithms dash: : Array<int> arr(size); //. . . auto end = dash: : for_each(

Algorithms dash: : Array<int> arr(size); //. . . auto end = dash: : for_each( arr. begin(), arr. end(), unary_op); at every unit: 6

Algorithms dash: : Array<int> arr(size); //. . . auto end = dash: : for_each(

Algorithms dash: : Array<int> arr(size); //. . . auto end = dash: : for_each( arr. begin() + a, arr. begin() + b, unary_op); 7

Algorithms dash: : Array<int> arr(size); //. . . auto end = dash: : for_each(

Algorithms dash: : Array<int> arr(size); //. . . auto end = dash: : for_each( arr. begin() + 11, arr. begin() + 29, unary_op); auto l_range = arr | sub(11, 29) | local(); // -> view at local elements (1… 10) std: : for_each(l_range. begin(), l_range. end(), unary_op); 8

Algorithms dash: : Array<int> src(size); //. . . dash: : Array<int> dst(src. size()); auto

Algorithms dash: : Array<int> src(size); //. . . dash: : Array<int> dst(src. size()); auto cp_end = dash: : copy( src. begin() + sa, src. begin() + sb, dst. begin() + da); 9

Algorithms auto cp_end = dash: : copy( src. begin() + sa, src. begin() +

Algorithms auto cp_end = dash: : copy( src. begin() + sa, src. begin() + sb, dst. begin() + da); auto l_src = arr | sub(sa, sb) | local(); if (l_src. empty()) return dst. begin() + db-da; auto g_lbeg = l_src | global(); . . . Takeaway message: We really, really need iterator indices. 10

Algorithms auto cp_end = dash: : copy( src. begin() + sa, src. begin() +

Algorithms auto cp_end = dash: : copy( src. begin() + sa, src. begin() + sb, dst. begin() + da); auto l_src = arr | sub(sa, sb) | local(); if (l_src. empty()) return dst. begin() + db-da; auto g_lbeg = l_src | global(); . . . 11

“But but there already is ranges-v 3 and it rocks? “ Yes it does!

“But but there already is ranges-v 3 and it rocks? “ Yes it does! github. com/ericniebler/range-v 3 12

Multidimensional Views / Ranges / Index Sets* But we are special: dash: : Matrix<int,

Multidimensional Views / Ranges / Index Sets* But we are special: dash: : Matrix<int, 2> mat(8, 8); auto mat_rect = mat | sub<0>(3, 5) | sub<1>(2, 7); * we use the term index set to differentiate from index sequences which allow repetitions by definition 13

Multidimensional Views / Ranges / Index Sets* But we are special: dash: : Matrix<int,

Multidimensional Views / Ranges / Index Sets* But we are special: dash: : Matrix<int, 2> mat(8, 8); auto mat_rect = mat | sub<0>(3, 5) | sub<1>(2, 7); * we use the term index set to differentiate from index sequences which allow repetitions by definition 14

Multidimensional Views / Ranges / Index Sets* But we are special: dash: : Matrix<int,

Multidimensional Views / Ranges / Index Sets* But we are special: dash: : Matrix<int, 2> mat(8, 8); auto mat_rect = mat | local(); * we use the term index set to differentiate from index sequences which allow repetitions by definition 15

Multidimensional Views / Ranges / Index Sets But we are special: dash: : Matrix<int,

Multidimensional Views / Ranges / Index Sets But we are special: dash: : Matrix<int, 2> mat(8, 8); auto mat_rect = mat | sub<0>(3, 5) | sub<1>(2, 7) | local(); mat_rect | index() | serialize(); // result depending on unit: unit 0: { 9, 10, 11, 12, 13, 14 } unit 1: { 9, 11 } unit 2: { 8, 11 } 16

dash-project. org github. com/dash-project. slack. com doc. dash-project. org/papers doc. dash-project. org/slides doc. dash-project.

dash-project. org github. com/dash-project. slack. com doc. dash-project. org/papers doc. dash-project. org/slides doc. dash-project. org/files/wallpapers 17

Views based on Index Sets View. Iterator Agnostic of all this, just calls m_view[m_pos]

Views based on Index Sets View. Iterator Agnostic of all this, just calls m_view[m_pos] on dereference using namespace dash; auto v_lsub = local(sub(110, 130, array); // View types are a model of their base // type concepts, so v_lsub is a model // of Array: for (const & T val : v_lsub) {. . . } View<View Dom, Index. Set I> Model of base container, issues View. Iterator instances, initialized with view domain and operator arguments // index set of view is accessible: auto i_lsub = index(lsub); // -> { 10, 11, . . . , 29, 30 } 18