As I understand, clEnqueueNDRangeKernel(), enqueues the kernel and returns. If the kernel writes to a memory that I have to retrieve, I will have to wait for the kernel to complete before I can copy the data from the device memory to the host memory. So will one come to know if the kernel hash finished execution. Will clEnqueueReadBuffer() wait till the kernel, which is using the buffer object that it(clEnqueueReadBuffer() ) is trying to retrieve, to finish execution, before retrieving the buffer object?