#include <sycl/sycl.hpp>
#include <sycl/sycl.hpp>
#include <sycl/sycl.hpp>
#define WARP 32
float c_scale[4];
return v * c_scale[idx & 3];
}
if (v < 0.0f) return 0.0f;
return __sinf(v);
}
__launch_bounds__(256, 2)
void apply(const float* in, float* out, int n) {
int i = item.get_group(0) * item.get_local_range() + item.get_local_id();
if (i < n) {
float v = fast_scale(in[i], i);
out[i] = slow_path(v);
}
}
void warp_sum(const float* in, float* out, int n) {
int lane = item.get_sub_group().get_local_id()();
float v = (item.get_local_id() < n) ? in[item.get_local_id()] : 0.0f;
item.barrier() ;
__shared__ float partial[WARP];
partial[lane] = v;
item.barrier(sycl::access::fence_space::global_space);
if (lane == 0) {
float s = 0.0f;
for (int i = 0; i < WARP; ++i) s += partial[i];
out[item.get_group(0)] = s;
}
}
int main(void) {
const int N = 1 << 18;
float* d_in = nullptr;
float* d_out = nullptr;
float* d_warp = nullptr;
cudaMalloc((void**)&d_in, N * sizeof(float));
cudaMalloc((void**)&d_out, N * sizeof(float));
cudaMalloc((void**)&d_warp, (N / WARP) * sizeof(float));
float scale_init[4] = {1.0f, 2.0f, 3.0f, 4.0f};
cudaMemcpyToSymbol(c_scale, scale_init, sizeof(scale_init));
dim3 grid(N / 256);
dim3 block(256);
{ }); }); smem=none stream=default args=d_in, d_out, N };
{ }); }); smem=none stream=default args=d_in, d_warp, N };
cudaDeviceSynchronize();
cudaFree(d_in);
cudaFree(d_out);
cudaFree(d_warp);
return 0;
}