SlideShare a Scribd company logo
1 of 142
Download to read offline
21세기 정원사의 OpenCL 경험담
<야생의 땅: 듀랑고>의 식물 생태계를 담당하는
넥슨코리아
변수민 <suminb@nexon.co.kr>
발표자 소개 - 변수민
• University of Arizona
• 컴퓨터 과학(computer science) 전공, 수학 부전공 (2010)
• 같은 학교 로봇 인공지능 연구실에서 리서치 프로그래머로 근무 (2011)
• 같은 학교에서 컴퓨터 과학 석사 (2013)
• 작년 7월에 넥슨에서 게임 프로그래머로 근무 시작 (2014)
• 관심 분야: 머신 러닝(machine learning), 데이터 마이닝(data
mining), 분산 시스템
Disclaimers
• 저는 OpenCL 전문가가 아닙니다
• C# 도 처음 써보는겁니다
• 처음 접해보는 초보자 입장에서 하는 이야기
• 이렇게 많은 사람들 앞에서 이렇게 긴 발표를 해 보는것도 처음
목차
• <야생의 땅: 듀랑고> 에 대한 이야기
• 생태계 시뮬레이터 소개
• 바이오매스 계산에 대한 이야기
• OpenCL 실행 모델, 메모리 모델
• OpenCL 경험담
• 회고록
<야생의 땅: 듀랑고> 소개
Games maketh man
6
생존
7
전투
8
개척
9
환경
오픈 월드
• 방대한 크기의 오픈 월드
• 여러개의 섬

스마트폰 화면으로 섬 하나를 모두 담으려면 축구장 하나의 크기 정도
• 자유롭게 돌아다니며 채집, 사냥, 건설, 농사 등의 활동
• 월드는 수작업이 아닌 자동으로 생성
수작업 나빠요
:-)
:-(
CC BY 3.0 http://en.wikipedia.org/wiki/Shielded_metal_arc_welding

CC 3.0 http://en.wikipedia.org/wiki/File:Robotworx-arc-welding-robots.jpg
게임 월드 생성 절차
WorldGen
Ecosystem
Simulator
Animal
Incubator
게임 서버
지형 정보 동식물 배치 정보
지형 생성 도구
게임 월드 생성 절차
WorldGen
Ecosystem
Simulator
Animal
Incubator
게임 서버
지형 정보 동식물 배치 정보
지형 생성 도구
생태계 시뮬레이터
지형, 지질, 기후, 주변 생태계 환경 등을 고려하여 식물과 광물을 배치
식물 배치
식물 배치
식물 배치
식물 배치
타일
• 최대 4096x4096 타일
• 게임 내 스케일로 8x8 km
• 각 타일당 다음의 조건을 고려하여 최적의 식물 후보를 선택
• 지질 (초원, 온대림, 열대림, 사바나, 사막, 타이가, 툰드라, 설원 등)
• 고도, 온도, 습도, 비옥도
• 바다, 강, 호수와의 거리
• 랜드마크와의 거리
• 주변 바이오매스(biomass)의 합
식물 배치
만화 © 이말년
자연 조건 시각화
생태계 시뮬레이터 작동 구조
메타데이터 생성, 읽기
지형, 환경 정보 읽어오기
데이터 가공
최종 배치 정보 내보내기바이오매스 맵 업데이트
식물별 생존 적합성 판별
식물, 광물 배치
각 회차(iteration)마다
최초의 프로토타입
• 너무 느려서 2048x2048 정도의 큰 월드에서의 실행은 무리
• 바이오매스 계산이 대부분의 시간을 차지
우리의 작업 환경
Mono
Linux
OpenCL
Ecosystem Simulator
.NET
Windows
OpenCL
Visual Studio
Ecosystem Simulator
바이오매스(biomass) 계산
Biomass is biological material derived from living, or recently living organisms[^1]
[^1]: http://en.wikipedia.org/wiki/Biomass

CC-BY-NC-SA http://www.dialogosfederativos.gov.br/?p=1666
바이오매스
• 특정 생명체가 가지는 생물학적 질량
• 우리 게임에서는 식물 크기의 척도로 사용되기도 함
• 식물의 생장 조건 중 하나가 주변의 바이오매스 총량
• 우리의 기획 의도를 반영할 수 있는 도구 중 하나
• 빽빽하게 심거나, 듬성듬성하게 심거나
바이오매스 맵
계산을 어떻게 빨리 하지…?
CC0 Public Domain http://pixabay.com/en/think-thinking-hand-reflect-622689/
계산을 어떻게 빨리 하지…?
바이오매스 맵을 미리 계산해놓자!
CC0 Public Domain http://pixabay.com/en/think-thinking-hand-reflect-622689/
바이오매스 맵 미리 계산 하기
1. Matrix multiplication
2. Naïve matrix multiplication with OpenCL
3. Optimized matrix multiplication with OpenCL
4. Comprehensive kernel
5. Sparse matrix
OpenCL
The open standard for parallel programming of heterogeneous systems
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)
OpenCL 소개
• 실행 모델
• Task/data parallelism
• 커널(Kernel)
• 메모리 모델
• 메모리 계층구조 (NUMA)
• Work-item, work-group
• 메모리 보호
OpenCL Execution Models
• Task-parallel programming
• Data-parallel programming
OpenCL Execution Models
• Task-parallel programming
• Data-parallel programming
Task Parallelism vs. Data Parallelism
Task 1
Task 1 Task 2 Task 3 Task 1 Task 1 Task 1Task 4
Task Parallelism vs. Data Parallelism
Task 1
Task 1 Task 2 Task 3 Task 1 Task 1 Task 1Task 4
커널(kernel)
Kernel
CC BY-SA 3.0 http://en.wikipedia.org/wiki/Corn_kernel
Kernel
Linux Kernel Map http://www.makelinux.net/kernel_map/
OpenCL Kernel
• C 함수라고 보아도 무방
• OpenCL C = An extended and subsetted version of C99
• 1, 2 또는 3차원 인덱스 스페이스(index space)에 대하여 커널을 실행
• 인덱스 스페이스는 컴퓨테이션 도메인(computation domain)이라 표현하기도 함
1차원 인덱스 스페이스
0 1 2 3 4 5 … n-1
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
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
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
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
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
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
__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차원 글로벌 인덱스
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
Work-item
• 독립적인 실행 단위, 하나의 커널을 실행
• 여러 work-item 이 동시에 실행
• Private 메모리를 가질 수 있음
Work-item 1 Work-item 2 Work-item n
…
Private Memory
Kernel
Private Memory
Kernel
Private Memory
Kernel
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
…
Memory Models
OpenCL Memory Model (from [Khronos 2011])
Memory Models
CPU GPU
Register, L1, L2 cache Private memory
L3 cache
(코어 간 데이터 공유)
Local memory

(Work-group 내 데이터 공유)
Main memory Global memory
느림 대용량
조금 억지스러운 비유이지만...
빠름 저용량
Memory Models
Global Memory
Local Memory Local Memory
…
Work-group 1 Work-group n
Memory Protection
이미지 출처는 https://mirror.enha.kr/wiki/그런%20거%20없다, 원본 화면이 어디서 왔는지는 알 수 없음.
Memory Protection
이미지 출처는 https://mirror.enha.kr/wiki/그런%20거%20없다, 원본 화면이 어디서 왔는지는 알 수 없음.
Memory Protection
• 메모리 블럭은 보호되지 않음
• Segmentation fault 가 보고되지 않음
• 화면 깜빡임, 복구 불가능한 시스템 크래시 등 다양한 이상 현상
• 스크린 해상도 변경 이벤트는 드라이버 레벨에서 감지 가능
An Introduction to the OpenCL
Programming Model
Take One: 행렬의 곱셈
The Matrix is the world that has been pulled over your eyes to blind you from the truth
Take Two: 행렬의 곱셈
Take Two: 행렬의 곱셈
Take Two: 행렬의 곱셈
Take Two: 행렬의 곱셈
Take Two: 행렬의 곱셈
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
MaskBiomass maps
우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
Take Two: 행렬의 곱셈
Take Two: 행렬의 곱셈
Take Two: 행렬의 곱셈
패턴이 보이나요?
…
패턴이 보이나요?
…
Take Two: 행렬의 곱셈
Mask Biomass maps Mask
Take Two: 행렬의 곱셈
Mask Biomass maps Mask
Take Two: 행렬의 곱셈
Mask Biomass maps Mask
Take Two: 행렬의 곱셈
Mask Biomass maps Mask
Take Two: 하지만 문제는…
137,422,176,256
4096x4096 행렬을 곱했을 때 수행되는 곱셈과 덧셈 연산의 수
Take Two: 행렬의 곱셈
30 min
2048x2048 타일, 10회차까지
© 다음카카오
Take Two: 프로파일링 결과
바이오매스 맵 업데이트
생존 조건 판별
데이터 가공
지형 읽어오기
기타
Take Two: 프로파일링 결과
바이오매스 맵 업데이트
생존 조건 판별
데이터 가공
지형 읽어오기
기타
GPGPU 를 이용해서 개선해보자
Take Two: Naïve OpenCL Kernel
The 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
Take Two: Naïve OpenCL Kernel
• 행렬 연산만 OpenCL 을 이용

(코드를 단순하게 하기 위해 글로벌 메모리만 사용)
• 나머지 코드는 그대로
메타데이터 생성, 읽기
지형, 환경 정보 읽어오기
데이터 가공
최종 배치 정보 내보내기바이오매스 맵 업데이트
식물별 생존 적합성 판별
식물, 광물 배치
각 회차(iteration)마다
일반적인 행렬 계산 코드
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;
}
}
}
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;
}
__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)
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
글로벌 메모리 사용
Take Two: Naïve OpenCL
30 min -> 3 min
© 다음카카오
Take Three: Optimized OpenCL Kernel
Take advantage of the non-uniform memory hierarchy
#pragma OPENCL EXTENSION cl_khr_fp64 : enable
#define BLOCK_SIZE 32
__kernel void
matrix_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;
}
Take Three: Optimized OpenCL Kernel
vs.
Take Three: Optimized OpenCL Kernel
__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);
}
Take Three: Optimized OpenCL Kernel
86
부분행렬submatrix 원소들을 채워줌
다른 work-item 들이 작업을 마칠때까지 기다려줌
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 들이 작업을 마칠때까지 기다려줌
Take Three: Optimized OpenCL
3 min -> 1 min 15 sec
우왕 굿
© 다음카카오
하지만...
메타데이터 생성, 읽기
지형, 환경 정보 읽어오기
데이터 가공
최종 배치 정보 내보내기바이오매스 맵 업데이트
식물별 생존 적합성 판별
식물, 광물 배치
각 회차(iteration)마다
하지만...
메타데이터 생성, 읽기
지형, 환경 정보 읽어오기
데이터 가공
최종 배치 정보 내보내기바이오매스 맵 업데이트
식물별 생존 적합성 판별
식물, 광물 배치
각 회차(iteration)마다
Take Four: Comprehensive Kernel
Legitimate general-purpose GPU-based computations
Take Four: Comprehensive Kernel
• 행렬 연산 및 생존 적합성 판단 코드를 모두 OpenCL 로 작성
• 한 회차(iteration)가 끝날때 마다 호스트로 결과 보고
메타데이터 생성, 읽기
지형, 환경 정보 읽어오기
데이터 가공
최종 배치 정보 내보내기바이오매스 맵 업데이트
식물별 생존 적합성 판별
식물, 광물 배치
각 회차(iteration)마다
나는 경이적인 방법으로 프로그램의 속도를 향상시켰다.
그러나 화면의 여백이 너무 좁아 코드를 여기에 옮기지는 않겠다.
1 min 15 sec -> 11 sec
Take Four: Comprehensive Kernel
© 다음카카오
데이터 전송 병목
Host Memory
Device Memory
PCI Express
PCI Express 를 통한 호스트-디바이스 간 데이터 전송
CC BY-SA 3.0 http://en.wikipedia.org/wiki/PCI_Express#/media/File:PCIExpress.jpg
빨라졌지만 시간복잡도가 변한 것은 아니다
성능 비교
수행 시간
0
100
200
300
400
Take One Take Two Take Three Take Four
성능 비교
수행 시간
0
100
200
300
400
Take One Take Two Take Three Take Four
x170
개발 장비 & 테스트 환경
• NVIDIA GeForce GT 740

보급형 그래픽카드
• 2048x2048 타일
• 10회차
• 하이엔드 그래픽카드를 사용한다면?
© NVIDIA
© 2008 Warner Brothers and Legendary Pictures
© 2008 Warner Brothers and Legendary Pictures
One more thing…
Take Five: Compressed Sparse Row
Sufficiently advanced mathematics is indistinguishable from magic
Take Five: Compressed Sparse Row
Mask Biomass maps
비어있는 부분
Take Five: Compressed Sparse Row
Row offsets
Column indicies
Values
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;
Take Five: Compressed Sparse Row
30 min -> 18 sec
(Take One 의 CPU 코드와 비교하여)
회고록
디버깅 난이도, 유지보수 비용, 경제적 타당성 등에 대한 회고
높은 디버깅 난이도
• Segmentation fault 가 보고되지 않음
• No system calls
• printf 디버깅 불가, 로그 파일에 기록 불가
• No stack trace
• 화면 깜빡임과 시스템 크래시로 대체
• 적당한 디버거가 없는줄 알았는데, 발표 자료 만들면서 찾아보니...
• http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-emulator-debugger/
다음번에는 꼭...
유지보수 어려움
• 프로그래머 구하기 어려움[^1]
• Java - 35,180
• Python - 18,668
• OpenCL - 101
• 코드는 이식 가능하지만, 성능은 이식 불가능
• 메모리 크기에 따른 work-item, work-group 수 제한
• 동시에 실행 가능한 쓰레드의 수
[^1]: LinkedIn 에서 각 키워드로 job posting 검색 결과 수 (2015-05-12)
경제적 타당성 (Financial Viability)
• OpenCL 을 이용해 프로그램 수행 속도를 20% 향상시켰지만 전기세가
두 배로 늘었다면?
• 아마존 웹 서비스(AWS)의 GPU 인스턴스는 꽤 비싼 편[^1]
• 개발 난이도와 코드 유지보수 비용 - 개발자의 시간은 비싸다
[^1]: 2015년 5월 버지니아 데이터센터 기준으로 시간당 $0.65-$2.60, 비슷한 CPU 성능을 가진 다른 인스턴스는 $0.42-$1.68
아쉬운 점
• 컬렉션(collection) 라이브러리가 있었으면 좋겠다
• List, set, dictionary …
• GPU 이용을 위해 기존의 코드를 재작성 하지 않아도 되었으면 좋겠다
• hiCUDA - C directive based metalanguage
OpenCL 은 잠시 접어두기로...
OpenCL
T_T
CC0 Public Domain http://pixabay.com/en/litter-disposal-person-trash-can-44039/
OpenCL 은 잠시 접어두기로...
• 공학적 개선 ≈ 수학적 개선
• 비용 > 성능상 이점
• 미래에 다른 기회가 있다면 재도전
• 더 큰 섬
• 더 복잡한 요구 조건
• --no-opencl 플래그
• 언제든지 다시 꺼내서 쓸 수 있는 상태
OpenCL 의 올바른 이용법
• 데이터 교환은 한꺼번에, 계산은 많이
• 불균일 메모리 접근(NUMA)을 적절히 이용
• 브랜칭(branching)은 최소한으로
Branching in GPU
if
if
statement 1
statement 2
statement 2
if (conditions) {
// statement 1
}
// statement 2
감사합니다
Gracias
Get In Touch With Me
• GitHub: http://github.com/suminb
• Twitter: @suminb
• LinkedIn: https://www.linkedin.com/in/suminb

More Related Content

What's hot

[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
ChangKyu Song
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
Jaeseung Ha
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
Esun Kim
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
Jeongkyu Shin
 

What's hot (20)

NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
 
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
[NDC 2014] 던전앤파이터 클라이언트 로딩 최적화
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
[241] 하나의 cpu 에 운영제체 두 개 김성민
[241] 하나의 cpu 에 운영제체 두 개 김성민[241] 하나의 cpu 에 운영제체 두 개 김성민
[241] 하나의 cpu 에 운영제체 두 개 김성민
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
Writing Fast Code (KR)
Writing Fast Code (KR)Writing Fast Code (KR)
Writing Fast Code (KR)
 
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
[244] 분산 환경에서 스트림과 배치 처리 통합 모델[244] 분산 환경에서 스트림과 배치 처리 통합 모델
[244] 분산 환경에서 스트림과 배치 처리 통합 모델
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성
 
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
사례를 통해 살펴보는 프로파일링과 최적화 NDC2013
 
[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기[121]네이버 효과툰 구현 이야기
[121]네이버 효과툰 구현 이야기
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
 

Viewers also liked

[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈 [Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
진현 조
 
The Settler 7- 포스트모템
The Settler 7- 포스트모템The Settler 7- 포스트모템
The Settler 7- 포스트모템
drandom
 
Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
Sehyeon Nam
 
이원, 절차적 지형과 월드 머신, NDC2011
이원, 절차적 지형과 월드 머신, NDC2011이원, 절차적 지형과 월드 머신, NDC2011
이원, 절차적 지형과 월드 머신, NDC2011
devCAT Studio, NEXON
 
[0326 박민근] udk 소개 입문
[0326 박민근] udk 소개 입문[0326 박민근] udk 소개 입문
[0326 박민근] udk 소개 입문
MinGeun Park
 
노동진 Mega splatting
노동진 Mega splatting노동진 Mega splatting
노동진 Mega splatting
drandom
 

Viewers also liked (20)

NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
NDC 2015. 한 그루 한 그루 심지 않아도 돼요. 생태학에 기반한 [야생의 땅: 듀랑고]의 절차적 생성 생태계
 
진선웅 유저수만큼다양한섬을만들자 공개용
진선웅 유저수만큼다양한섬을만들자 공개용진선웅 유저수만큼다양한섬을만들자 공개용
진선웅 유저수만큼다양한섬을만들자 공개용
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
Are Credit Cards Evil
Are Credit Cards EvilAre Credit Cards Evil
Are Credit Cards Evil
 
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
 
박홍근홈패션 사보 2012년 봄호
박홍근홈패션 사보 2012년 봄호박홍근홈패션 사보 2012년 봄호
박홍근홈패션 사보 2012년 봄호
 
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈 [Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
[Gpg1권 조진현] 4.16~4.20 실시간 사실적 지형 + 프랙탈
 
The Settler 7- 포스트모템
The Settler 7- 포스트모템The Settler 7- 포스트모템
The Settler 7- 포스트모템
 
ProudNet 1.7 소개
ProudNet 1.7 소개ProudNet 1.7 소개
ProudNet 1.7 소개
 
웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드웹서버와 프라우드넷 서버간 상호작용 가이드
웹서버와 프라우드넷 서버간 상호작용 가이드
 
Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법Unity에서 회전하는 cube 만드는 법
Unity에서 회전하는 cube 만드는 법
 
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
프라우드넷의 연결 유지 기능과 홀펀칭-윤현민
 
프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채프라우드넷의 IL2CPP 적응 기록-정종채
프라우드넷의 IL2CPP 적응 기록-정종채
 
Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
 
이원, 절차적 지형과 월드 머신, NDC2011
이원, 절차적 지형과 월드 머신, NDC2011이원, 절차적 지형과 월드 머신, NDC2011
이원, 절차적 지형과 월드 머신, NDC2011
 
[0326 박민근] udk 소개 입문
[0326 박민근] udk 소개 입문[0326 박민근] udk 소개 입문
[0326 박민근] udk 소개 입문
 
D three level2
D three level2D three level2
D three level2
 
노동진 Mega splatting
노동진 Mega splatting노동진 Mega splatting
노동진 Mega splatting
 
라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성라이브 서비스를 위한 게임 서버 구성
라이브 서비스를 위한 게임 서버 구성
 
KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론KGC 2014: 분산 게임 서버 구조론
KGC 2014: 분산 게임 서버 구조론
 

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

[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
Donggi Hahm
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
OnGameServer
 

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

Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용
 
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리[Unite2015 박민근] 유니티 최적화 테크닉 총정리
[Unite2015 박민근] 유니티 최적화 테크닉 총정리
 
Tfk 6618 tensor_flow로얼굴인식구현_r10_mariocho
Tfk 6618 tensor_flow로얼굴인식구현_r10_mariochoTfk 6618 tensor_flow로얼굴인식구현_r10_mariocho
Tfk 6618 tensor_flow로얼굴인식구현_r10_mariocho
 
Cocos2dx와 c++11를 이용한 게임 개발
Cocos2dx와 c++11를 이용한 게임 개발Cocos2dx와 c++11를 이용한 게임 개발
Cocos2dx와 c++11를 이용한 게임 개발
 
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
[NDC2014] 직접 만들어서 즐겨보자 - Cocos2d-x3.0으로 한 시간만에 횡스크롤 슈팅게임 만들기 (함동기)
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
쉽고 빠르게 접하는 오픈스택
쉽고 빠르게 접하는 오픈스택쉽고 빠르게 접하는 오픈스택
쉽고 빠르게 접하는 오픈스택
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
Workshop 210417 dhlee
Workshop 210417 dhleeWorkshop 210417 dhlee
Workshop 210417 dhlee
 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
Feature Pyramid Network, FPN
Feature Pyramid Network, FPNFeature Pyramid Network, FPN
Feature Pyramid Network, FPN
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
Macro for Game
Macro for GameMacro for Game
Macro for Game
 
03.12 cnn backpropagation
03.12 cnn backpropagation03.12 cnn backpropagation
03.12 cnn backpropagation
 

More from Sumin Byeon

Error tolerant search
Error tolerant searchError tolerant search
Error tolerant search
Sumin Byeon
 
Git with bitbucket
Git with bitbucketGit with bitbucket
Git with bitbucket
Sumin Byeon
 
Git with bitbucket (draft)
Git with bitbucket (draft)Git with bitbucket (draft)
Git with bitbucket (draft)
Sumin Byeon
 
RNA Secondary Structure Prediction
RNA Secondary Structure PredictionRNA Secondary Structure Prediction
RNA Secondary Structure Prediction
Sumin Byeon
 

More from Sumin Byeon (13)

PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
 
BD Talk 2017 봄 - 원정코딩
BD Talk 2017 봄 - 원정코딩BD Talk 2017 봄 - 원정코딩
BD Talk 2017 봄 - 원정코딩
 
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
 
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
 
2015 PyCon - 프로그래머가 이사하는 법
2015 PyCon - 프로그래머가 이사하는 법2015 PyCon - 프로그래머가 이사하는 법
2015 PyCon - 프로그래머가 이사하는 법
 
Cross-Language Information Retrieval
Cross-Language Information RetrievalCross-Language Information Retrieval
Cross-Language Information Retrieval
 
SLINKY: Static Linking Reloaded
SLINKY: Static Linking ReloadedSLINKY: Static Linking Reloaded
SLINKY: Static Linking Reloaded
 
Project Proposal: Translation Example Search Engine
Project Proposal: Translation Example Search EngineProject Proposal: Translation Example Search Engine
Project Proposal: Translation Example Search Engine
 
Self-Tuning Wireless Network Power Management
Self-Tuning Wireless Network Power ManagementSelf-Tuning Wireless Network Power Management
Self-Tuning Wireless Network Power Management
 
Error tolerant search
Error tolerant searchError tolerant search
Error tolerant search
 
Git with bitbucket
Git with bitbucketGit with bitbucket
Git with bitbucket
 
Git with bitbucket (draft)
Git with bitbucket (draft)Git with bitbucket (draft)
Git with bitbucket (draft)
 
RNA Secondary Structure Prediction
RNA Secondary Structure PredictionRNA Secondary Structure Prediction
RNA Secondary Structure Prediction
 

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

  • 1. 21세기 정원사의 OpenCL 경험담 <야생의 땅: 듀랑고>의 식물 생태계를 담당하는 넥슨코리아 변수민 <suminb@nexon.co.kr>
  • 2. 발표자 소개 - 변수민 • University of Arizona • 컴퓨터 과학(computer science) 전공, 수학 부전공 (2010) • 같은 학교 로봇 인공지능 연구실에서 리서치 프로그래머로 근무 (2011) • 같은 학교에서 컴퓨터 과학 석사 (2013) • 작년 7월에 넥슨에서 게임 프로그래머로 근무 시작 (2014) • 관심 분야: 머신 러닝(machine learning), 데이터 마이닝(data mining), 분산 시스템
  • 3. Disclaimers • 저는 OpenCL 전문가가 아닙니다 • C# 도 처음 써보는겁니다 • 처음 접해보는 초보자 입장에서 하는 이야기 • 이렇게 많은 사람들 앞에서 이렇게 긴 발표를 해 보는것도 처음
  • 4. 목차 • <야생의 땅: 듀랑고> 에 대한 이야기 • 생태계 시뮬레이터 소개 • 바이오매스 계산에 대한 이야기 • OpenCL 실행 모델, 메모리 모델 • OpenCL 경험담 • 회고록
  • 5. <야생의 땅: 듀랑고> 소개 Games maketh man
  • 10. 오픈 월드 • 방대한 크기의 오픈 월드 • 여러개의 섬
 스마트폰 화면으로 섬 하나를 모두 담으려면 축구장 하나의 크기 정도 • 자유롭게 돌아다니며 채집, 사냥, 건설, 농사 등의 활동 • 월드는 수작업이 아닌 자동으로 생성
  • 11. 수작업 나빠요 :-) :-( CC BY 3.0 http://en.wikipedia.org/wiki/Shielded_metal_arc_welding CC 3.0 http://en.wikipedia.org/wiki/File:Robotworx-arc-welding-robots.jpg
  • 12. 게임 월드 생성 절차 WorldGen Ecosystem Simulator Animal Incubator 게임 서버 지형 정보 동식물 배치 정보 지형 생성 도구
  • 13. 게임 월드 생성 절차 WorldGen Ecosystem Simulator Animal Incubator 게임 서버 지형 정보 동식물 배치 정보 지형 생성 도구
  • 14. 생태계 시뮬레이터 지형, 지질, 기후, 주변 생태계 환경 등을 고려하여 식물과 광물을 배치
  • 18. 식물 배치 타일 • 최대 4096x4096 타일 • 게임 내 스케일로 8x8 km
  • 19. • 각 타일당 다음의 조건을 고려하여 최적의 식물 후보를 선택 • 지질 (초원, 온대림, 열대림, 사바나, 사막, 타이가, 툰드라, 설원 등) • 고도, 온도, 습도, 비옥도 • 바다, 강, 호수와의 거리 • 랜드마크와의 거리 • 주변 바이오매스(biomass)의 합 식물 배치 만화 © 이말년
  • 21. 생태계 시뮬레이터 작동 구조 메타데이터 생성, 읽기 지형, 환경 정보 읽어오기 데이터 가공 최종 배치 정보 내보내기바이오매스 맵 업데이트 식물별 생존 적합성 판별 식물, 광물 배치 각 회차(iteration)마다
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36. 최초의 프로토타입 • 너무 느려서 2048x2048 정도의 큰 월드에서의 실행은 무리 • 바이오매스 계산이 대부분의 시간을 차지
  • 37. 우리의 작업 환경 Mono Linux OpenCL Ecosystem Simulator .NET Windows OpenCL Visual Studio Ecosystem Simulator
  • 38. 바이오매스(biomass) 계산 Biomass is biological material derived from living, or recently living organisms[^1] [^1]: http://en.wikipedia.org/wiki/Biomass CC-BY-NC-SA http://www.dialogosfederativos.gov.br/?p=1666
  • 39. 바이오매스 • 특정 생명체가 가지는 생물학적 질량 • 우리 게임에서는 식물 크기의 척도로 사용되기도 함 • 식물의 생장 조건 중 하나가 주변의 바이오매스 총량 • 우리의 기획 의도를 반영할 수 있는 도구 중 하나 • 빽빽하게 심거나, 듬성듬성하게 심거나
  • 41. 계산을 어떻게 빨리 하지…? CC0 Public Domain http://pixabay.com/en/think-thinking-hand-reflect-622689/
  • 42. 계산을 어떻게 빨리 하지…? 바이오매스 맵을 미리 계산해놓자! CC0 Public Domain http://pixabay.com/en/think-thinking-hand-reflect-622689/
  • 43. 바이오매스 맵 미리 계산 하기 1. Matrix multiplication 2. Naïve matrix multiplication with OpenCL 3. Optimized matrix multiplication with OpenCL 4. Comprehensive kernel 5. Sparse matrix
  • 44. OpenCL The open standard for parallel programming of heterogeneous systems
  • 45. 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)
  • 46. OpenCL 소개 • 실행 모델 • Task/data parallelism • 커널(Kernel) • 메모리 모델 • 메모리 계층구조 (NUMA) • Work-item, work-group • 메모리 보호
  • 47. OpenCL Execution Models • Task-parallel programming • Data-parallel programming
  • 48. OpenCL Execution Models • Task-parallel programming • Data-parallel programming
  • 49. Task Parallelism vs. Data Parallelism Task 1 Task 1 Task 2 Task 3 Task 1 Task 1 Task 1Task 4
  • 50. Task Parallelism vs. Data Parallelism Task 1 Task 1 Task 2 Task 3 Task 1 Task 1 Task 1Task 4 커널(kernel)
  • 51. Kernel CC BY-SA 3.0 http://en.wikipedia.org/wiki/Corn_kernel
  • 52. Kernel Linux Kernel Map http://www.makelinux.net/kernel_map/
  • 53. OpenCL Kernel • C 함수라고 보아도 무방 • OpenCL C = An extended and subsetted version of C99 • 1, 2 또는 3차원 인덱스 스페이스(index space)에 대하여 커널을 실행 • 인덱스 스페이스는 컴퓨테이션 도메인(computation domain)이라 표현하기도 함
  • 54. 1차원 인덱스 스페이스 0 1 2 3 4 5 … n-1
  • 55. 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
  • 56. 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
  • 57. 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
  • 58. 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
  • 59. 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
  • 60. 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
  • 61. __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차원 글로벌 인덱스
  • 62. 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
  • 63. Work-item • 독립적인 실행 단위, 하나의 커널을 실행 • 여러 work-item 이 동시에 실행 • Private 메모리를 가질 수 있음 Work-item 1 Work-item 2 Work-item n … Private Memory Kernel Private Memory Kernel Private Memory Kernel
  • 64. 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 …
  • 65. Memory Models OpenCL Memory Model (from [Khronos 2011])
  • 66. Memory Models CPU GPU Register, L1, L2 cache Private memory L3 cache (코어 간 데이터 공유) Local memory
 (Work-group 내 데이터 공유) Main memory Global memory 느림 대용량 조금 억지스러운 비유이지만... 빠름 저용량
  • 67. Memory Models Global Memory Local Memory Local Memory … Work-group 1 Work-group n
  • 68. Memory Protection 이미지 출처는 https://mirror.enha.kr/wiki/그런%20거%20없다, 원본 화면이 어디서 왔는지는 알 수 없음.
  • 69. Memory Protection 이미지 출처는 https://mirror.enha.kr/wiki/그런%20거%20없다, 원본 화면이 어디서 왔는지는 알 수 없음.
  • 70. Memory Protection • 메모리 블럭은 보호되지 않음 • Segmentation fault 가 보고되지 않음 • 화면 깜빡임, 복구 불가능한 시스템 크래시 등 다양한 이상 현상 • 스크린 해상도 변경 이벤트는 드라이버 레벨에서 감지 가능
  • 71. An Introduction to the OpenCL Programming Model
  • 72. Take One: 행렬의 곱셈 The Matrix is the world that has been pulled over your eyes to blind you from the truth
  • 77. Take Two: 행렬의 곱셈 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 78. Take Two: 행렬의 곱셈 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 79. Take Two: 행렬의 곱셈 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 80. Take Two: 행렬의 곱셈 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 81. Take Two: 행렬의 곱셈 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 82. Take Two: 행렬의 곱셈 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 83. Take Two: 행렬의 곱셈 MaskBiomass maps 우리가 알고 싶어하는 것: 행렬의 특정 범위에 있는 요소들의 합
  • 89. Take Two: 행렬의 곱셈 Mask Biomass maps Mask
  • 90. Take Two: 행렬의 곱셈 Mask Biomass maps Mask
  • 91. Take Two: 행렬의 곱셈 Mask Biomass maps Mask
  • 92. Take Two: 행렬의 곱셈 Mask Biomass maps Mask
  • 93. Take Two: 하지만 문제는…
  • 94. 137,422,176,256 4096x4096 행렬을 곱했을 때 수행되는 곱셈과 덧셈 연산의 수
  • 95. Take Two: 행렬의 곱셈 30 min 2048x2048 타일, 10회차까지 © 다음카카오
  • 96. Take Two: 프로파일링 결과 바이오매스 맵 업데이트 생존 조건 판별 데이터 가공 지형 읽어오기 기타
  • 97. Take Two: 프로파일링 결과 바이오매스 맵 업데이트 생존 조건 판별 데이터 가공 지형 읽어오기 기타 GPGPU 를 이용해서 개선해보자
  • 98. Take Two: Naïve OpenCL Kernel The 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
  • 99. Take Two: Naïve OpenCL Kernel • 행렬 연산만 OpenCL 을 이용
 (코드를 단순하게 하기 위해 글로벌 메모리만 사용) • 나머지 코드는 그대로 메타데이터 생성, 읽기 지형, 환경 정보 읽어오기 데이터 가공 최종 배치 정보 내보내기바이오매스 맵 업데이트 식물별 생존 적합성 판별 식물, 광물 배치 각 회차(iteration)마다
  • 100. 일반적인 행렬 계산 코드 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; } } }
  • 101. 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; }
  • 102. __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)
  • 103. 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 글로벌 메모리 사용
  • 104. Take Two: Naïve OpenCL 30 min -> 3 min © 다음카카오
  • 105. Take Three: Optimized OpenCL Kernel Take advantage of the non-uniform memory hierarchy
  • 106. #pragma OPENCL EXTENSION cl_khr_fp64 : enable #define BLOCK_SIZE 32 __kernel void matrix_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; }
  • 107. Take Three: Optimized OpenCL Kernel vs.
  • 108. Take Three: Optimized OpenCL Kernel __local double A_sub[BLOCK_SIZE][BLOCK_SIZE]; __local double B_sub[BLOCK_SIZE][BLOCK_SIZE]; 로컬 메모리 할당
  • 109. 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 들이 작업을 마칠때까지 기다려줌
  • 110. 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 들이 작업을 마칠때까지 기다려줌
  • 111. Take Three: Optimized OpenCL 3 min -> 1 min 15 sec 우왕 굿 © 다음카카오
  • 112. 하지만... 메타데이터 생성, 읽기 지형, 환경 정보 읽어오기 데이터 가공 최종 배치 정보 내보내기바이오매스 맵 업데이트 식물별 생존 적합성 판별 식물, 광물 배치 각 회차(iteration)마다
  • 113. 하지만... 메타데이터 생성, 읽기 지형, 환경 정보 읽어오기 데이터 가공 최종 배치 정보 내보내기바이오매스 맵 업데이트 식물별 생존 적합성 판별 식물, 광물 배치 각 회차(iteration)마다
  • 114. Take Four: Comprehensive Kernel Legitimate general-purpose GPU-based computations
  • 115. Take Four: Comprehensive Kernel • 행렬 연산 및 생존 적합성 판단 코드를 모두 OpenCL 로 작성 • 한 회차(iteration)가 끝날때 마다 호스트로 결과 보고 메타데이터 생성, 읽기 지형, 환경 정보 읽어오기 데이터 가공 최종 배치 정보 내보내기바이오매스 맵 업데이트 식물별 생존 적합성 판별 식물, 광물 배치 각 회차(iteration)마다
  • 116. 나는 경이적인 방법으로 프로그램의 속도를 향상시켰다. 그러나 화면의 여백이 너무 좁아 코드를 여기에 옮기지는 않겠다.
  • 117. 1 min 15 sec -> 11 sec Take Four: Comprehensive Kernel © 다음카카오
  • 118. 데이터 전송 병목 Host Memory Device Memory PCI Express PCI Express 를 통한 호스트-디바이스 간 데이터 전송 CC BY-SA 3.0 http://en.wikipedia.org/wiki/PCI_Express#/media/File:PCIExpress.jpg
  • 120. 성능 비교 수행 시간 0 100 200 300 400 Take One Take Two Take Three Take Four
  • 121. 성능 비교 수행 시간 0 100 200 300 400 Take One Take Two Take Three Take Four x170
  • 122. 개발 장비 & 테스트 환경 • NVIDIA GeForce GT 740
 보급형 그래픽카드 • 2048x2048 타일 • 10회차 • 하이엔드 그래픽카드를 사용한다면? © NVIDIA
  • 123. © 2008 Warner Brothers and Legendary Pictures
  • 124. © 2008 Warner Brothers and Legendary Pictures
  • 126. Take Five: Compressed Sparse Row Sufficiently advanced mathematics is indistinguishable from magic
  • 127. Take Five: Compressed Sparse Row Mask Biomass maps 비어있는 부분
  • 128. Take Five: Compressed Sparse Row Row offsets Column indicies Values
  • 129. 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;
  • 130. Take Five: Compressed Sparse Row 30 min -> 18 sec (Take One 의 CPU 코드와 비교하여)
  • 131. 회고록 디버깅 난이도, 유지보수 비용, 경제적 타당성 등에 대한 회고
  • 132. 높은 디버깅 난이도 • Segmentation fault 가 보고되지 않음 • No system calls • printf 디버깅 불가, 로그 파일에 기록 불가 • No stack trace • 화면 깜빡임과 시스템 크래시로 대체 • 적당한 디버거가 없는줄 알았는데, 발표 자료 만들면서 찾아보니... • http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-emulator-debugger/
  • 134. 유지보수 어려움 • 프로그래머 구하기 어려움[^1] • Java - 35,180 • Python - 18,668 • OpenCL - 101 • 코드는 이식 가능하지만, 성능은 이식 불가능 • 메모리 크기에 따른 work-item, work-group 수 제한 • 동시에 실행 가능한 쓰레드의 수 [^1]: LinkedIn 에서 각 키워드로 job posting 검색 결과 수 (2015-05-12)
  • 135. 경제적 타당성 (Financial Viability) • OpenCL 을 이용해 프로그램 수행 속도를 20% 향상시켰지만 전기세가 두 배로 늘었다면? • 아마존 웹 서비스(AWS)의 GPU 인스턴스는 꽤 비싼 편[^1] • 개발 난이도와 코드 유지보수 비용 - 개발자의 시간은 비싸다 [^1]: 2015년 5월 버지니아 데이터센터 기준으로 시간당 $0.65-$2.60, 비슷한 CPU 성능을 가진 다른 인스턴스는 $0.42-$1.68
  • 136. 아쉬운 점 • 컬렉션(collection) 라이브러리가 있었으면 좋겠다 • List, set, dictionary … • GPU 이용을 위해 기존의 코드를 재작성 하지 않아도 되었으면 좋겠다 • hiCUDA - C directive based metalanguage
  • 137. OpenCL 은 잠시 접어두기로... OpenCL T_T CC0 Public Domain http://pixabay.com/en/litter-disposal-person-trash-can-44039/
  • 138. OpenCL 은 잠시 접어두기로... • 공학적 개선 ≈ 수학적 개선 • 비용 > 성능상 이점 • 미래에 다른 기회가 있다면 재도전 • 더 큰 섬 • 더 복잡한 요구 조건 • --no-opencl 플래그 • 언제든지 다시 꺼내서 쓸 수 있는 상태
  • 139. OpenCL 의 올바른 이용법 • 데이터 교환은 한꺼번에, 계산은 많이 • 불균일 메모리 접근(NUMA)을 적절히 이용 • 브랜칭(branching)은 최소한으로
  • 140. Branching in GPU if if statement 1 statement 2 statement 2 if (conditions) { // statement 1 } // statement 2
  • 142. Get In Touch With Me • GitHub: http://github.com/suminb • Twitter: @suminb • LinkedIn: https://www.linkedin.com/in/suminb