이 발표는 넥슨의 신규 개발 게임인 듀랑고의 생태계에 대한 간략한 소개와 OpenCL 을 이용한 병렬 처리에 관한 전반적인 기술적 내용을 다룹니다. 게임 속의 세계에서 지형과 기후, 지질 조건에 맞게 여러 종류의 식물과 광물들을 알맞은 곳에 배치시키는 것이 생태계 시뮬레이터의 역할인데, 이 시뮬레이터는 방대한 양의 계산을 수행합니다. 초기에 만들어진 프로토타입은 이러한 계산을 수행하는데 30분이 넘게 걸렸지만, 병렬처리, 알고리즘 시간복잡도 개선 등의 여러가지 방법들을 통해 그 시간을 11초까지 단축시켰습니다. 구체적으로 어떤 방법들을 시도했었고, 어떤 방법들이 효과가 있었는지 여러분과 그 경험담을 공유하고자 합니다.
이 발표는 [야생의 땅: 듀랑고]의 지형 배포 시스템과 생태계 시뮬레이션 자동화 시스템에 대한 이야기를 다룹니다. 듀랑고의 각 섬은 크기와 지형, 기후 조건이 다양하고 섬의 개수가 많아서 수동으로 관리하는 것은 사실상 불가능합니다. 몇번의 사내 테스트와 베타 테스트를 거치면서 이러한 문제를 해결해주는 자동화된 도구의 필요성이 절실해졌고, 작년에 NDC에서 발표했던 생태계 시뮬레이터와 Docker, 그리고 아마존 웹서비스(AWS)를 이용하여 수많은 섬들을 자동으로 생성하고 관리하는 자동화 시스템을 구축하게 되었습니다. 그 과정에서 했던 고민들, 기존의 애플리케이션을 "Dockerizing" 했던 경험, AWS의 각 서비스들을 적절히 활용했던 이야기, AWS의 각 지역별 요금이 상이하다는 점을 이용해서 비용을 절감한 사례, 그리고 자동화 시스템의 문제점과 앞으로의 방향에 대해서 이야기 할 계획입니다.
오픈 소스 Actor Framework 인 Akka.NET 을 통해 온라인 게임 서버를 어떻게 구현할 수 있는지를 설명합니다. Actor Model 에 대한 기본 이해부터 Scale-out 가능한 게임 서버 구축까지 전반적인 내용에 대해 알 수 있습니다. 설명을 위해 클라이언트는 Unity3D 를 사용할 예정입니다.
이 발표는 [야생의 땅: 듀랑고]의 지형 배포 시스템과 생태계 시뮬레이션 자동화 시스템에 대한 이야기를 다룹니다. 듀랑고의 각 섬은 크기와 지형, 기후 조건이 다양하고 섬의 개수가 많아서 수동으로 관리하는 것은 사실상 불가능합니다. 몇번의 사내 테스트와 베타 테스트를 거치면서 이러한 문제를 해결해주는 자동화된 도구의 필요성이 절실해졌고, 작년에 NDC에서 발표했던 생태계 시뮬레이터와 Docker, 그리고 아마존 웹서비스(AWS)를 이용하여 수많은 섬들을 자동으로 생성하고 관리하는 자동화 시스템을 구축하게 되었습니다. 그 과정에서 했던 고민들, 기존의 애플리케이션을 "Dockerizing" 했던 경험, AWS의 각 서비스들을 적절히 활용했던 이야기, AWS의 각 지역별 요금이 상이하다는 점을 이용해서 비용을 절감한 사례, 그리고 자동화 시스템의 문제점과 앞으로의 방향에 대해서 이야기 할 계획입니다.
오픈 소스 Actor Framework 인 Akka.NET 을 통해 온라인 게임 서버를 어떻게 구현할 수 있는지를 설명합니다. Actor Model 에 대한 기본 이해부터 Scale-out 가능한 게임 서버 구축까지 전반적인 내용에 대해 알 수 있습니다. 설명을 위해 클라이언트는 Unity3D 를 사용할 예정입니다.
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
PYCON Korea 2015
Python은 과학 계산 분야에서도 이미 널리 사용되고 있습니다. numpy와 scipy 기반으로 만들어진 많은 모듈들이 휼륭한 생태계를 이루고 있기 때문입니다. 그러나 극한의 계산 성능을 요구하는 분야(HPC, High Performance Computing)에서는 여전히 C와 Fortran으로만으로 짜여진 코드들이 선호되고 있습니다. 이런 분야에서 Python에 대한 일반적인 견해는 전처리/후처리에는 유용하지만 메인 코드에 적용하기에는 느리다라는 것입니다.
이번 발표에서는 HPC 분야에서도 Python의 유용함을 보여줍니다. 계산이 집중된 부분만을 Fortran, C로 구현하여 Python 메인 코드에 접합하면, Python의 장점은 충분히 활용하면서도 계산 성능에 큰 손해는 보지 않을 수 있습니다. 게다가 CUDA-C, OpenCL-C와 연동하면 GPU, MIC와 같은 가속 프로세서들도 비교적 쉽게 활용할 수 있습니다. 이번 발표에서는 간단한 시뮬레이션 코드를 예제로 사용하여 Python 코드로부터 시작하여 Fortran, C, CUDA-C, OpenCL-C 등을 단계적으로 접합해 나가는 것을 보여줄 것입니다.
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
머신러닝 및 데이터 과학 분야의 컴퓨팅 수요는 해가 갈수록 급증하고 있습니다. 이와 더불어 분산처리 기술, 데이터 파이프라이닝 및 개발 환경 스택 관리 등의 관련된 다양한 이슈들 또한 엄청나게 늘어나고 있습니다. 머신러닝 모델의 기하급수적인 모델 복잡도 증가 추세와 마찬가지로, 모델 학습을 위한 환경 관리 또한 갈수록 복잡도가 높아지는 추세입니다.
이 세션에서는 이러한 문제를 해결하기 위해 python 언어 기반의 분산처리 스케쥴링/오케스트레이션 미들웨어 플랫폼을 개발한 4년간의 과정에서 겪은 다양한 문제들에 대해 다룹니다. 2015년 컨테이너 기반의 고밀도 분산처리 플랫폼 설계 및 프로토타이핑 과정을 PyCon KR에서 발표한 이후, 실제 구현 및 오픈소스화, 안정화를 거치며 겪은 다양한 기술적/비기술적 문제들에 대한 경험을 공유합니다.
기술적으로는 최근 몇 년 간의 클러스터 플랫폼 관련 기술의 진보와 함께 탄생한 다양한 도구들과, 이러한 도구들을 python 기반으로 엮어내기 위해 사용하고 개발한 다양한 오픈소스들을 다룹니다. Python 기반의 컨테이너 스케쥴링 및 오케스트레이션 과정의 구현과, 다양한 프로그래밍 언어로 만든 SDK를 graphQL을 이용하여 연동하는 과정에서의 몇몇 유의점을 설명합니다. 아울러 python 기반의 SDK를 다양한 언어로 포팅했던 경험을 간단하게 안내합니다.
플랫폼을 개발하는 중 등장한 TensorFlow, PyTorch 등의 다양한 머신러닝 프레임워크들을 도입하며 겪은 문제와 해결 과정에 대해서도 나눕니다. 연구 분야에는 Python 2.7 기반의 프레임워크들이 여전히 많습니다. 이러한 프레임워크 및 라이브러리의 지원을 위하여 Python 2 기반의 프레임워크와 Python 3.7로 구현한 컨테이너 인터페이스를 단일 컨테이너 환경에 중복 빌드 및 상호 간섭 없이 공존시키기 위해 개발한 아이디어를 소개합니다.
마지막으로 Python 기반의 프레임워크를 개발, 배포 및 상용화 하는 과정에서 겪은 다양한 어려움을 소개합니다. 솔루션을 배포 및 보급할 때 겪는 다양한 런타임, 하드웨어 환경 및 개인 정보 보호를 위한 폐쇄망 대상의 디플로이 등에 대응하기 위하여 Python 응용프로그램을 단독 실행용으로 패키징하는 과정에서 겪은 팁들을 설명합니다. 또한 GUI 빌드 및 Python, Go 및 C++을 함께 사용한 드라이버 가상화 레이어 개발 등의 내용도 살짝 다룹니다.
이 슬라이드는 PyCon KR 2019의 발표 슬라이드입니다. ( https://www.pycon.kr/program/talk-detail?id=138 )
오늘날 멀티코어 프로세서 세상은 이기종 컴퓨팅 환경이 대부분이라 해도 과언이 아니다.
병렬 컴퓨팅은 비약적인 속도 향상과 전력 소비 감소라는 장점이 있지만 사용하기가 까다롭고 특히 다양한 아키텍처로 이루어진 이기종 컴퓨팅 환경에서는 소프트웨어 개발이 더욱 어려워진다.
이 프리젠테이션에서는 이기종 컴퓨팅 환경에서의 병렬 처리를 위한 프로그래밍 언어를 소개하고 OpenCV와 같은 영상처리 라이브러리에서의 활용 예시를 보여준다
[NDC 2014] 유저 수만큼 다양한 섬을 만들자
<야생의>의 절차적인 섬 생성 기법
발표장에서 시간이 없어서 답변드리지 못했던 Q&A 내용들을 뒷 부분에 추가하였습니다.
GIF 가 포함된 부분은 잘 나오지 않으므로 궁금하시면 직접 다운로드 받아서 보시기 바랍니다. - http://goo.gl/UUKmjL
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
PYCON Korea 2015
Python은 과학 계산 분야에서도 이미 널리 사용되고 있습니다. numpy와 scipy 기반으로 만들어진 많은 모듈들이 휼륭한 생태계를 이루고 있기 때문입니다. 그러나 극한의 계산 성능을 요구하는 분야(HPC, High Performance Computing)에서는 여전히 C와 Fortran으로만으로 짜여진 코드들이 선호되고 있습니다. 이런 분야에서 Python에 대한 일반적인 견해는 전처리/후처리에는 유용하지만 메인 코드에 적용하기에는 느리다라는 것입니다.
이번 발표에서는 HPC 분야에서도 Python의 유용함을 보여줍니다. 계산이 집중된 부분만을 Fortran, C로 구현하여 Python 메인 코드에 접합하면, Python의 장점은 충분히 활용하면서도 계산 성능에 큰 손해는 보지 않을 수 있습니다. 게다가 CUDA-C, OpenCL-C와 연동하면 GPU, MIC와 같은 가속 프로세서들도 비교적 쉽게 활용할 수 있습니다. 이번 발표에서는 간단한 시뮬레이션 코드를 예제로 사용하여 Python 코드로부터 시작하여 Fortran, C, CUDA-C, OpenCL-C 등을 단계적으로 접합해 나가는 것을 보여줄 것입니다.
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
머신러닝 및 데이터 과학 분야의 컴퓨팅 수요는 해가 갈수록 급증하고 있습니다. 이와 더불어 분산처리 기술, 데이터 파이프라이닝 및 개발 환경 스택 관리 등의 관련된 다양한 이슈들 또한 엄청나게 늘어나고 있습니다. 머신러닝 모델의 기하급수적인 모델 복잡도 증가 추세와 마찬가지로, 모델 학습을 위한 환경 관리 또한 갈수록 복잡도가 높아지는 추세입니다.
이 세션에서는 이러한 문제를 해결하기 위해 python 언어 기반의 분산처리 스케쥴링/오케스트레이션 미들웨어 플랫폼을 개발한 4년간의 과정에서 겪은 다양한 문제들에 대해 다룹니다. 2015년 컨테이너 기반의 고밀도 분산처리 플랫폼 설계 및 프로토타이핑 과정을 PyCon KR에서 발표한 이후, 실제 구현 및 오픈소스화, 안정화를 거치며 겪은 다양한 기술적/비기술적 문제들에 대한 경험을 공유합니다.
기술적으로는 최근 몇 년 간의 클러스터 플랫폼 관련 기술의 진보와 함께 탄생한 다양한 도구들과, 이러한 도구들을 python 기반으로 엮어내기 위해 사용하고 개발한 다양한 오픈소스들을 다룹니다. Python 기반의 컨테이너 스케쥴링 및 오케스트레이션 과정의 구현과, 다양한 프로그래밍 언어로 만든 SDK를 graphQL을 이용하여 연동하는 과정에서의 몇몇 유의점을 설명합니다. 아울러 python 기반의 SDK를 다양한 언어로 포팅했던 경험을 간단하게 안내합니다.
플랫폼을 개발하는 중 등장한 TensorFlow, PyTorch 등의 다양한 머신러닝 프레임워크들을 도입하며 겪은 문제와 해결 과정에 대해서도 나눕니다. 연구 분야에는 Python 2.7 기반의 프레임워크들이 여전히 많습니다. 이러한 프레임워크 및 라이브러리의 지원을 위하여 Python 2 기반의 프레임워크와 Python 3.7로 구현한 컨테이너 인터페이스를 단일 컨테이너 환경에 중복 빌드 및 상호 간섭 없이 공존시키기 위해 개발한 아이디어를 소개합니다.
마지막으로 Python 기반의 프레임워크를 개발, 배포 및 상용화 하는 과정에서 겪은 다양한 어려움을 소개합니다. 솔루션을 배포 및 보급할 때 겪는 다양한 런타임, 하드웨어 환경 및 개인 정보 보호를 위한 폐쇄망 대상의 디플로이 등에 대응하기 위하여 Python 응용프로그램을 단독 실행용으로 패키징하는 과정에서 겪은 팁들을 설명합니다. 또한 GUI 빌드 및 Python, Go 및 C++을 함께 사용한 드라이버 가상화 레이어 개발 등의 내용도 살짝 다룹니다.
이 슬라이드는 PyCon KR 2019의 발표 슬라이드입니다. ( https://www.pycon.kr/program/talk-detail?id=138 )
오늘날 멀티코어 프로세서 세상은 이기종 컴퓨팅 환경이 대부분이라 해도 과언이 아니다.
병렬 컴퓨팅은 비약적인 속도 향상과 전력 소비 감소라는 장점이 있지만 사용하기가 까다롭고 특히 다양한 아키텍처로 이루어진 이기종 컴퓨팅 환경에서는 소프트웨어 개발이 더욱 어려워진다.
이 프리젠테이션에서는 이기종 컴퓨팅 환경에서의 병렬 처리를 위한 프로그래밍 언어를 소개하고 OpenCV와 같은 영상처리 라이브러리에서의 활용 예시를 보여준다
[NDC 2014] 유저 수만큼 다양한 섬을 만들자
<야생의>의 절차적인 섬 생성 기법
발표장에서 시간이 없어서 답변드리지 못했던 Q&A 내용들을 뒷 부분에 추가하였습니다.
GIF 가 포함된 부분은 잘 나오지 않으므로 궁금하시면 직접 다운로드 받아서 보시기 바랍니다. - http://goo.gl/UUKmjL
‘더 나은 번역기’는 일본어 중역을 이용한 번역 서비스입니다. 2013년 봄, 장난스럽게 시작한 프로젝트가 이제는 직장인들과 대학생들이 즐겨 쓰는, 하루 4만건 이상의 번역 요청을 처리하는 인기 서비스가 되었습니다. 더 나은 번역기가 어떤 계기로 만들어졌는지, 2년 반 넘게 운영하면서 어떤 에피소드들이 있었는지 이야기 해볼 계획입니다. 더불어, 더 나은 번역기가 대학원 시절 방황하던 제 삶에 어떤 긍정적 변화를 주었는지, 앞으로의 방향은 무엇인지에 대해서도 이야기 하겠습니다.
2016년 4월 27일, NDC2016 발표자료입니다.
전통적인 콘텐츠 생산은 기획자, 개발자가 하나하나 컨트롤해야 하는 노동집약적 산업입니다. 저 또한 처음에 입사했을 때 출시를 위해 며칠 만에 이백여 개가 넘는 맵을 찍어야 했던 아픔이 있습니다. 그 뒤에도 플레이어들을 위한 콘텐츠 생산은 계속되었지만, 플레이어들의 콘텐츠 소비 속도는 생산 속도를 뛰어넘은 지 오래되었습니다. 대안은 로그라이크 같은 장르에서 널리 쓰이는 Procedural Contents Generation이라고 생각합니다. 외국 인디 씬에서는 이미 많이 사용되고 있는 이 방법에 최근 점점 더 많이 사용되고 있는 신경망을 활용해서 색다른 콘텐츠 생산 기법을 소개하려 합니다.
[2017년 SW 마에스트로 100+ 컨퍼런스]
- 발표자: 오픈스택 한국 커뮤니티 조성수
- 행사 정보: https://www.facebook.com/swmaestro/photos/a.816861878341341.1073741828.812223648805164/1832957773398408/?type=3&theater&ifg=1
발표 당일에 발표를 결심하는 바람에 아침부터 코엑스로 가는 버스 안에서, 점심 시간과 쉬는 쉬간에 틈틈이 작업하느라 리허설을 한 번밖에 해보지 못해서 발표할 때 거의 슬라이드 노트를 읽다시피 했던 점 넓은 마음으로 양해 부탁드립니다. 마지막 한 문장을 남겨두고 징이 울려서 매우 아쉽네요. 좋은 행사를 만드는데 기여하신 모든 스텝, 발표자 그리고 참가자 분들께 진심으로 감사드립니다. 내년에 또 뵐 수 있었으면 좋겠습니다.
Cross-language information retrieval (CLIR) is a technique to locate documents written in one natural language by queries expressed in another language. This project investigates the feasibility of CLIR based on domain-specific bilingual corpus databases.
SLINKY is a different kind of linking technique to overcome drawbacks of static linking without the complexity of dynamic linking, by implicit sharing of data chunks based on their digests. SLINKY suffers virtually no performance degradation and provides a comparable memory footprint to the dynamic linking counterparts.
Self-Tuning Wireless Network Power ManagementSumin Byeon
Explores strategies to design and implement an intelligent power management module that adapts to the usage pattern and the characteristics of the network interface card.
Anand, Manish, Edmund B. Nightingale, and Jason Flinn. "Self-Tuning Wireless Network Power Management." Wireless Networks 11.4 (2005): 451-69. Print.
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 경험담
• 회고록
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
게임 서버
지형 정보 동식물 배치 정보
지형 생성 도구
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. 바이오매스
• 특정 생명체가 가지는 생물학적 질량
• 우리 게임에서는 식물 크기의 척도로 사용되기도 함
• 식물의 생장 조건 중 하나가 주변의 바이오매스 총량
• 우리의 기획 의도를 반영할 수 있는 도구 중 하나
• 빽빽하게 심거나, 듬성듬성하게 심거나
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
• 메모리 보호
53. OpenCL Kernel
• C 함수라고 보아도 무방
• OpenCL C = An extended and subsetted version of C99
• 1, 2 또는 3차원 인덱스 스페이스(index space)에 대하여 커널을 실행
• 인덱스 스페이스는 컴퓨테이션 도메인(computation domain)이라 표현하기도 함
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
…
66. Memory Models
CPU GPU
Register, L1, L2 cache Private memory
L3 cache
(코어 간 데이터 공유)
Local memory
(Work-group 내 데이터 공유)
Main memory Global memory
느림 대용량
조금 억지스러운 비유이지만...
빠름 저용량
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
글로벌 메모리 사용
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;
}
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 들이 작업을 마칠때까지 기다려줌
115. Take Four: Comprehensive Kernel
• 행렬 연산 및 생존 적합성 판단 코드를 모두 OpenCL 로 작성
• 한 회차(iteration)가 끝날때 마다 호스트로 결과 보고
메타데이터 생성, 읽기
지형, 환경 정보 읽어오기
데이터 가공
최종 배치 정보 내보내기바이오매스 맵 업데이트
식물별 생존 적합성 판별
식물, 광물 배치
각 회차(iteration)마다
116. 나는 경이적인 방법으로 프로그램의 속도를 향상시켰다.
그러나 화면의 여백이 너무 좁아 코드를 여기에 옮기지는 않겠다.
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
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;
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)은 최소한으로