#include <sycl/sycl.hpp>
#include <sycl/sycl.hpp>
#define NBINS 256
int c_binMax[1];
if (v < 0) return 0;
if (v > c_binMax[0]) return c_binMax[0];
return v;
}
void histogram(const int* data, int n, int* bins) {
__shared__ int local_bins[NBINS];
int tid = item.get_local_id();
int bid = item.get_group(0) * item.get_local_range() + tid;
for (int i = tid; i < NBINS; i += item.get_local_range()) {
local_bins[i] = 0;
}
item.barrier(sycl::access::fence_space::global_space);
for (int i = bid; i < n; i += item.get_global_range() / item.get_local_range() * item.get_local_range()) {
int b = clamp_bin(data[i]);
atomicAdd(&local_bins[b], 1);
}
item.barrier(sycl::access::fence_space::global_space);
for (int i = tid; i < NBINS; i += item.get_local_range()) {
if (local_bins[i] > 0) {
atomicAdd(&bins[i], local_bins[i]);
atomicMin(&bins[i], c_binMax[0]);
atomicMax(&bins[i], 0);
}
}
}
void warp_reduce(const int* in, int* out) {
int lane = item.get_sub_group().get_local_id()();
int v = in[item.get_local_id()];
for (int offset = 32 / 2; offset > 0; offset /= 2) {
int t = sycl::sub_group::shuffle(0xFFFFFFFFu, v, lane - offset);
v += t;
}
item.barrier() ;
if (lane == 0) {
out[item.get_group(0)] = v;
}
}
int main(void) {
const int N = 1 << 20;
int* d_data = nullptr;
int* d_bins = nullptr;
int* d_out = nullptr;
cudaMalloc((void**)&d_data, N * sizeof(int));
cudaMalloc((void**)&d_bins, NBINS * sizeof(int));
cudaMalloc((void**)&d_out, 1024 * sizeof(int));
cudaMemset(d_bins, 0, NBINS * sizeof(int));
cudaMemcpy(d_data, d_data, N * sizeof(int), cudaMemcpyDeviceToDevice);
int maxbin = NBINS - 1;
cudaMemcpyToSymbol(c_binMax, &maxbin, sizeof(int));
dim3 grid(N / 256);
dim3 block(256);
{ }); }); smem=none stream=default args=d_data, N, d_bins };
{ }); }); smem=none stream=default args=d_data, d_out };
cudaDeviceSynchronize();
cudaFree(d_data);
cudaFree(d_bins);
cudaFree(d_out);
return 0;
}