[−][src]Function emu_core::spawn::spawn
pub fn spawn(num_threads: u32) -> Spawner
Constructs a Spawner
with the given number of threads spawned
Each spawn(n)
will spawn a new dimension of threads of size n
. In other words, for each thread already spawned, n
threads are spawned.
If more than 3 dimensions are added, all dimensions are collapsed into the "x" dimension where the size
of the "x" dimension is now the product of all sizes of dimensions so far. Until 3 dimensions of threads have been spawned,
threads will be spawned on dimensions "x", "y", and "z" in that order.
This can be used in conjunction with Spawner
as follows. spawn
returns a Spawner
which lets you .spawn
more dimensions of threads.
// don't forget - this should always be the first thing you call // don't assume there is a device available without calling this // if there isn't one, you will recieve a runtime panic futures::executor::block_on(assert_device_pool_initialized()); // move data to a device let data = vec![1.0; 1 << 20]; let mut data_on_gpu: DeviceBox<[f32]> = data.as_device_boxed_mut()?; // compile a kernel let kernel: GlslKernel = GlslKernel::new() .param_mut::<[f32], _>("float[] data") .param::<f32, _>("float scalar") .with_kernel_code(r#" uint index = (1 << 10) * gl_GlobalInvocationID.x + gl_GlobalInvocationID.y; data[index] = data[index] * scalar; "#); let c = compile::<GlslKernel, GlslKernelCompile, _, GlobalCache>(kernel)?.finish()?; // run the compiled kernel unsafe { spawn(1 << 10) .spawn(1 << 10) .launch(call!(c, &mut data_on_gpu, &DeviceBox::new(10.0f32)?))?; } // download data from the GPU and check the result assert_eq!(futures::executor::block_on(data_on_gpu.get())?, vec![10.0; 1 << 20].into_boxed_slice());