#include <sycl/sycl.hpp>
#include <sycl/sycl.hpp>
#define WARP 32
for (int offset = WARP / 2; offset > 0; offset /= 2) {
v += sycl::sub_group::shuffle(0xFFFFFFFFu, v, item.get_sub_group().get_local_id()() - offset);
}
return v;
}
return sycl::sub_group::ballot(0xFFFFFFFFu, predicate);
}
return sycl::sub_group::any(0xFFFFFFFFu, predicate);
}
return sycl::sub_group::all(0xFFFFFFFFu, predicate);
}
void warp_demo(const int* in, int* out, int n) {
__shared__ int shared[WARP];
int tid = item.get_local_id();
int gid = item.get_group(0) * item.get_local_range() + tid;
int lane = item.get_sub_group().get_local_id()();
int v = (gid < n) ? in[gid] : 0;
int pred = (v > 0) ? 1 : 0;
int ballot = warp_ballot(pred);
int any_pos = warp_any(pred);
int all_pos = warp_all(pred);
int active = sycl::sub_group::get_local_range();
v = warp_sum(v);
item.barrier() ;
if (lane == 0) {
shared[tid / WARP] = v;
atomicAdd(out, v);
atomicMin(out + 1, ballot);
atomicMax(out + 2, active);
}
item.barrier(sycl::access::fence_space::global_space);
if (tid == 0) {
atomicAdd(out + 3, any_pos);
atomicAdd(out + 4, all_pos);
}
}
int main(void) {
const int N = 1 << 16;
int* d_in = nullptr;
int* d_out = nullptr;
cudaMalloc((void**)&d_in, N * sizeof(int));
cudaMalloc((void**)&d_out, 5 * sizeof(int));
cudaMemset(d_out, 0, 5 * sizeof(int));
dim3 grid(N / 256);
dim3 block(256);
{ }); }); smem=none stream=default args=d_in, d_out, N };
cudaDeviceSynchronize();
cudaFree(d_in);
cudaFree(d_out);
return 0;
}