본문 바로가기

CUDA 프로그래밍10

CUDA 스트림(stream)을 활용한 동시성 향상 CUDA 스트림(stream)은 호스트 코드에서 기술된 순서대로 디바이스에서 동작하는 일련의 연속된 연산을 의미한다. 스트림 안의 연산들은 순차적인 실행이 보장되지만, 다른 스트림의 연산과는 함께 동작할 수 있다. 특히 GPU의 실행 리소스가 허락된다면, 서로 다른 스트림의 커널도 동시에(concurrently) 실행될 수 있다. 일반적으로 소개되고 있는 예제에서는 데이터 전송(data transfer)을 1)호스트에서 동작 중인 연산, 2)디바이스에서 동작 중인 연산, 3)또 다른 데이터 전송과 중첩되게 하기 위해 CUDA 스트림을 사용하는 경우를 보여준다. CUDA의 모든 디바이스 연산은 스트림 안에서 실행되어야 한다. 따라서 스트림이 지정되지 않는다면, 널 스트림(null stream)이라고도 하는.. 2020. 3. 21.
dynamic parallelism을 활용한 quick sort Dynamic Parallelism의 간단한 개념 설명) https://hayunjong83.tistory.com/22 CUDA 샘플 코드에서는 dynamic parallelism을 설명하기 위해, quick sort 코드를 제공하고 있다. depth가 너무 커지거나 일정 임계값 이하의 원소를 정렬할 때는 선택정렬(selection sort)를 사용한다. 퀵 정렬 알고리즘 자체는 기존의 흔한 구현과 다르지 않다. 피벗을 기준으로 왼쪽과 오른쪽을 다시 정렬할 스레드를 선언하여 재귀적으로 다시 커널을 호출한다. 이 때 dynamic parallelism을 이용하므로, 중간 결과를 다시 호스트로 memcpy할 필요가 없으며, stream을 이용하므로 각 부분의 정렬이 다른 부분의 정렬과의 무의미한 동기화를 위.. 2020. 3. 6.
Dynamic Parallelism 이란? 케플러 이전의 GPU에서는 오직 CPU만이 디바이스에 작업을 할당할 수 있었다. 하지만 dynamic parallelism이 도입되면서 GPU의 작업 중인 스레드가 새로운 그리드를 생성하고 작업을 할당할 수 있게 되었다. 실행 중인 CUDA 커널은 새롭게 중첩된(nested) 작업을 생성하고 동기화 할 수 있다. 이 때 원래의 커널을 부모 커널(Parent CUDA Kernel)이라고 하고, 새롭게 생성된 커널을 자식 커널(Child CUDA Kernel)이라고 한다. 부모 커널은 자식 커널에 의해 생성된 결과를 사용할 수 있으며, 이 때 CPU가 개입될 필요가 없다. 또한 재귀 호출도 가능하다. dynamic parallelism을 이용한다면, 한 커널의 결과를 입력으로 하는 새로운 커널을 시작할 때 .. 2020. 3. 5.
CUDA Event를 이용한 커널(SAXPY) 실행시간 측정 호스트의 타이머 함수를 사용할 경우, cudaDeviceSynchronize( )와 같은 명시적인 배리어 함수를 사용해야한다. 이 경우 GPU 파이프라인이 stall되는 문제 등이 발생될 수 있다. 따라서 CUDA 런타임에서 제공하는 event API를 사용해서 커널의 실행 시간을 측정하는 방식을 이용하는 것이 좋다. CUDA 이벤트 데이터 타입인 cudaEvent_t 를 사용하는 다음의 함수들을 사용한다. __host__ cudaError_t cudaEventCreate( cudaEvent_t* event) __host__ __device__ cudaError_t cudaEventDestroy(cudaEvent_t* event) __host__ __device__ cudaError_t cudaEvent.. 2020. 3. 4.