KOKKOS_INLINE_FUNCTION void operator()( const TagReady , int w ) const noexcept { std::int32_t const * const count_queue = & m_queue[ m_graph.numRows() ] ; if ( 0 == count_queue[w] ) push_work(w); }
KOKKOS_INLINE_FUNCTION void completed_work( std::int32_t w ) const noexcept { Kokkos::memory_fence(); // Make sure the completed work function's memory accesses are flushed. const std::int32_t N = m_graph.numRows(); std::int32_t volatile * const count_queue = & m_queue[N] ; const std::int32_t B = m_graph.row_map(w); const std::int32_t E = m_graph.row_map(w+1); for ( std::int32_t i = B ; i < E ; ++i ) { const std::int32_t j = m_graph.entries(i); if ( 1 == atomic_fetch_add(count_queue+j,-1) ) { push_work(j); } } }
Worker::~Worker() { push_work([this]{cancelled_ = true;}); }