  To be able to run tasks asynchronously on NVIDIA GPUs a programmer must
explicitly implement asynchronous execution in their code using the syntax of
CUDA streams. Streams allow a programmer to launch independent concurrent
execution tasks, providing the ability to utilise different functional units on
the GPU asynchronously. For example, it is possible to transfer the results
from a previous computation performed on input data n-1, over the PCIe bus
whilst computing the result for input data n, by placing different tasks in
different CUDA streams. The benefit of such an approach is that the time taken
for the data transfer between the host and device can be hidden with
computation. This case study deals with the implementation of CUDA streams into
AstroAccelerate. AstroAccelerate is a GPU accelerated real-time signal
processing pipeline for time-domain radio astronomy.
