Changed to out of order execution model using events and non blocking reads. For memory reads and writes the event synchronisation is handled automatically by specifying argument types to kernels.