[−][src]Trait emu_core::boxed::AsDeviceBoxed
A trait for creating a DeviceBox<T> from a reference to an object T
It is implemented for all T (even unsized) where T can be safely serialized.
To ensure you can safely serialize your data, you should use #[derive(AsBytes)]
from zerocopy. If you just want to see some examples of how to create a DeviceBox from types for which AsDeviceBoxed is already implemented,
then just go to the docs for DeviceBox.
You can implement this trait for your own collection if you would like to have
your collection somehow sends its encapsulated data over to a DeviceBox on the GPU.
use {emu_core::prelude::*, emu_glsl::*, zerocopy::*}; // for some reason, we want to store Molecules as an array-of-structures on the GPU // so we define this type for each element of the array #[repr(C)] #[derive(AsBytes, FromBytes, Copy, Clone, Default, Debug, PartialEq)] struct Molecule { position: f64, velocities: f64, forces: f64, } // this is the collection we would like to be able to move to the GPU easily #[derive(Default)] struct Molecules { num_molecules: usize, positions: Vec<f64>, velocities: Vec<f64>, forces: Vec<f64>, } impl Molecules { fn zero(num_molecules: usize) -> Self { Self { num_molecules, positions: vec![0.0; num_molecules], velocities: vec![0.0; num_molecules], forces: vec![0.0; num_molecules], } } } impl AsDeviceBoxed<[Molecule]> for Molecules { fn as_device_boxed(&self) -> Result<DeviceBox<[Molecule]>, NoDeviceError> { Ok((0..self.num_molecules).map(|idx| Molecule { position: self.positions[idx], velocities: self.velocities[idx], forces: self.forces[idx], }).collect::<Vec<Molecule>>().as_device_boxed()?) } fn as_device_boxed_mut(&self) -> Result<DeviceBox<[Molecule]>, NoDeviceError> { Ok((0..self.num_molecules).map(|idx| Molecule { position: self.positions[idx], velocities: self.velocities[idx], forces: self.forces[idx], }).collect::<Vec<Molecule>>().as_device_boxed_mut()?) } } fn main() -> Result<(), Box<dyn std::error::Error>> { futures::executor::block_on(assert_device_pool_initialized()); let molecules = Molecules::zero(4096); let molecule_list_on_gpu: DeviceBox<[Molecule]> = molecules.as_device_boxed_mut()?; assert_eq!(futures::executor::block_on(molecule_list_on_gpu.get())?, vec![Molecule::default(); 4096].into_boxed_slice()); Ok(()) }