[Pascal Architecture] Compute Preemption (Pixel Level Preemption)

Pascal architecture부터는 instruction level execution preemption이 가능하다고 한다. 실제 이 기능은 상당히 만족스럽다. 기존 Kepler, Maxwell GPU를 사용할 때 CUDA 프로그램과 그래픽 연산을 동시에 사용하면 화면이 검은색으로 변하면서 CUDA 프로그램이 완료될 때 까지 아무것도 할 수 없는 상태로 변한다. 하지만 Pascal architecture부터는 2개를 동시에 사용해서 화면이 꺼지거나 하는 현상이 없어졌다. 그 이유가 instruction level execution preemption 때문으로 추측한다 (2번째 출처에 따르면 실제로 이 이유 때문이라고 한다).

ns_attach_image_4631480315056899

그림 1: Preemption과 Non-Preemption의 차이

우선 preemption이 무엇인지 설명이 필요하다. Preemption이란 processor에 실행되는 여러 개의 task를 교체하면서 실행하는 방법이다. 교체하는 task들은 모든 execution이 완료되기 전에 교체된다는 의미이다. 그림 1은 preemptive와 non-preemptive의 차이를 보여준다. Process 1을 일정 시간 실행 후 Process 2가 실행되고 다시 Process 1이 실행되는 순서를 반복한다. 반면 non-preemptive 경우 task가 완료될 때까지 switch가 불가능한 경우다. Preemption은 switch 가능 시간에 따라 Coarse grained와 Find grained로 분류할 수 있다.

Fine-grained (Fine-grained context switching)은 switch가 필요할 때 거의 바로 switch가 발생하는 것을 의미한다. 반명 Coarse grained (Coarse-grained context switching)의 경우 특정 시간(또는 정해진 포인트)에서만 switch가 가능한 것을 의미한다. Context switching을 하면 성능이 올라갈 수도 있고 또는 사용자의 편의가 좋아질 수도 있는 부분이다. GPU의 경우 사용자의 편의를 위한 편이 크다고 본다. Preemption이 발생하지 않을 때 오히려 GPU의 성능은 더 좋을 수 있다고 생각한다. (기본적으로 GPU는 상당히 큰 register file을 가지고 있으므로 execution state를 모두 DRAM에 저장하는 overhead가 상당할 것이다. 그래서 preemption을 하면 성능에 이득이 될 수가 없다)

Kepler, Maxwell에서는 thread block execution preemption이 가능하다. 기존 architecture는 thread block의 모든 thread의 실행이 완료돼야지 preemption이 가능하다고 한다. 실제로 이러한 이유로 하나의 GPU에서 compute workload (CUDA 프로그램)와 모니터를 디스플레이하는 부분을  동시에 사용하면 모니터가 검은색으로 변하면서 멈추는 현상이 발생한다. Thread block의 실행 시간은 상대적으로 길 수도 있고 짧을 수도 있다. 결과적으로 제한적인 포인트에서만 preemption이 가능하여서 사용자의 입장에서는 불편함이 존재한다.

ns_attach_image_4861480315682206

그림 2: Pascal Pixel Level Preemption (Instruction Level Preemption)

이번 Pascal architecture에서는 instruction-level preemption (Pixel level preemption)이 가능하다고 한다. 그림 2는 instruction level execution preemption의 예를 보여준다. 기존 architecture와 달리 thread block의 모든 thread의 execution이 완료되지 않아도 중간에 preemption이 가능하다. Instruction level preemption이 가능하면 GPU 1개를 사용하여 CUDA 프로그램 및 debug하기에 이점이 많다. 기존에는 2개의 GPU를 사용해야지만 가능했던 부분이였다 (1개는 그래픽 연산, 1개는 compute 연산). 또한, 기존 Maxwell, Kepler architecture에서는 debug를 하기 위해서는 debug용 instruction을 compile 할 때 추가해야 한다.

물론 Fine-grained context switching을 하면 context switch를 하는데 큰 overhead가 발생한다. 더 많은 state 정보를 저장하고 불러오는 과정이 필요하다. NVIDIA에 따르면 instruction level preemption을 하는데 걸리는 시간은 대략 100 us (0.1ms)이라고 발표하였다. 이 시간은 기존 Maxwell의 Coarse grained-context switching보다 빠른 시간이라고 이야기한다 (도대체 어떻게 이게 가능한건지…). 아주 긴 실행시간을 가진 task에 비하면 context switching 시간 (0.1ms)는 큰 overhead는 아니지만, 너무 자주 사용하면 성능 하락이 발생할 수 있다.

출처

  1. https://images.nvidia.com/content/pdf/tesla/whitepaper/pascal-architecture-whitepaper.pdf
  2. http://www.anandtech.com/show/10325/the-nvidia-geforce-gtx-1080-and-1070-founders-edition-review/10

Leave a Comment