## Advanced data flow
## Learning Objectives * Learn about ways to use initial data with USM
#### Initial data
* Often when writing SYCL kernel functions there is initial data which has been allocated somewhere else in the application.
#### Initial data (USM)

auto devicePtr = sycl::malloc_device(sizeInBytes, gpuQueue);

gpuQueue.memcpy(devicePtr, initialData, sizeInBytes).wait();
						
* When using the USM model (unless using system USM) pointers passed to kernel functions must be allocated by the SYCL runtime. * This means you have to copy the initial data to the USM memory allocation using `memcpy`.
#### Initial data (USM)

auto sharedData = sycl::malloc_shared(sizeInBytes, gpuQueue);
						
* Alternatively if your device supports shared USM allocations you can allocate memory which is shared across the host and device. * Then there is no need to copy the data to the device.
## Questions