[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 opencl...

142
21세기 정원사의 OpenCL 경험담 <야생의 땅: 듀랑고>의 식물 생태계를 담당하는 넥슨코리아 변수민 <[email protected]>

Upload: sumin-byeon

Post on 19-Jul-2015

2.132 views

Category:

Software


2 download

TRANSCRIPT

Page 1: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

21세기 정원사의 OpenCL 경험담<야생의 땅: 듀랑고>의 식물 생태계를 담당하는

넥슨코리아

변수민 <[email protected]>

Page 2: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

발표자 소개 - 변수민

• University of Arizona

• 컴퓨터 과학(computer science) 전공, 수학 부전공 (2010)

• 같은 학교 로봇 인공지능 연구실에서 리서치 프로그래머로 근무 (2011)

• 같은 학교에서 컴퓨터 과학 석사 (2013)

• 작년 7월에 넥슨에서 게임 프로그래머로 근무 시작 (2014)

• 관심 분야: 머신 러닝(machine learning), 데이터 마이닝(data mining), 분산 시스템

Page 3: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Disclaimers

• 저는 OpenCL 전문가가 아닙니다

• C# 도 처음 써보는겁니다

• 처음 접해보는 초보자 입장에서 하는 이야기

• 이렇게 많은 사람들 앞에서 이렇게 긴 발표를 해 보는것도 처음

Page 4: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

목차

• <야생의 땅: 듀랑고> 에 대한 이야기

• 생태계 시뮬레이터 소개

• 바이오매스 계산에 대한 이야기

• OpenCL 실행 모델, 메모리 모델

• OpenCL 경험담

• 회고록

Page 5: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

<야생의 땅: 듀랑고> 소개Games maketh man

Page 6: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

6

생존

Page 7: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

7

전투

Page 8: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

8

개척

Page 9: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

9

환경

Page 10: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

오픈 월드

• 방대한 크기의 오픈 월드

• 여러개의 섬스마트폰 화면으로 섬 하나를 모두 담으려면 축구장 하나의 크기 정도

• 자유롭게 돌아다니며 채집, 사냥, 건설, 농사 등의 활동

• 월드는 수작업이 아닌 자동으로 생성

Page 11: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

수작업 나빠요

:-):-(

CC BY 3.0 http://en.wikipedia.org/wiki/Shielded_metal_arc_weldingCC 3.0 http://en.wikipedia.org/wiki/File:Robotworx-arc-welding-robots.jpg

Page 12: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

게임 월드 생성 절차

WorldGen

Ecosystem Simulator

Animal Incubator

게임 서버

지형 정보 동식물 배치 정보

지형 생성 도구

Page 13: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

게임 월드 생성 절차

WorldGen

Ecosystem Simulator

Animal Incubator

게임 서버

지형 정보 동식물 배치 정보

지형 생성 도구

Page 14: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

생태계 시뮬레이터지형, 지질, 기후, 주변 생태계 환경 등을 고려하여 식물과 광물을 배치

Page 15: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

식물 배치

Page 16: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

식물 배치

Page 17: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

식물 배치

Page 18: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

식물 배치

타일

• 최대 4096x4096 타일

• 게임 내 스케일로 8x8 km

Page 19: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

• 각 타일당 다음의 조건을 고려하여 최적의 식물 후보를 선택

• 지질 (초원, 온대림, 열대림, 사바나, 사막, 타이가, 툰드라, 설원 등)

•고도, 온도, 습도, 비옥도

• 바다, 강, 호수와의 거리

• 랜드마크와의 거리

• 주변 바이오매스(biomass)의 합

식물 배치

만화 © 이말년

Page 20: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

자연 조건 시각화

Page 21: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

생태계 시뮬레이터 작동 구조

메타데이터 생성, 읽기

지형, 환경 정보 읽어오기

데이터 가공

최종 배치 정보 내보내기바이오매스 맵 업데이트

식물별 생존 적합성 판별

식물, 광물 배치

각 회차(iteration)마다

Page 22: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 23: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 24: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 25: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 26: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 27: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 28: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 29: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 30: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 31: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 32: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 33: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 34: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 35: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
Page 36: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

최초의 프로토타입

• 너무 느려서 2048x2048 정도의 큰 월드에서의 실행은 무리

• 바이오매스 계산이 대부분의 시간을 차지

Page 37: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

우리의 작업 환경

Mono

Linux

OpenCL

Ecosystem Simulator

.NET

Windows

OpenCLVisual Studio

Ecosystem Simulator

Page 38: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

바이오매스(biomass) 계산Biomass is biological material derived from living, or recently living organisms[^1]

[^1]: http://en.wikipedia.org/wiki/BiomassCC-BY-NC-SA http://www.dialogosfederativos.gov.br/?p=1666

Page 39: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

바이오매스

• 특정 생명체가 가지는 생물학적 질량

• 우리 게임에서는 식물 크기의 척도로 사용되기도 함

• 식물의 생장 조건 중 하나가 주변의 바이오매스 총량

• 우리의 기획 의도를 반영할 수 있는 도구 중 하나

• 빽빽하게 심거나, 듬성듬성하게 심거나

Page 40: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

바이오매스 맵

Page 41: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

계산을 어떻게 빨리 하지…?

CC0 Public Domain http://pixabay.com/en/think-thinking-hand-reflect-622689/

Page 42: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

계산을 어떻게 빨리 하지…?

바이오매스 맵을 미리 계산해놓자!

CC0 Public Domain http://pixabay.com/en/think-thinking-hand-reflect-622689/

Page 43: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

바이오매스 맵 미리 계산 하기

1.Matrix multiplication

2. Naïve matrix multiplication with OpenCL

3. Optimized matrix multiplication with OpenCL

4. Comprehensive kernel

5. Sparse matrix

Page 44: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCLThe open standard for parallel programming of heterogeneous systems

Page 45: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL 소개

• 명세 공개

• 크로스 플랫폼

• 여러 종류의 장비를 지원하는 (CPU, AMD/NVIDIA GPUs)

• 병렬 프로그래밍 프레임워크

• 여러가지 언어 바인딩 지원

• 이용 분야: 엔터테인먼트, 멀티미디어, 금융, 과학, 의학 등 (<야생의 땅: 듀랑고>, photography, video editing, computational biology, fluid dynamics, Monte-Carlo, climate physics modeling, N-body simulations, search for weak astrophysical signals from spinning neutron stars, GPU-based motion correction of contrast-enhanced liver MRI scans, and the list goes on)

Page 46: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL 소개

• 실행 모델

• Task/data parallelism

• 커널(Kernel)

• 메모리 모델

• 메모리 계층구조 (NUMA)

•Work-item, work-group

• 메모리 보호

Page 47: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Execution Models

• Task-parallel programming

• Data-parallel programming

Page 48: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Execution Models

• Task-parallel programming

• Data-parallel programming

Page 49: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Task Parallelism vs. Data Parallelism

Task 1Task 1 Task 2 Task 3 Task 1 Task 1 Task 1Task 4

Page 50: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Task Parallelism vs. Data Parallelism

Task 1Task 1 Task 2 Task 3 Task 1 Task 1 Task 1Task 4

커널(kernel)

Page 51: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Kernel

CC BY-SA 3.0 http://en.wikipedia.org/wiki/Corn_kernel

Page 52: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Kernel

Linux Kernel Map http://www.makelinux.net/kernel_map/

Page 53: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel

• C 함수라고 보아도 무방

• OpenCL C = An extended and subsetted version of C99

• 1, 2 또는 3차원 인덱스 스페이스(index space)에 대하여 커널을 실행

• 인덱스 스페이스는 컴퓨테이션 도메인(computation domain)이라 표현하기도 함

Page 54: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

1차원 인덱스 스페이스

0 1 2 3 4 5 … n-1

Page 55: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

2차원 인덱스 스페이스

0,0 0,1 0,2 … 0,n-1

1,0 1,1 1,2 … 1,n-1

2,0 2,1 2,2 … 2,n-1

… … … … …

n-1,0 n-1,1 n-1,2 … n-1,n-1

Page 56: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Execution

…w = u + v

1

…2

2

3

3

4

n

n+1

3 5 7 2n+1

*(u+0)

*(v+0)

*(u+1)

*(v+1)

*(u+2)

*(v+2)

*(u+n-1)

*(v+n-1)

w = u + v w = u + v w = u + v

…*(w+0) *(w+1) *(w+2) *(w+n-1)

0 1 2 n-1

Page 57: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Execution

…w = u + v

1

…2

2

3

3

4

n

n+1

3 5 7 2n+1

*(u+0)

*(v+0)

*(u+1)

*(v+1)

*(u+2)

*(v+2)

*(u+n-1)

*(v+n-1)

w = u + v w = u + v w = u + v

…*(w+0) *(w+1) *(w+2) *(w+n-1)

0 1 2 n-1

Page 58: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Execution

…w = u + v

1

…2

2

3

3

4

n

n+1

3 5 7 2n+1

*(u+0)

*(v+0)

*(u+1)

*(v+1)

*(u+2)

*(v+2)

*(u+n-1)

*(v+n-1)

w = u + v w = u + v w = u + v

…*(w+0) *(w+1) *(w+2) *(w+n-1)

0 1 2 n-1

Page 59: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Execution

…w = u + v

1

…2

2

3

3

4

n

n+1

3 5 7 2n+1

*(u+0)

*(v+0)

*(u+1)

*(v+1)

*(u+2)

*(v+2)

*(u+n-1)

*(v+n-1)

w = u + v w = u + v w = u + v

…*(w+0) *(w+1) *(w+2) *(w+n-1)

0 1 2 n-1

Page 60: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Execution

…w = u + v

1

…2

2

3

3

4

n

n+1

3 5 7 2n+1

*(u+0)

*(v+0)

*(u+1)

*(v+1)

*(u+2)

*(v+2)

*(u+n-1)

*(v+n-1)

w = u + v w = u + v w = u + v

…*(w+0) *(w+1) *(w+2) *(w+n-1)

0 1 2 n-1

Page 61: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

__kernel void vector_addition( __global float* w, __global const float* u, __global const float* v) { int i = get_global_id(0); w[i] = u[i] + v[i];}

Example of Kernel

1차원 글로벌 인덱스

Page 62: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Work-item, work-group

•Work-item: each independent element of execution in the computation domain

•Work-group: work-items are grouped together into independent work-groups; local memory is shared within a work-group

Page 63: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Work-item

• 독립적인 실행 단위, 하나의 커널을 실행

• 여러 work-item 이 동시에 실행

• Private 메모리를 가질 수 있음

Work-item 1 Work-item 2 Work-item n

…Private Memory

Kernel

Private Memory

Kernel

Private Memory

Kernel

Page 64: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Work-group•Work-item 의 집합

• 그룹 내의 work-item 들은 로컬 메모리를 공유, 동기화 가능

• 그룹간 로컬 메모리 접근, 동기화는 불가능

Work-group 1

Work-item

Private Memory

Kernel

Private Memory

Kernel

Work-item

Local Memory

Work-item

Private Memory

Kernel

Private Memory

Kernel

Work-item

Local Memory

Work-group n

Page 65: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Memory Models

OpenCL Memory Model (from [Khronos 2011])

Page 66: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Memory Models

CPU GPU

Register, L1, L2 cache Private memory

L3 cache(코어 간 데이터 공유)

Local memory(Work-group 내 데이터 공유)

Main memory Global memory느림 대용량

조금 억지스러운 비유이지만...

빠름 저용량

Page 67: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Memory Models

Global Memory

Local Memory Local Memory

Work-group 1 Work-group n

Page 68: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Memory Protection

이미지 출처는 https://mirror.enha.kr/wiki/그런%20거%20없다, 원본 화면이 어디서 왔는지는 알 수 없음.

Page 69: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Memory Protection

이미지 출처는 https://mirror.enha.kr/wiki/그런%20거%20없다, 원본 화면이 어디서 왔는지는 알 수 없음.

Page 70: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Memory Protection

• 메모리 블럭은 보호되지 않음

• Segmentation fault 가 보고되지 않음

• 화면 깜빡임, 복구 불가능한 시스템 크래시 등 다양한 이상 현상

• 스크린 해상도 변경 이벤트는 드라이버 레벨에서 감지 가능

Page 71: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

An Introduction to the OpenCL Programming Model

Page 72: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take One: 행렬의 곱셈The Matrix is the world that has been pulled over your eyes to blind you from the truth

Page 73: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 74: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 75: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 76: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 77: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 78: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 79: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 80: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 81: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 82: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 83: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

MaskBiomass maps

우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합

Page 84: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 85: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 86: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Page 87: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

패턴이 보이나요?

Page 88: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

패턴이 보이나요?

Page 89: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Mask Biomass maps Mask

Page 90: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Mask Biomass maps Mask

Page 91: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Mask Biomass maps Mask

Page 92: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

Mask Biomass maps Mask

Page 93: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 하지만 문제는…

Page 94: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

137,422,176,2564096x4096 행렬을 곱했을 때 수행되는 곱셈과 덧셈 연산의 수

Page 95: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 행렬의 곱셈

30 min2048x2048 타일, 10회차까지

© 다음카카오

Page 96: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 프로파일링 결과

바이오매스 맵 업데이트생존 조건 판별데이터 가공지형 읽어오기기타

Page 97: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: 프로파일링 결과

바이오매스 맵 업데이트생존 조건 판별데이터 가공지형 읽어오기기타

GPGPU 를 이용해서 개선해보자

Page 98: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: Naïve OpenCL KernelThe more the merrier - Take advantage of the many-core architecture

Unknown license of this image from http://www.extremetech.com/computing/185512-overclocking-intels-core-i7-4970k-can-devils-canyon-fix-haswells-low-clock-speeds

Page 99: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: Naïve OpenCL Kernel

• 행렬 연산만 OpenCL 을 이용(코드를 단순하게 하기 위해 글로벌 메모리만 사용)

• 나머지 코드는 그대로

메타데이터 생성, 읽기

지형, 환경 정보 읽어오기

데이터 가공

최종 배치 정보 내보내기바이오매스 맵 업데이트

식물별 생존 적합성 판별

식물, 광물 배치

각 회차(iteration)마다

Page 100: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

일반적인 행렬 계산 코드

void matrix_multiplication(float* C, const float* A, const float* B, const int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { float r = 0; for (int k = 0; k < n; k++) { r += A[i * n + k] * B[k * n + j]; } C[i * n + j] = r; } }}

Page 101: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Code__kernel void matrix_mul(__global float* C, __global const float* A, __global const float* B) {

int tx = get_global_id(0); int ty = get_global_id(1); int w = get_global_size(0);

float value = 0; for (int k = 0; k < w; k++) { value += A[ty * w + k] * B[k * w + tx]; } C[ty * w + tx] = value;}

Page 102: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

__kernel void matrix_mul(__global float* C, __global const float* A, __global const float* B) {

int tx = get_global_id(0); int ty = get_global_id(1); int w = get_global_size(0);

float value = 0; for (int k = 0; k < w; k++) { value += A[ty * w + k] * B[k * w + tx]; } C[ty * w + tx] = value;}

OpenCL Kernel Code

벡터의 내적(dot product)

Page 103: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL Kernel Code__kernel void matrix_mul(__global float* C, __global const float* A, __global const float* B) {

int tx = get_global_id(0); int ty = get_global_id(1); int w = get_global_size(0);

float value = 0; for (int k = 0; k < w; k++) { value += A[ty * w + k] * B[k * w + tx]; } C[ty * w + tx] = value;}

2차원 글로벌 인덱스 (x, y)

글로벌 인덱스의 1차원 축 크기 (정방행렬square matrix이므로 2차원 축 크기와 동일)

j

i

글로벌 메모리 사용

Page 104: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Two: Naïve OpenCL

30 min -> 3 min

© 다음카카오

Page 105: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Three: Optimized OpenCL KernelTake advantage of the non-uniform memory hierarchy

Page 106: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

#pragma OPENCL EXTENSION cl_khr_fp64 : enable#define BLOCK_SIZE 32

__kernel voidmatrix_mul(__global double* C, __global double* A, __global double* B){ int bx = get_group_id(0); int by = get_group_id(1); int tx = get_local_id(0); int ty = get_local_id(1);

int size = get_global_size(0);

// Range of sub-matrix A int a_begin = size * BLOCK_SIZE * by; int a_end = a_begin + size - 1; int a_step = BLOCK_SIZE;

// Range of sub-matrix B int b_begin = BLOCK_SIZE * bx; int b_step = BLOCK_SIZE * size;

double c_sub = 0;

__local double A_sub[BLOCK_SIZE][BLOCK_SIZE]; __local double B_sub[BLOCK_SIZE][BLOCK_SIZE];

for (int a = a_begin, b = b_begin; a <= a_end; a += a_step, b += b_step) {

A_sub[ty][tx] = A[a + size * ty + tx]; B_sub[ty][tx] = B[b + size * ty + tx];

barrier(CLK_LOCAL_MEM_FENCE);

for (int k = 0; k < BLOCK_SIZE; k++) { c_sub += A_sub[ty][k] * B_sub[k][tx]; }

barrier(CLK_LOCAL_MEM_FENCE); }

int c = size * BLOCK_SIZE * by + BLOCK_SIZE * bx; C[c + size * ty + tx] = c_sub;}

Page 107: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Three: Optimized OpenCL Kernel

vs.

Page 108: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Three: Optimized OpenCL Kernel

__local double A_sub[BLOCK_SIZE][BLOCK_SIZE];__local double B_sub[BLOCK_SIZE][BLOCK_SIZE];

로컬 메모리 할당

Page 109: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

for (int a = a_begin, b = b_begin; a <= a_end; a += a_step, b += b_step) { A_sub[ty][tx] = A[a + size * ty + tx]; B_sub[ty][tx] = B[b + size * ty + tx]; barrier(CLK_LOCAL_MEM_FENCE); for (int k = 0; k < BLOCK_SIZE; k++) { c_sub += A_sub[ty][k] * B_sub[k][tx]; }

barrier(CLK_LOCAL_MEM_FENCE);}

Take Three: Optimized OpenCL Kernel

86

부분행렬submatrix 원소들을 채워줌

다른 work-item 들이 작업을 마칠때까지 기다려줌

Page 110: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

for (int a = a_begin, b = b_begin; a <= a_end; a += a_step, b += b_step) { A_sub[ty][tx] = A[a + size * ty + tx]; B_sub[ty][tx] = B[b + size * ty + tx]; barrier(CLK_LOCAL_MEM_FENCE); for (int k = 0; k < BLOCK_SIZE; k++) { c_sub += A_sub[ty][k] * B_sub[k][tx]; }

barrier(CLK_LOCAL_MEM_FENCE);}

Take Three: Optimized OpenCL Kernel

부분행렬의 내적을 구하고

다른 work-item 들이 작업을 마칠때까지 기다려줌

Page 111: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Three: Optimized OpenCL

3 min -> 1 min 15 sec

우왕 굿

© 다음카카오

Page 112: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

하지만...

메타데이터 생성, 읽기

지형, 환경 정보 읽어오기

데이터 가공

최종 배치 정보 내보내기바이오매스 맵 업데이트

식물별 생존 적합성 판별

식물, 광물 배치

각 회차(iteration)마다

Page 113: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

하지만...

메타데이터 생성, 읽기

지형, 환경 정보 읽어오기

데이터 가공

최종 배치 정보 내보내기바이오매스 맵 업데이트

식물별 생존 적합성 판별

식물, 광물 배치

각 회차(iteration)마다

Page 114: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Four: Comprehensive KernelLegitimate general-purpose GPU-based computations

Page 115: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Four: Comprehensive Kernel

• 행렬 연산 및 생존 적합성 판단 코드를 모두 OpenCL 로 작성

• 한 회차(iteration)가 끝날때 마다 호스트로 결과 보고

메타데이터 생성, 읽기

지형, 환경 정보 읽어오기

데이터 가공

최종 배치 정보 내보내기바이오매스 맵 업데이트

식물별 생존 적합성 판별

식물, 광물 배치

각 회차(iteration)마다

Page 116: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

나는 경이적인 방법으로 프로그램의 속도를 향상시켰다. 그러나 화면의 여백이 너무 좁아 코드를 여기에 옮기지는 않겠다.

Page 117: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

1 min 15 sec -> 11 sec

Take Four: Comprehensive Kernel

© 다음카카오

Page 118: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

데이터 전송 병목

Host Memory

Device Memory

PCI Express

PCI Express 를 통한 호스트-디바이스 간 데이터 전송

CC BY-SA 3.0 http://en.wikipedia.org/wiki/PCI_Express#/media/File:PCIExpress.jpg

Page 119: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

빨라졌지만 시간복잡도가 변한 것은 아니다

Page 120: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

성능 비교수행 시간

0

100

200

300

400

Take One Take Two Take Three Take Four

Page 121: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

성능 비교수행 시간

0

100

200

300

400

Take One Take Two Take Three Take Four

x170

Page 122: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

개발 장비 & 테스트 환경

• NVIDIA GeForce GT 740보급형 그래픽카드

• 2048x2048 타일

• 10회차

• 하이엔드 그래픽카드를 사용한다면?

© NVIDIA

Page 125: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

One more thing…

Page 126: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Five: Compressed Sparse RowSufficiently advanced mathematics is indistinguishable from magic

Page 127: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Five: Compressed Sparse RowMask Biomass maps

비어있는 부분

Page 128: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Five: Compressed Sparse Row

Row offsets

Column indicies

Values

Page 129: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Five: Compressed Sparse Row

using MathNet.Numerics.LinearAlgebra;using MathNet.Numerics.LinearAlgebra.Double;

Matrix<double> A = SparseMatrix.OfRowMajor(2, 2, new double[] { 1, 2, 3, 4 });Matrix<double> B = SparseMatrix.OfRowMajor(2, 2, new double[] { 5, 6, 7, 8 });Matrix<double> C = A * B;

Page 130: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Take Five: Compressed Sparse Row

30 min -> 18 sec(Take One 의 CPU 코드와 비교하여)

Page 131: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

회고록디버깅 난이도, 유지보수 비용, 경제적 타당성 등에 대한 회고

Page 132: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

높은 디버깅 난이도

• Segmentation fault 가 보고되지 않음

• No system calls• printf 디버깅 불가, 로그 파일에 기록 불가

• No stack trace• 화면 깜빡임과 시스템 크래시로 대체

• 적당한 디버거가 없는줄 알았는데, 발표 자료 만들면서 찾아보니...• http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-emulator-debugger/

Page 133: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

다음번에는 꼭...

Page 134: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

유지보수 어려움

• 프로그래머 구하기 어려움[^1]

• Java - 35,180

• Python - 18,668

• OpenCL - 101

• 코드는 이식 가능하지만, 성능은 이식 불가능

• 메모리 크기에 따른 work-item, work-group 수 제한

• 동시에 실행 가능한 쓰레드의 수

[^1]: LinkedIn 에서 각 키워드로 job posting 검색 결과 수 (2015-05-12)

Page 135: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

경제적 타당성 (Financial Viability)

• OpenCL 을 이용해 프로그램 수행 속도를 20% 향상시켰지만 전기세가 두 배로 늘었다면?

• 아마존 웹 서비스(AWS)의 GPU 인스턴스는 꽤 비싼 편[^1]

• 개발 난이도와 코드 유지보수 비용 - 개발자의 시간은 비싸다

[^1]: 2015년 5월 버지니아 데이터센터 기준으로 시간당 $0.65-$2.60, 비슷한 CPU 성능을 가진 다른 인스턴스는 $0.42-$1.68

Page 136: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

아쉬운 점

• 컬렉션(collection) 라이브러리가 있었으면 좋겠다

• List, set, dictionary …

• GPU 이용을 위해 기존의 코드를 재작성 하지 않아도 되었으면 좋겠다

• hiCUDA - C directive based metalanguage

Page 137: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL 은 잠시 접어두기로...

Ope

nCL

T_T

CC0 Public Domain http://pixabay.com/en/litter-disposal-person-trash-can-44039/

Page 138: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL 은 잠시 접어두기로...

• 공학적 개선 ≈ 수학적 개선

• 비용 > 성능상 이점

• 미래에 다른 기회가 있다면 재도전

• 더 큰 섬

• 더 복잡한 요구 조건

• --no-opencl 플래그

• 언제든지 다시 꺼내서 쓸 수 있는 상태

Page 139: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

OpenCL 의 올바른 이용법

• 데이터 교환은 한꺼번에, 계산은 많이

• 불균일 메모리 접근(NUMA)을 적절히 이용

• 브랜칭(branching)은 최소한으로

Page 140: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Branching in GPU

if

if

statement 1

statement 2

statement 2

if (conditions) { // statement 1}// statement 2

Page 141: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

감사합니다Gracias

Page 142: [야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담

Get In Touch With Me

• GitHub: http://github.com/suminb

• Twitter: @suminb

• LinkedIn: https://www.linkedin.com/in/suminb