1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use gpgpu::BufOps;
fn main() {
let fw = gpgpu::Framework::default();
let shader = gpgpu::Shader::from_wgsl_file(&fw, "examples/ndarray/shader.wgsl").unwrap();
let dims = (3200, 3200);
let array_src = ndarray::Array::<i32, _>::ones(dims) * 2;
let src_view = array_src.view();
let gpu_arrays_len = gpgpu::GpuUniformBuffer::from_slice(&fw, &[dims.0, dims.1]);
let gpu_array_a = gpgpu::GpuArray::from_array(&fw, src_view).unwrap();
let gpu_array_b = gpgpu::GpuArray::from_array(&fw, src_view).unwrap();
let gpu_array_c = gpgpu::GpuArray::from_array(&fw, ndarray::Array::zeros(dims).view()).unwrap();
let desc_0 = gpgpu::DescriptorSet::default().bind_uniform_buffer(&gpu_arrays_len);
let desc_1 = gpgpu::DescriptorSet::default()
.bind_array(&gpu_array_a, gpgpu::GpuBufferUsage::ReadOnly)
.bind_array(&gpu_array_b, gpgpu::GpuBufferUsage::ReadOnly)
.bind_array(&gpu_array_c, gpgpu::GpuBufferUsage::ReadWrite);
let program = gpgpu::Program::new(&shader, "main_fn_2")
.add_descriptor_set(desc_0)
.add_descriptor_set(desc_1);
gpgpu::Kernel::new(&fw, program)
.enqueue(dims.0 as u32 / 32, dims.1 as u32 / 32, 1);
let array_output = gpu_array_c.read_blocking().unwrap();
for (cpu, gpu) in array_src.iter().zip(array_output) {
assert_eq!(2 * cpu, gpu)
}
}