126 const DecompositionType& decomposition,
127 const EntityType& entity_type,
const FunctorType& functor )
167 const DecompositionType& decomposition,
168 const EntityType& entity_type,
const WorkTag& work_tag,
169 const FunctorType& functor )
200 const FunctorType& functor )
202 Kokkos::Profiling::ScopedRegion region(
"Cabana::Grid::grid_parallel_for" );
206 int size = index_spaces[0].size();
207 Kokkos::Array<int, NumSpace> exclusive_offsets;
208 Kokkos::Array<int, NumSpace> inclusive_offsets;
209 exclusive_offsets[0] = 0;
210 inclusive_offsets[0] =
size;
211 for ( std::size_t sp = 1; sp < NumSpace; ++sp )
213 size += index_spaces[sp].size();
214 exclusive_offsets[sp] =
215 exclusive_offsets[sp - 1] + index_spaces[sp - 1].size();
216 inclusive_offsets[sp] =
217 inclusive_offsets[sp - 1] + index_spaces[sp].size();
221 Kokkos::parallel_for(
222 label, Kokkos::RangePolicy<ExecutionSpace>( exec_space, 0,
size ),
223 KOKKOS_LAMBDA(
const int n ) {
226 for ( std::size_t sp = 0; sp < NumSpace; ++sp )
228 if ( n < inclusive_offsets[sp] )
236 int linear_id = n - exclusive_offsets[s];
239 int extent_l = index_spaces[s].extent( 3 );
240 int extent_kl = extent_l * index_spaces[s].extent( Dim::K );
241 int extent_jkl = extent_kl * index_spaces[s].extent( Dim::J );
242 int i_base = linear_id / extent_jkl;
243 int stride_j = extent_jkl * i_base;
244 int j_base = ( linear_id - stride_j ) / extent_kl;
245 int stride_k = ( stride_j + extent_kl * j_base );
246 int k_base = ( linear_id - stride_k ) / extent_l;
247 int l_base = linear_id - stride_k - k_base * extent_l;
251 functor( s, i_base + index_spaces[s].min( Dim::I ),
252 j_base + index_spaces[s].min( Dim::J ),
253 k_base + index_spaces[s].min( Dim::K ),
254 l_base + index_spaces[s].min( 3 ) );
282 const FunctorType& functor )
284 Kokkos::Profiling::ScopedRegion region(
"Cabana::Grid::grid_parallel_for" );
288 int size = index_spaces[0].size();
289 Kokkos::Array<int, NumSpace> exclusive_offsets;
290 Kokkos::Array<int, NumSpace> inclusive_offsets;
291 exclusive_offsets[0] = 0;
292 inclusive_offsets[0] =
size;
293 for ( std::size_t sp = 1; sp < NumSpace; ++sp )
295 size += index_spaces[sp].size();
296 exclusive_offsets[sp] =
297 exclusive_offsets[sp - 1] + index_spaces[sp - 1].size();
298 inclusive_offsets[sp] =
299 inclusive_offsets[sp - 1] + index_spaces[sp].size();
303 Kokkos::parallel_for(
304 label, Kokkos::RangePolicy<ExecutionSpace>( exec_space, 0,
size ),
305 KOKKOS_LAMBDA(
const int n ) {
308 for ( std::size_t sp = 0; sp < NumSpace; ++sp )
310 if ( n < inclusive_offsets[sp] )
318 int linear_id = n - exclusive_offsets[s];
321 int extent_k = index_spaces[s].extent( Dim::K );
322 int extent_jk = extent_k * index_spaces[s].extent( Dim::J );
323 int i_base = linear_id / extent_jk;
324 int stride_j = extent_jk * i_base;
325 int j_base = ( linear_id - stride_j ) / extent_k;
326 int k_base = linear_id - extent_k * j_base - stride_j;
330 functor( s, i_base + index_spaces[s].min( Dim::I ),
331 j_base + index_spaces[s].min( Dim::J ),
332 k_base + index_spaces[s].min( Dim::K ) );
360 const FunctorType& functor )
362 Kokkos::Profiling::ScopedRegion region(
"Cabana::Grid::grid_parallel_for" );
366 int size = index_spaces[0].size();
367 Kokkos::Array<int, NumSpace> exclusive_offsets;
368 Kokkos::Array<int, NumSpace> inclusive_offsets;
369 exclusive_offsets[0] = 0;
370 inclusive_offsets[0] =
size;
371 for ( std::size_t sp = 1; sp < NumSpace; ++sp )
373 size += index_spaces[sp].size();
374 exclusive_offsets[sp] =
375 exclusive_offsets[sp - 1] + index_spaces[sp - 1].size();
376 inclusive_offsets[sp] =
377 inclusive_offsets[sp - 1] + index_spaces[sp].size();
381 Kokkos::parallel_for(
382 label, Kokkos::RangePolicy<ExecutionSpace>( exec_space, 0,
size ),
383 KOKKOS_LAMBDA(
const int n ) {
386 for ( std::size_t sp = 0; sp < NumSpace; ++sp )
388 if ( n < inclusive_offsets[sp] )
396 int linear_id = n - exclusive_offsets[s];
399 int extent_j = index_spaces[s].extent( Dim::J );
400 int i_base = linear_id / extent_j;
401 int j_base = linear_id - i_base * extent_j;
405 functor( s, i_base + index_spaces[s].min( Dim::I ),
406 j_base + index_spaces[s].min( Dim::J ) );
437 const ExecutionSpace& exec_space,
439 const FunctorType& functor,
440 ReduceType& reducer )
442 Kokkos::Profiling::ScopedRegion region(
443 "Cabana::Grid::grid_parallel_reduce" );
444 Kokkos::parallel_reduce( label,
480 const ExecutionSpace& exec_space,
482 const FunctorType& functor, ReduceType& reducer )
484 Kokkos::Profiling::ScopedRegion region(
485 "Cabana::Grid::grid_parallel_reduce" );
486 Kokkos::parallel_reduce(
522 const ExecutionSpace& exec_space,
524 const DecompositionType& decomposition,
525 const EntityType& entity_type,
526 const FunctorType& functor,
527 ReduceType& reducer )
570 const std::string& label,
const ExecutionSpace& exec_space,
572 const DecompositionType& decomposition,
const EntityType& entity_type,
573 const WorkTag& work_tag,
const FunctorType& functor, ReduceType& reducer )
Kokkos::RangePolicy< ExecutionSpace > createExecutionPolicy(const IndexSpace< 1 > &index_space, const ExecutionSpace &)
Create a multi-dimensional execution policy over an index space.
Definition Cabana_Grid_IndexSpace.hpp:175
void grid_parallel_for(const std::string &label, const ExecutionSpace &exec_space, const IndexSpace< N > &index_space, const FunctorType &functor)
Execute a functor in parallel with a multidimensional execution policy specified by the given index s...
Definition Cabana_Grid_Parallel.hpp:52
void grid_parallel_reduce(const std::string &label, const ExecutionSpace &exec_space, const IndexSpace< N > &index_space, const FunctorType &functor, ReduceType &reducer)
Execute a reduction functor in parallel with a multidimensional execution policy specified by the giv...
Definition Cabana_Grid_Parallel.hpp:436
IndexSpace< num_space_dim > indexSpace(DecompositionTag t1, EntityType t2, IndexType t3) const
Given a decomposition type, entity type, and index type, get the contiguous set of indices that span ...
auto size(SliceType slice, typename std::enable_if< is_slice< SliceType >::value, int >::type *=0)
Check slice size (differs from Kokkos View).
Definition Cabana_Slice.hpp:1012