#4 OpenCL 튜토리얼. 이미지 프로세싱에 들어가기 전, 전체 워크플로우 학습
아마 OpenCL의 전체적인 워크 플로우가 머릿 속에 들어오지 않아 세부적인 이해가 되지 않는 분이 있으리라 생각됩니다.
전체적인 작업의 흐름이 머릿속에 들어오는 것이 무엇보다 중요하므로 확실히 알 수 있도록 정리를 하고 이미지 프로세싱에 들어가려 합니다.
Initialization
initialization 부분은 GPU에서 병렬처리 작업을 할 수 있도록 CPU와 GPU간의 인터페이스를 정의하고 GPU에서 실행할 함수를 정의하는 부분입니다.
아래 6개의 설정을 마침으로서 OpenCL을 통해 GPU에 작업을 명령할 수 있는 환경을 갖출 수 있게 됩니다. 각 용어에 대한 설명은 본 블로그 OpenCL 튜토리얼 초반부에 잘 설명되어 있으니 참고하시기 바랍니다.
-Platform 선택
-Device 선택
-선택한 Device를 이용해 Context 생성
-Context와 Device를 이용해 Command Queue 생성
-CL파일을 컴파일 및 빌드하여 Program 생성
-생성한 Program으로부터 실행에 필요한 Kernel 생성
소스에 대한 간략한 설명입니다.
현재 PC내에 몇개의 Platform이 있는지 알 수 없으므로 platformCount에 platform의 개수를 받아오고, platform의 개수만큼 공간을 할당한 후에 platform들을 받아오는 과정입니다.
Device도 마찬가지입니다. context는 특정 디바이스로 작업이나 데이터를 전송할 수 있게 해주는 작업대같은 개념으로 device파라미터를 이용해 생성하게 됩니다.
queue는 GPU에서 실행 할 작업을 전송하는 부분으로 Context와 Device 파라미터를 이용해 생성합니다.
생성한 CL파일을 clCreateProgramWithSource를 이용해 컴파일하고 컴파일한 프로그램을 빌드 함으로써 사용할 준비를 합니다.
그리고 clCreateKernel()을 이용해 빌드한 프로그램 내에서의 커널 함수를 받아와 사용할 준비를 합니다. 커널은 한 CL파일 내에서 여러개 만들어서 사용할 수 있으며 kernel의 이름별로 따로따로 받아와 개별적인 함수를 호출하는 것 처럼 사용 할 수 있습니다.
Kernel Excution
실제로 GPU 메모리상에 데이터를 업로드하고 커널을 수행하는, 실제로 GPU연산을 실행하는 부분 입니다.
-Device Buffer생성
-Device Buffer에 데이터 입력
-Global Size 설정
-Kernel 매개변수 설정
-Command Queue를 이용하여 Kernel 실행
-Device로부터 연산이 완료된 Buffer Data 읽기
파라미터를 설정하고 실행하는 커널은 256*256사이즈의 d_inputImage에 num값을 더해 d_outputImage에 저장한 후 읽어오는 과정을 수행합니다.
전체 워크플로우
모든 과정을 합친 전체적인 워크플로우는 다음과 같습니다. 계속 읽어보시고 과정을 머릿속에 완전히 익히는 것이 중요합니다. 중간중간 사용되는 용어는 이전 강의나 검색을 통해서 참고하여 확실히 뜻을 알아 두어야 합니다.
-Platform 선택
-Device 선택
-선택한 Device를 이용해 Context 생성
-Context와 Device를 이용해 Command Queue 생성
-CL파일을 컴파일 및 빌드하여 Program 생성
-생성한 Program으로부터 실행에 필요한 Kernel 생성
-Device Buffer생성
-Device Buffer에 데이터 입력
-Global Size 설정
-Kernel 매개변수 설정
-Command Queue를 이용하여 Kernel 실행
-Device로부터 연산이 완료된 Buffer Data 읽기