Based on your description it sounds as if you are indeed not properly synchronizing the code while trying to profile it and are thus “moving” the time allocations around. To profile operations you need to synchronize the code before starting and stopping each timer. Otherwise your timers could only profile the kernel launch and would accumulate the entire runtime in the next blocking call.