3#include <thrust/copy.h>
4#include <thrust/count.h>
5#include <thrust/device_vector.h>
6#include <thrust/execution_policy.h>
11__host__ __device__
bool is_factor_active(
const uint8_t active_val,
12 const uint8_t level) {
13 constexpr uint8_t NOT_MSB = 0x7F;
14 return (active_val & NOT_MSB) <= level && ((active_val & 0x80) == 0);
18__host__ __device__
bool is_vertex_active(
const uint8_t *active_state,
19 const size_t vertex_id) {
20 return !(active_state[vertex_id] > 0);
24size_t build_active_indices(
const thrust::device_vector<uint8_t> &active,
25 thrust::device_vector<size_t> &active_indices,
26 const size_t count,
const uint8_t level) {
29 const size_t active_count =
30 thrust::count_if(thrust::device, active.begin(), active.end(),
31 [level] __device__(
const uint8_t a) {
32 return is_factor_active(a, level);
36 active_indices.clear();
37 active_indices.resize(active_count);
40 thrust::copy_if(thrust::device, thrust::make_counting_iterator<size_t>(0),
41 thrust::make_counting_iterator<size_t>(count), active.begin(),
42 active_indices.begin(), [level] __device__(
const uint8_t a) {
43 return is_factor_active(a, level);