use gpgpu::BufOps;
fn main() {
let fw = gpgpu::Framework::default();
let shader = gpgpu::Shader::from_wgsl_file(&fw, "examples/simple-compute/shader.wgsl").unwrap();
let size = 10000;
let data_a = (0..size).into_iter().collect::<Vec<u32>>(); let data_b = (0..size).into_iter().rev().collect::<Vec<u32>>();
let gpu_vec_a = gpgpu::GpuBuffer::from_slice(&fw, &data_a); let gpu_vec_b = gpgpu::GpuBuffer::from_slice(&fw, &data_b); let gpu_vec_c = gpgpu::GpuBuffer::with_capacity(&fw, size as u64);
let bindings = gpgpu::DescriptorSet::default() .bind_buffer(&gpu_vec_a, gpgpu::GpuBufferUsage::ReadOnly) .bind_buffer(&gpu_vec_b, gpgpu::GpuBufferUsage::ReadOnly) .bind_buffer(&gpu_vec_c, gpgpu::GpuBufferUsage::ReadWrite);
let program = gpgpu::Program::new(&shader, "main").add_descriptor_set(bindings);
let kernel = gpgpu::Kernel::new(&fw, program);
kernel.enqueue(size as u32, 1, 1);
let gpu_result = gpu_vec_c.read_vec_blocking().unwrap();
for (idx, (a, b)) in data_a.into_iter().zip(data_b).enumerate() {
let cpu_mult = a * b;
let gpu_mult = gpu_result[idx];
assert_eq!(cpu_mult, gpu_mult);
}
}