The short story is that most of the cuda API is asynchronous and so it will just queue up the work to be done and return immediately. Only when you try to access the value (by asking to copy it on cpu here) will it actually wait for the computations to be done.
the synchronize force this waiting to happen and so is very convenient when measuring CPU time to know if a slow call is because of outstanding ops still running asynchronously on the GPU or the call itself.