본문 바로가기

School Study/Multi Core Programming

CUDA Stream & Concurrent Execution

CUDA Stream
→ Host에서 Device로 명령을 보내는 통로(Host에서 호출하는 명령들이 차례대로 들어감)

Stream 개념

Types of CUDA Stream

  • NULL stream → 암묵적으로 선언된 stream
    • 사용할 stream을 명시하지 않은 경우(default stream)
  • Non-NULL stream → 명시적으로 선언된 stream
    • 명시적으로 생성 및 사용

하나의 stream에 들어온 명령은 순서대로 Device에 의해 처리된다.
→ Synchronous execution

C()  B()  A()

Synchronous execution

하지만 서로 다른 stream에 있는 명령들은 순서가 정해져 있지 않다.(비동기적)
즉, stream들이 명시되어 있으면 비동기적인 stream이 될 수 있다.

Asynchronous execution

 

Concurrent Execution
→ 서로 다른 stream에 있는 작업 중 일부는 시에 수행될 수 있다.

동시에 수행(overlap)이 가능한 작업들

  • Host computation and device computation
  • Host computation and host-device data transfer
  • Device computation and host-device data transfer
  • Concurrent device compuatations

* 동시 수행 능력은 GPU마다 다를 수 있다.

동시에 작업이 가능하기 때문에 이를 활용하면 높은 성능을 낼 수 있다.
아래 그림을 살펴보자.

Concurrent Execution

stream을 3개로 나눴을 때 다음과 같이 동시에 작업이 처리될 수 있다.

 

그렇다면 어떻게 non-NULL Stream을 만드는지 알아보자.

  • Create/Destory
    • Data type : cudaStream_t
    • cudaError_t cudaStreamCreate(cudaStream_t*)
    • cudaError_t cudaStreamDestory(cudaStream_t)
1
2
3
4
cudaStream_t stream;
cudaStreamCreate(&stream);
myKernel<<<dimGrid, dimBlock, 0, stream>>>(...)
cudaStreamDestory(stream);
cs

 

Synchronous data transfer

1
2
cudaMemcpy(d_a, a, memSize, cudaMemcpyHostToDevice);
cudaMemcpy(b, d_b, memSize, cudaMemcpyDeviceToHost);
cs

 

Asynchronous data transfer

  • Device and Host compuatation과 동시에 수행될 수 있음
  • Stream에 명령을 넣은 후, 제어를 바로 반환
  • Pinned memory에만 사용 가능

 

Pinned Memory

  • Page-locked memory
    • 메모리에 상주하는 Page(Swap-out되지 않는다.)
    • Host-device 사이의 Asynchronous data transfer를 위해서는 host memory가 Page-locked상태여야 함
      • Data transfer 중 해당 영역이 메모리 상에 존재함이 보장되어야 함
      • 속도도 더 빠름
  • Pinned memory allocation
    • cudaError_t cudaMallocHost(void ** ptr, size_t size)
    • cudaError_t cudaFreeHost(void *ptr)
  • Asynchronous memory transfer
    • cudaError_t cudaMemCpyAsync(void* dst, const void* src, size_t size,
                                                enum cudamemcpyKind, cudaStream_t stream=0)

 

명시적인 Stream Synchronization

  • cudaError_t cudaDeviceSynchronize()
    • 모든 stream에 대한 synchronization
  • cudaError_t cudaStreamSynchronize(cudaStream_t)
    • 해당 stream에 대한 synchronization
  • cudaError_t cudaStreamQuery(cudaStream_t)
    • 해당 stream의 현재 확인
  • CudaEvent

 

암묵적인 Stream Synchronization

다음 operation들 다음에는 암묵적인 barrier가 존재(concurrent execution 불가능)

  • A page-locked host memory allocation
  • A device memory allocation
  • A device memory set
  • A memory copy between two addresses to the same device memory
  • Any CUDA command to the NULL stream
  • A switch between the L1/shared memory configurations

 

'School Study > Multi Core Programming' 카테고리의 다른 글

CUDA Event  (0) 2019.05.21
Synchronization in CUDA  (0) 2019.05.21
Maximizing Memory Throughput  (0) 2019.05.14
CUDA Memory Model  (0) 2019.05.07
CUDA Execution Model  (0) 2019.05.07