OpenCL 프로그래밍 가이드

 

 

저자: 아프탑 문시, 베네딕트 R. 가스터, 티모시 G. 맷슨, 제임스 펑, 단 긴스부르크

역자: 이영민

출간일: 20121129()

정가: 35,000

페이지: 576p

판형: 190 x 245

ISBN: 978-89-94774-25-1 (93560)

원서정보: OpenCL Programming Guide

 

관련분류

-컴퓨터공학 > 마이크로 프로세서

-프로그래밍 언어 > 프로그래밍 언어 기타

 

 

책 소개

 

OpenCL에 대한 종합적이고 실용적인 가이드

 

이 책은 OpenCL 프로그래밍 모델을 완전하게 기술하고 있다. 공저자 중 한명인 Aaftab은 이 시스템을 개발한 핵심 인물이다. 그는 OpenCL의 다른 주요 설계자들과 함께 이해하기 쉬운 가이드를 작성하는 데 동참하였다.

- Pat Hanrahan 교수, 스탠퍼드 대학교

 

이 책은 OpenCL이 등장한 배경부터 시작하여, 전체적인 개념과 큰 그림을 보여주고 나서, 세부적인 주제별로 각각의 API들에 대해 온전히 기술하고 있으며, 후반부에는 사례연구들을 통해서 OpenCL을 이용한 병렬 프로그래밍에 대한 구체적인 예들을 보여주고 있다. 이 책은 컴퓨터 구조와 병렬 프로그래밍에 대한 지식이 깊지 않은 독자라도, OpenCL 프로그래밍이 앞으로 널리 사용될지, 알고리즘의 다양한 병렬성을 서로 다른 OpenCL 디바이스들에서 어떻게 구현할 수 있는지를 충실하게 설명하고 있다. 무엇보다, OpenCL은 다양한 이종의 디바이스들을 구분하고 효율적으로 관리하기 위해 많은 API들을 제공하는데, 이 책은 그 많은 API들을 예제를 사용하여 상세하게 설명하고 있다. 따라서 이 책은 훌륭한 OpenCL 입문서이자, OpenCL에 익숙해지고 나서도 OpenCL 프로그래밍을 하는 동안 늘 참고할 수 있는 실용적인 참고서다.

-역자의 글 중에서

 

OpenCL (Open Compute Language)이라는 새로운 표준을 가지고, 여러분은 사용 가능한 모든 프로그래밍 자원들을 접근하는 응용 프로그램을 작성할 수 있다. 이 자원들은 CPU, GPU, 그리고 DSP Cell/B.E. 프로세서와 같은 다른 프로세서들을 모두 포함한다. Apple, AMD, Intel, IBM, NVIDIA와 기타 제조사들에 의해 이미 구현되었듯이, OpenCL PC와 서버, 모바일/임베디드 기기, 고성능 컴퓨팅, 심지어 클라우드 시스템에 이르기까지 다양한 플랫폼에 대해 뛰어난 가능성을 가지고 있다. 이 책은 특별히 개발자와 소프트웨어 아키텍트를 위해 쓰인, OpenCL에 대한 종합적이고 실용적인 가이드다.

 

OpenCL 표준을 이끄는 권위 있는 다섯 저자들이 쓴 “OpenCL 프로그래밍 가이드 OpenCL 명세를 전부 다룬다. OpenCL의 주요 용도를 살펴보고, OpenCL로 다양한 종류의 병렬 알고리즘들을 어떻게 표현하는지 보여준다. 또한, 이 책은 API OpenCL C 프로그래밍 언어에 대한 완전한 참고서다.

 

저자들은 사례 연구와 다운로드할 수 있는 코드 예제들을 사용해서, 입력 작업을 서로 다른 여러 디바이스에 나누어 실행하는 복잡한 병렬 프로그램을 작성하는 법을 보여준다. 또한, 하드웨어에 대한 질의 및 조정을 포함해서 OpenCL 소프트웨어 성능 최적화에 관한 필수 요소들을 모두 설명하고 있다.

 

이 책에 포함된 내용은 다음과 같다:

 

l  OpenCL의 아키텍처, 개념, 용어, 목표, 만들어진 이유 이해하기

l  OpenCL C와 런타임 API를 가지고 프로그래밍하기

l  버퍼, 서브버퍼, 이미지, 샘플러, 이벤트를 사용하기

l  OpenGL Microsoft사의 Direct3D를 사용해서 데이터 공유하고 동기하기

l  C++ 래퍼 API를 사용해서 개발을 단순화하기

l  OpenCL 임베디드 프로파일을 사용해서, 핸드폰에서부터 슈퍼컴퓨터 노드에 이르기까지 다양한 디바이스를 지원하기

l  물리엔진; 이미지 히스토그램, 경계선 검출 필터, 고속 푸리에 변환과 광학적 흐름과 같은 이미지 및 신호 처리; 행렬 곱셈과 고성능 희소 행렬 곱셈과 같은 수학 라이브러리 등을 사례 연구를 통해 다루기

 

독자대상

 

초중급

 

 

 

저자소개

 

Aaftab Munshi

Apple의 소프트웨어 아키텍트로서 OpenCL OpenGL ES 명세를 작성하였다. 그는 OpenGL ES 2.0 프로그래밍 가이드(Addison-Wesley, 2008)의 공저자다.

 

Benedict R. Gaster

AMD의 소프트웨어 아키텍트로서 차세대 이종 프로세서를 위한 프로그래밍 모델을 개발하고 있다. 그는 OpenCL의 설계에 폭넓게 이바지했다.

 

Timothy G. Mattson

1993년부터 Intel에서 일하고 있고, 1980년대 중반부터 병렬 프로그래머로 일해왔다. 그는 Patterns for Parallel Programming(Addison-Wesley, 2004) Introduction to Concurrency in Programming Languages (Chapman and Hall/CRC, 2009)의 공저자다.

 

James Fung

NVIDIA의 기술엔지니어로서, 그래픽스 하드웨어를 사용한 컴퓨터 비전과 이미지 프로세싱을 전공하였다.

 

Dan Ginsburg

보스턴의 어린이 병원에 있는 태아 신생아 신경촬영법 및 개발 과학센터의 수석 소프트웨어 아키텍트로서, 신경촬영법 알고리즘을 가속하기 위해 OpenCL을 사용하고 있다.

 

 

 

역자소개

 

이영민

2010년 이후 서울시립대학교 전자전기컴퓨터공학부 교수로 근무를 하고 있으며, 하드웨어 소프트웨어 통합설계를 통한 병렬시스템 설계방법론을 연구해왔다. 최근에는 GPU 기반 병렬 소프트웨어 설계를 최적화하는 연구에 주력하고 있으며, 음성인식, 자연언어처리, 컴퓨터비전 등의 응용을 가속하는 연구를 수행하였다. 《대규모 병렬 프로세서 프로그래밍, CUDA를 이용한 실용적 접근》(2011, 비제이퍼블릭)을 공역했다.

 

 

 

목차

 

 

PART OpenCL 언어와 API

 

Chapter 1 OpenCL에 대한 소개

OpenCL은 무엇인가? 왜 이 책이 여러분에게 필요한가?

매니코어의 미래: 이종 플랫폼

매니코어 세상에서의 소프트웨어

OpenCL의 개념적 토대

OpenCL과 그래픽스

OpenCL의 내용들

임베디드 프로파일

OpenCL 배우기

 

Chapter 2 HelloWorld: OpenCL 예제

예제 빌드하기

HelloWorld 예제

OpenCL 에러 확인하기

Chapter 3 플랫폼, 문맥, 디바이스

OpenCL 플랫폼

OpenCL 디바이스

OpenCL 문맥

 

Chapter 3 플랫폼, 문맥, 디바이스

OpenCL 플랫폼

OpenCL 디바이스

OpenCL 문맥

 

Chapter 4 OpenCL C로 프로그래밍하기

OpenCL C를 사용하여 데이터 병렬성을 지닌 커널 작성하기

스칼라 데이터형

벡터 데이터형

기타 데이터형

파생형

묵시적 형 변환

명시적인 캐스트

명시적 변환

데이터를 다른 형으로 재해석하기

벡터 연산자

지정자

키워드

전처리기 지시자와 매크로

제약

 

Chapter 5 OpenCL 내장 함수

작업 아이템 함수

수학 함수

정수 함수

공통 함수

기하 함수

관계 함수

벡터 데이터 적재 및 저장 함수

동기화 함수

비동기 복사와 미리 가져오기 함수

원자 함수

기타 벡터 함수

이미지 읽기 및 쓰기 함수

 

Chapter 6 프로그램과 커널

프로그램과 커널 객체 개요

프로그램 객체

커널 객체

 

Chapter 7 버퍼와 서브-버퍼

메모리 객체, 버퍼, 서브 버퍼 개요

버퍼와 서브-버퍼 만들기

버퍼와 서브-버퍼 질의하기

버퍼와 서브-버퍼에 대한 읽기, 쓰기, 복사하기

버퍼와 서브-버퍼 매핑하기

Chapter 8 이미지와 샘플러

이미지와 샘플러 객체에 대한 개요

이미지 객체 생성하기

샘플러 객체 생성하기

이미지 작업을 위한 OpenCL C 함수

이미지 객체 전송하기

 

Chapter 9 이벤트

명령, , 이벤트 개요

이벤트와 명령-

이벤트 객체

호스트에서 이벤트 생성하기

호스트에서의 실행에 영향을 주는 이벤트

프로파일링을 위해 이벤트 사용하기

커널 안의 이벤트

OpenCL 밖으로부터의 이벤트

 

Chapter 10 OpenGL과의 상호연동성

OpenCL/OpenGL 공유에 대한 개요

OpenGL 공유 확장에 대해 질의하기

OpenGL 상호연동성을 위해 OpenCL 문맥 초기화하기

OpenGL 버퍼로부터 OpenCL 버퍼 생성하기

OpenGL 텍스처로부터 OpenCL 이미지 만들기

OpenGL 객체에 대한 정보 질의하기

OpenGL OpenCL 사이의 동기화

 

Chapter 11 Direct3D와의 상호연동성

Direct3D/OpenCL 공유에 대한 개요

Direct3D 호환성을 위해서 OpenCL 문맥을 초기화하기

Direct3D 버퍼와 텍스처로부터 OpenCL 메모리 생성하기

OpenCL에서 Direct3D 객체 획득하고 해제하기

OpenCL에서 Direct3D 처리하기

OpenCL에서 D3D 정점 데이터 처리하기

 

Chapter 12 C++ 래퍼 API

C++ 래퍼 API 개요

C++ 래퍼 API 예외

C++ 래퍼 API를 사용하는 벡터 덧셈 예제

 

Chapter 13 OpenCL 임베디드 프로파일

OpenCL 프로파일 개요

64-비트 정수

이미지

내장 원자 함수

최소 단일정밀도 부동소수 계산능력

OpenCL C 프로그램에서 디바이스가 지원하는 프로파일 결정하기

 

 

PART OpenCL 사례 연구

 

Chapter 14 이미지 히스토그램

이미지 히스토그램 계산하기

이미지 히스토그램 병렬화하기

병렬 이미지 히스토그램에 대한 추가적인 최적화

각 채널에 대해 Half-Float 혹은 Float 값으로 히스토그램 계산하기

 

Chapter 15 Sobel 경계선 검출 필터

Soble 경계선 검출 필터란 무엇인가?

OpenCL 커널로 Sobel 필터 구현하기

 

Chapter 16 Dijkstra의 단일-소스 최단경로

그래프 알고리즘 병렬화하기

그래프 자료 구조

커널

여러 개의 계산 디바이스 사용하기

 

Chapter 17 Bullet 물리 SDK를 사용한 옷 시뮬레이션

옷 시뮬레이션에 대한 소개

연체 시뮬레이션하기

CPU에서 시뮬레이션 실행하기

기본적인 GPU 실행을 위해 필요한 변경들

두 단계 집단화

SIMD 계산에 대한 최적화와 지역 메모리

OpenGL 상호연동성 추가하기

 

Chapter 18 고속 푸리에 변환으로 Ocean 시뮬레이션하기

Ocean 응용 프로그램의 개요

Phillips 스펙트럼 생성하기

OpenCL 이산 푸리에 변환

FFT 커널 자세히 살펴보기

전치 커널 자세히 살펴보기

 

Chapter 19 광학적 흐름

광학적 흐름 문제 개요

하드웨어 선형 보간을 이용한 서브-픽셀 정확도

텍스처 캐쉬의 적용

지역 메모리 사용하기

초기 종료와 하드웨어 스케줄링

OpenGL 상호연동을 이용한 효율적인 가시화

성능

 

Chapter 20 PyOpenCL OpenCL 사용하기

PyOpenCL 소개

PyImageFilter2D 예제 수행하기

PyImageFilter2D 코드

문맥과 명령-큐 생성

이미지 객체 적재하기

프로그램을 생성하고 빌드하기

커널 인자 설정하고 커널 실행하기

결과 읽기

 

Chapter 21 OpenCL로 행렬 곱셈하기

기본적인 행렬 곱셈 알고리즘

OpenCL로 직역하기

커널별 작업량을 증가시키기

메모리 이동을 최적화하기: 지역 메모리 사용하기

성능 결과와 원래의 CPU 코드 최적화하기

 

Chapter 22 희소 행렬-벡터 곱셈

희소 행렬-벡터 곱셈(SpMV) 알고리즘

이 구현에 대한 기술

타일 분할과 패킷화된 희소 행렬 표현법

헤더 구조

타일과 패킷화된 희소 행렬 설계의 고려사항

선택적인 팀 정보

실험에 사용한 하드웨어 디바이스와 결과

추가적인 최적화 대상

 

Appendix A OpenCL에 대한 요약

 

 

출판사 리뷰

 

계속되고 있는 (병렬) 이종 컴퓨팅 혁신과 보조를 맞추는 병렬 소프트웨어 혁신을 일으키기 위해서는 병렬 소프트웨어 산업이 필요하다. 그러나 그 산업은 소프트웨어들이 서로 다른 제조사의 플랫폼들에서, 또한 동일 제조사의 서로 다른 세대의 플랫폼들에서 동작될 수 있을 때만 번성할 수 있다.

 

OpenCL은 산업계 표준이다. (OpenGL과 기타 표준으로 유명한) Khronos 그룹 안에서 제정된 OpenCL은 소프트웨어 제조사, 컴퓨터 시스템 설계회사(모바일 플랫폼의 설계회사 포함), 마이크로프로세서(임베디드, 가속기, CPU, GPU) 제조사들의 협력을 통해서 등장했다. 이 표준은 다음의 질문에 대한 답이다: “오늘 만든 소프트웨어가 내일도 의미 있게 사용될 수 있을 것이란 확신을 가지고 이종 플랫폼을 위한 프로그램을 작성하려면 어떻게 해야 할까?

 

이 책은 방대한 예제를 가지고 이 표준의 전 범위를 다루면서 OpenCL이 실제로 어떻게 사용되는지 설명하고 있다.

 

 

대상 독자

 

이 책은 프로그래머를 위해서 프로그래머가 작성하였다. 또한 코드 작성에 흥미가 있는 사람들을 안내하는 실용적인 책이다. 우리는 독자들이 C에 대해서 익숙하고, 몇 장의 경우는 C++에도 익숙하다고 가정한다. 마지막으로, 병렬 프로그래밍의 기본 개념에도 익숙하다고 가정한다. 또한 독자들이 근처에 컴퓨터가 있어서 이 책을 읽으면서 소프트웨어를 바로 작성해보고 개념들을 탐구할 것을 가정한다. 그렇기에 이 책에는 프로그램과 코드들이 넘쳐난다.

 

이 책은 OpenCL 명세 전체를 다루고 다양한 병렬 알고리즘을 표현하기 위해 어떻게 사용되는지 설명한다. 이 책을 읽고 나면 여러분은 이종 플랫폼에서 여러 디바이스들에 작업을 분배하는 복잡한 병렬 프로그램을 작성할 수 있게 될 것이다. 여러분은 OpenCL에서 사용하는 성능 최적화의 기본을 이해하게 될 것이고, 하드웨어를 조사해서 성능을 극대화하는 소프트웨어를 작성하는 법을 알게 될 것이다.

 

 

이 책의 구성

 

OpenCL 명세는 거의 400페이지에 이른다. 그것은 지루할 정도로 구체적인 세부 사항들로 가득 찬 빽빽하고 복잡한 문서다. 이 명세를 설명하는 것은 쉽지 않지만, 우리는 이것을 잘 끄집어 냈다고 생각한다.

 

이 책은 두 파트로 나뉘어 있다. 첫 번째 파트는 OpenCL 명세를 기술한다. OpenCL 너머의 핵심 아이디어와 OpenCL 프로그램을 작성하는 기본에 대해 소개하는 두 장으로 시작한다. 그러고 나서 OpenCL 명세를 체계적으로 탐구해나가기 시작한다. 이 책의 어조는 참조 자료를 가지고 설명문 형태의 담론으로 진행되면서 바뀐다. 이 책의 두 번째 파트에서는 일련의 사례 연구들을 제시한다. 이 사례들은 OpenCL의 각 부분들이 어떻게 동작하는지에 대해 통찰할 수 있는 간단한 교육적인 예제부터 시작해서 OpenCL이 중요한 응용 프로젝트에 어떻게 사용되는지를 보여주는 복잡한 응용에 이르기까지 다양하다. 다음은 이 책의 각 장을 자세히 설명하고 있다.

 

 

파트 I: OpenCL 언어와 API

 

1. OpenCL 개론: 이 장은 OpenCL에 대한 상위 수준의 개요를 제공한다. 이 장은 왜 이종 플랫폼이 가까운 미래에 가장 많이 사용될 것인지 정성 들여 설명하고 있다. 그러고 나서 OpenCL 뒤에 감춰진 핵심 모델들과 개념들을 기술한다. 이를 통해 OpenCL에 사용된 용어들을 설명하는데, 그렇기 때문에 여러분의 목적이 이 책을 훑어 읽고 OpenCL 참고서로 사용하는 것이라고 해도 이 장을 읽는 것이 중요하다.

 

2. HelloWorld: 첫 번째 OpenCL 예제: 진짜 프로그래머는 코드를 작성하면서 배운다. 따라서 우리는 실제 동작하는 OpenCL 프로그램을 소개하는 장에서 살펴볼 것이다. 스크린에 “hello, world”를 출력하는 예제로 프로그래밍 언어를 소개하는 것이 표준으로 되어 있다. 이것은 (출력문이 포함되어 있지 않은) OpenCL에서는 말이 되지 않는다. 데이터-병렬 프로그래밍 모델에서 “hello world”에 해당하는 프로그램은 두 배열에 각 원소를 더하는 프로그램이다. 이 프로그램이 이 장의 핵심이다. 이 장을 마칠 때 여러분은 여러분만의 간단한 프로그램을 작성할 수 있을 정도로 OpenCL을 이해하게 될 것이다. 그리고 여러분이 정확히 그렇게 하기를 강력하게 권고한다. 책을 읽는 것만으로 프로그래밍 언어를 배울 수는 없다. 코드를 작성하기 바란다.

 

3. 플랫폼, 문맥, 디바이스: 이 장부터 우리는 OpenCL 명세에 대해 체계적으로 탐구해나가기 시작한다. OpenCL에서 “흥미 있는” 어떤 일이라도 하기 위해서는 먼저 사용 가능한 자원들을 발견해서 유용한 작업을 할 수 있도록 준비시켜야 한다. 다른 말로 하면, 프로그램은 플랫폼을 발견하고, OpenCL 프로그램을 위한 문맥을 정의하고, 프로그램에서 디바이스들을 원하는 대로 동작시킬 수 있도록 결정한다. 이 장에서는 이 중요한 주제들을 살펴보고 OpenCL 플랫폼 API를 자세히 다룬다.

 

4. OpenCL C로 프로그래밍하기: OpenCL 디바이스에서 수행되는 코드는 대부분 OpenCL C 프로그래밍 언어로 작성되어 있다. C99의 부분집합에 기반해서 OpenCL C 프로그래밍 언어는 OpenCL 디바이스를 효과적으로 활용하기 위해 커널에서 필요한 것들을 제공하고 있는데, 벡터 명령어를 많이 포함하고 있다. 이 장은 프로그래밍 언어에 대해서 자세히 설명하고 있다.

 

5. OpenCL 내장 함수들: OpenCL C 프로그래밍 언어 API는 복잡하고 많은 종류의 내장 함수들을 정의한다. 이 장에서는 이 API들을 다룬다.

 

6. 프로그램과 커널: 커널을 작성하기 위한 언어를 다루었으니 이제 OpenCL에서 정의된 런타임 API에 대해서 살펴본다. 먼저 프로그램과 커널을 생성하는 과정부터 시작한다. OpenCL에서 프로그램이란 단어는 다른 의미로 사용된다는 점을 상기하기 바란다. OpenCL에서 프로그램이라는 단어는 구체적으로 커널을 위해 함수들이 추출되는 “동적 라이브러리”를 일컫는다.

 

7. 버퍼와 서브-버퍼: 1차원 배열인 버퍼 메모리 객체에 대해서 설명한다. 또한 서브-버퍼에 대해서도 정성 들여 설명한다. 서브-버퍼는 OpenCL 1.1 이후의 새로운 특징이기 때문에 OpenCL 1.0 경험이 있는 프로그래머라면 이 장이 특히 유용할 것이다.

 

8. 이미지와 샘플러: 메모리 객체에서 아주 중요한 주제인 이미지에 대해서 설명한다. OpenCL과 그래픽스가 가지는 밀접한 관계를 고려한다면 이 메모리 객체는 수많은 OpenCL 프로그래머들에게 중요한 객체일 것이다.

 

9. 이벤트: 이 장은 OpenCL의 이벤트 모델을 자세히 논의한다. 이 객체는 OpenCL에서 순서에 대한 제약을 강제할 때 사용된다. 기초적인 수준에서 이벤트는 런타임이 어떻게 작업을 스케줄하든지 상관없이 올바른 결과를 생성하는 병렬 코드를 작성할 수 있게 해준다. 그러나 조금 더 알고리즘적으로 깊은 수준에서 사용될 때 이벤트는 여러 디바이스에 걸쳐있는 방향 있는 비순환 그래프로써 프로그램을 구성할 수 있도록 지원한다.

 

10. OpenGL에 대한 상호연동성: 많은 응용에서, 그래픽스 API를 사용해 OpenCL에서 처리한 결과를 출력하려고 하거나, 심지어 그래픽스가 생성한 장면들을 후처리하는 데 OpenCL을 사용하려고 할 것이다. OpenCL 명세는 OpenGL 그래픽스 API와의 연동성을 허용한다. 이 장은 OpenGL/OpenCL 공유를 어떻게 설정해서 어떻게 데이터를 공유하고 동기화하는지 논의할 것이다.

 

11. Direct3D에 대한 상호연동성: 마이크로소프트의 플랫폼들은 OpenCL 응용에 흔하게 사용되는 대상이다. 응용에서 그래픽스가 포함되어 있다면 그것들은 마이크로소프트의 네이티브 그래픽스 API를 사용할 필요가 있을 수 있다. OpenCL에서는 OpenCL 응용에서 DirectX 10 API를 사용할 수 있게 하는 법을 정의한다. 이 장은 OpenCL/Direct3D 공유를 어떻게 설정해서 어떻게 데이터를 공유하고 동기화하는지 보여줄 것이다.

 

12. C++ 래퍼 API: OpenCL C++ API 래퍼에 대해서 논의한다. 이것을 통해 참조 회수가 자동으로 계산되고, OpenCL 객체 정보에 대한 질의 인터페이스가 통합되어, C++로 작성된 호스트 프로그램이 상당히 간단해진다. 일단 C++ 인터페이스에 완전히 익숙해지고 나면 일반 C 인터페이스로 다시 돌아가기가 쉽지 않을 것이다.

 

13. OpenCL 임베디드 프로파일: OpenCL은 흔하지 않게도 다양한 디바이스들에 대해서 제정되었다. 이것은 휴대폰에서부터 대규모 병렬 슈퍼컴퓨터에 이르기까지 다양한 디바이스들을 대상으로 한다. 대부분의 OpenCL 명세는 별도의 변경 없이 각 디바이스에 모두 적용이 된다. 그러나 임베디드 디바이스에서 사용되는 저전력 프로세서의 줄어든 계산 능력에 맞추기 위해서는 OpenCL을 약간 수정해야 한다. 이 장에서는 이와 같은 수정된 사항에 대해 다루는데, OpenCL 명세에서는 이것을 OpenCL 임베디드 프로파일이라고 부른다.

 

 

파트 II OpenCL 사례 연구들

 

14. 이미지 히스토그램: 히스토그램은 데이터 집합에서 값들의 발생빈도를 보고하는 것이다. 예를 들어, 이 장에서는 색상 이미지의 R, G, B 채널 값에 대한 히스토그램을 계산한다. 히스토그램을 병렬적으로 구하기 위해서 데이터 집합의 지역적인 영역에 대해서 히스토그램을 구하고, 이후에 이 지역 값들을 더해서 최종 결과를 구한다. 이 장의 목적은 두 가지다: (1) OpenCL에서 이미지를 어떻게 다루는지 보여주고, (2) 히스토그램을 OpenCL 프로그램에서 전역적으로 더하는 효율적인 기법들을 살펴본다.

 

15. Sobel 경계선 검출 필터: Sobel 경계선 검출 필터는 x축과 y축 방향으로 이미지 증감률을 계산하는 방향성 있는 경계선 검출 필터다. 이 장에서는 커널을 사용해서 Sobel 경계선 검출 필터를 적용하는데, OpenCL에서 커널이 이미지를 가지고 어떻게 동작하는지에 대한 간단한 예제가 된다.

 

16. Dijkstra의 단일소스 최단경로 그래프 알고리즘: 이 장에서는 CPU와 여러 GPU 디바이스를 모두 활용할 수 있는 OpenCL로 구현된 Dijkstra의 단일소스 최단경로 그래프 알고리즘의 구현에 대해서 설명한다. 그래프 자료 구조는 인공지능에서부터 뇌신경촬영법에 이르기까지 많은 문제에서 사용된다. 이 장에서 살펴보는 이 특정한 구현은 FreeSurfer라는 뇌신경촬영 응용의 일부분으로 개발되었는데, 대뇌피질을 삼각형 메쉬 구조로 복원할 때 대뇌피질 만곡을 측정하는 알고리즘의 성능을 개선하는 것이 목적이다. 이 예제는 여러 OpenCL 디바이스들을 어떻게 사용하는지, 작업을 CPU와 여러 GPU 디바이스 혹은 전부 한 디바이스로 어떻게 나누는지 등을 구체적으로 보여준다.

 

17. Bullet 물리 SDK의 옷 시뮬레이션: 물리 시뮬레이션은 현대 비디오 게임에서 날로 증가하고 있는 부분이다. 이 장에서는 전사의 옷과 같은 옷을 OpenCL로 시뮬레이션하는 방법을 보여주는데, 이것은 Bullet 물리 SDK의 일부분이다. 연체를 시뮬레이션하는 방법은 매우 많다. Bullet에서 사용한 방법은 질량/스프링 모델과 유사하고, 최신 GPU에서 잘 실행되도록 최적화가 되어있으면서도 OpenCL로 작성되지 않은 다른 Bullet SDK 컴포넌트들과 매끄럽게 통합된다. 집단으로 처리하기(batching)라고 불리는 중요한 기법을 보여주는데, 메쉬들을 변환해서 GPU와 같은 넓은 SIMD 아키텍처에서도 좋은 성능을 낼 수 있도록 하면서도 질량/스프링 모델이 가지는 의존성을 만족시킬 수 있다.

 

18. 고속 푸리에 변환(FFT)으로 Ocean 시뮬레이션하기: 이 장에서는, AMD사의 Ocean 시뮬레이션을 자세히 설명한다. Ocean은 실시간으로 바다를 시뮬레이션하기 위해 역이산푸리에 변환을 사용하는 OpenCL 데모 프로그램이다. 주파수-의존적인 위상 이동을 통해 생성한 임의의 노이즈에 고속 푸리에 변환을 적용한다. 워터월드, 타이타닉, 5원소 등 여러 유명한 영화에 사용된 Jerry Tessendorf가 개발한 접근방식에 기반한 구현을 설명한다. 2차원 DFFT를 최적화해서 개발하는 법을 보여주는데, OpenCL로 프로그래밍할 때 유용한 중요 최적화 기법들을 다수 포함한다. 또한 이 알고리즘을 응용에 통합하는 법과 OpenCL OpenGL의 상호연동성을 사용하는 법을 보여준다.

 

19. Optical Flow: 이 장에서는 OpenCL로 구현한 광학적 흐름에 대해서 설명한다. 광학적 흐름은 이미지에서 움직임을 기술하는 컴퓨터 비전의 기본적인 개념이다. 광학적 흐름은 이미지 안정화, 시간적 업샘플링, 그리고 객체 트랙킹과 동작 인식과 같은 더 상위 수준의 알고리즘에 대한 입력으로 사용된다. 이 장은 피라미드형 Lucas-Kanade 광학적 흐름 알고리즘을 OpenCL로 구현한 것을 보여준다. 이 구현을 통해 이미지 객체가 어떻게 GPU 하드웨어의 텍스처 기능을 접근할 수 있는지 보여준다. GPU의 텍스처-필터링 하드웨어를 어떻게 사용하여 데이터에 대한 선형 보간을 수행하고, 요구되는 서브-픽셀 정확도를 달성하고, 상당한 성능개선을 이룰 수 있는지 보여준다. 추가적으로, 공유 메모리를 어떻게 사용해서 반복적으로 접근되는 데이터를 캐슁하는지 논의하고, 초기 커널 종료 기법을 통해서 추가적인 성능을 어떻게 얻을 수 있는지도 논의한다.

 

20. PyOpenCL OpenCL 사용하기: 이 장의 목적은 파이썬으로 OpenCL을 사용하는 기본에 대해서 소개하는 것이다. 대부분의 책은 C/C++로부터 OpenCL을 사용하는 법에 초점을 맞추고 있지만 파이썬을 포함한 다른 언어에 대한 바인딩이 가능하다. 이 장에서는 PyOpenCL을 소개하기 위해 8장의 Gaussian 이미지 필터링 예제를 파이썬으로 이식하기 위해 필요한 각 단계들을 살펴볼 것이다. C++에서 파이썬으로 이식하는 데 필요한 변경 외에 파이썬과 같이 동적으로 형을 가지는 언어로 OpenCL을 사용하는 몇 가지 장점에 대해서 논의한다.

 

21. OpenCL로 행렬곱셈하기: 이 장에서 두 정방행렬을 곱하는 프로그램을 논의한다. 프로그램은 매우 간단해서 성능을 최적화하기 위해 프로그램을 변경할 때 수정사항을 따라가기가 쉽다. 이 최적화들은 OpenCL 메모리 모델과 OpenCL 프로그램에서 데이터 이동에 대한 비용을 이 모델에서 어떻게 최소화할 수 있는지에 초점을 맞추고 있다.

 

22. 희소 행렬-벡터 곱셈: 이 장에서는 희소 행렬-벡터 곱셈 알고리즘에 대한 최적화된 OpenCL 구현을 기술한다. 희소 행렬은 행렬의 대부분의 원소들이 0인 큰 2차원 행렬로 정의된다. 이 행렬은 계산 유체역학, 컴퓨터 그래픽스/비전, 로보틱스/동역학, 재무 모델링, 음향학, 양자화학과 같은 다양한 도메인에서 문제를 규정하고 풀기 위해 사용된다. (빠르지만 이식성 없는) 하드웨어 특화된 코드와 (이식성은 높지만 느린) 단일-소스 코드의 차이가 줄어들 수 있다는 것을 OpenCL 구현을 통해 보여준다. OpenCL을 통해서 다양한 하드웨어 위에서 고성능으로 수행되는 효율적인 구현을 가지게 되는데, 거의 하드웨어 특화 구현만큼 빠르다. 결과들은 OpenCL C로 작성된 커널로 얻어졌고 어떤 OpenCL 플랫폼에 대해서도 컴파일되어 수행될 수 있다.

 

• 부록 A. OpenCL 요약: OpenCL 명세는 매우 많은 종류의 함수들과 상수, 형들을 정의한다. OpenCL 전문가 프로그래머조차도 코드를 작성할 때는 자세한 내용을 참조해야 한다. 이 과정을 돕기 위해 모든 자세한 내용들을 한 곳에서 살펴볼 수 있도록 부록에 이 내용을 포함했다.

 

 

신고
Trackback 0 | Comment 0

퍼블릭's Blog is powered by Daum & tistory