torch.cuda.synchronize - PyTorch 1.12 documentation
[Pytorch] 파이토치 시간 측정, How to measure time in PyTorch
pytorch 튜토리얼에서 학습시작시에 해주는 torch.cuda.synchrosize()
에 대해 알아봤다.
보통 실행시간 측정에 관련된 글들이 많이 보인다.
공식 문서에는 다음과 같이 나와있다.
<aside> 💡 Waits for all kernels in all streams on a CUDA device to complete.
</aside>
이 외에는 설명이 없다.
GPU에서 실행되는 함수를 호출할 때 이 함수를 보통 kernel이라고 부르고 호출된다는 것을 launch라고 한다.
C/C++코드들의 함수호출과 달리 kernel launch는 비동기적(asynchronous)이다. 즉 CPU코드는 kernel이 완료되는 것을 기다리지 않고 바로 다음 코드를 실행한다.
따라서 torch.cuda.synchronize()
를 호출하면 host(CPU) 코드가 device(GPU) 코드의 완료를 기다리게 하고 device 코드가 완료되면 CPU가 실행을 재개한다.
그래서 cuda호출이 비동기식이기에 timer 시작 / 중지 이전에 torch.cuda.synchronize()를 통해 코드를 동기화시켜주어야 정확히 시간을 측정할 수 있다는 것이다.
따라서 맨 위에서 북마크로 제시한 바와 같이 여러 커뮤니티에서 다음과 같이 시간을 측정해야한다고 한다.
## 2개의 cuda tensors ( x, y )를 더하는 연산의 예시
starter = torch.cuda.Event(enable_timing=True)
ender = torch.cuda.Event(enable_timing=True)
starter.record()
z = x + y
ender.record()
torch.cuda.synchronize()
op_time = starter.elapsed_time(ender)
print(op_time)
torch.cuda.Event