KOKKOS_INLINE_FUNCTION void operator()( typename policy_type::member_type & ) { enum { CHUNK = 8 }; const int n = CHUNK < m_count ? CHUNK : m_count ; if ( 1 < m_count ) { future_type f[ CHUNK ] ; const int inc = ( m_count + n - 1 ) / n ; for ( int i = 0 ; i < n ; ++i ) { long begin = i * inc ; long count = begin + inc < m_count ? inc : m_count - begin ; f[i] = m_policy.task_spawn( TestTaskDependence(count,m_policy,m_accum) , Kokkos::TaskSingle ); } m_count = 0 ; m_policy.respawn( this , m_policy.when_all( n , f ) ); } else if ( 1 == m_count ) { Kokkos::atomic_increment( & m_accum() ); } }
KOKKOS_INLINE_FUNCTION void operator()( typename policy_type::member_type & , value_type & result ) { #if 0 printf( "\nTestFib(%ld) %d %d\n" , n , int( ! fib_m1.is_null() ) , int( ! fib_m2.is_null() ) ); #endif if ( n < 2 ) { result = n ; } else if ( ! fib_m2.is_null() && ! fib_m1.is_null() ) { result = fib_m1.get() + fib_m2.get(); } else { // Spawn new children and respawn myself to sum their results: // Spawn lower value at higher priority as it has a shorter // path to completion. fib_m2 = policy.task_spawn( TestFib(policy,n-2) , Kokkos::TaskSingle , Kokkos::TaskHighPriority ); fib_m1 = policy.task_spawn( TestFib(policy,n-1) , Kokkos::TaskSingle ); Kokkos::Future<Space> dep[] = { fib_m1 , fib_m2 }; Kokkos::Future<Space> fib_all = policy.when_all( 2 , dep ); if ( ! fib_m2.is_null() && ! fib_m1.is_null() && ! fib_all.is_null() ) { // High priority to retire this branch policy.respawn( this , Kokkos::TaskHighPriority , fib_all ); } else { #if 0 printf( "TestFib(%ld) insufficient memory alloc_capacity(%d) task_max(%d) task_accum(%ld)\n" , n , policy.allocation_capacity() , policy.allocated_task_count_max() , policy.allocated_task_count_accum() ); #endif Kokkos::abort("TestFib insufficient memory"); } } }
static KOKKOS_INLINE_FUNCTION void respawn(policy_type &policy, TaskFunctorType *func) { policy.respawn(func); }
static void respawn(policy_type &policy, TaskFunctorType *func) { policy.respawn(func); }