2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)

K
병렬 컴퓨팅 소개
김정현
서울대학교 컴퓨터공학부
멀티코어 컴퓨팅 연구실
2015.05.23
발표자 소개 - 김정현
• 해커 16기
• 2007년 경희대 졸업(02학번)
• 2009년 서울대 석사
• 2015년 현재 서울대 컴퓨터공학부 박사과정
• 관심분야
• 컴퓨터 구조, 병렬 컴퓨팅, 컴파일러
목차
• 전통적인 프로세서의 성능 향상 기법
• 멀티 코어의 출현
• 병렬 컴퓨팅이란?
• 병렬 프로그래밍 모델
• GPGPU
• CUDA/OpenCL
• 병렬 컴퓨팅의 한계
• 병렬 프로그래밍 시 유의사항
• 요약
전통적인 프로세서의 속도 향상 기법
• 프로세서의 주파수를 높임
• 주파수
• 프로세서가 한 명령어를 수행하는데 필요한 주기
• 1GHz 프로세서: 1개의 명령을 1나노초에 처리
• 소프트웨어의 수정 없이 성능이 향상됨
• 1GHz 프로세서를 2GHz 프로세서로 업그레이드하면?
• 대략 2배의 성능향상
Intel Processor Clock Speed(MHz)
http://people.cs.clemson.edu/~mark/330links.html
주파수가 더 이상
증가하지 않음
멀티 코어의 출현
• 주파수 증가가 멈춘 이유?
• 하드웨어의 한계
• 주파수를 올리면 그에 따라 발열이 올라감
• CPU fan만으로는 제어 불가능한 발열량 발생
• 하지만 CPU 집적도는 계속하여 향상됨
• 동일한 면적에 더 많은 트랜지스터를 넣을 수 있음
• 이 공간을 어떻게 활용하지?
• 멀티 코어!
멀티 코어란?
• 프로세서
• CPU 칩을 의미
• 코어
• CPU 칩 안에서 계산을 담당하는 주체
• 멀티 코어?
• 여러 개의 코어가 하나의 프로세서에 집적됨
멀티 코어
http://muphy.egloos.com/855350
병렬 컴퓨팅이란?
• Parallel Computing
• 동시에 다수의 계산을 수행하는 방법
• 예제
• 1부터 100까지의 합을 여러 개의 코어가 나누어 계산
• 1~50까지 코어 0이 계산
• 51~100까지 코어 1이 계산
왜 병렬 컴퓨팅이 필요한가?
• 다수의 코어를 가진 현대 컴퓨터
• 데스크톱 프로세서
• 모바일 프로세서
• 다수의 코어를 효과적으로 이용하는 방법?
• 다수의 프로그램을 동시에 실행
• 하나의 큰 프로그램을 여러 개로 분할하여 동시에 실행
다수의 프로그램을 동시에 실행
• 웹 브라우저는 코어 0에서 실행
• 엑셀 프로그램은 코어 1에서 실행
• 파워포인트 프로그램은 코어 2에서 실행
• 단점?
• 위의 프로그램들은 모두 사용자의 입력을 기다리는 프로그램
• 일반적으로 사용자는 한 시점에 하나의 프로그램만을 이용
• 세 프로그램이 하나의 프로세서에서 실행되어도 유저는 감지하지 못함
하나의 큰 프로그램을 분할
• 많은 계산을 요구하는 프로그램?
• 게임
• 원소가 10만 개인 두 배열의 곱셈
• 어떻게 분할하나?
• 게임
• 네트워킹 담당 부분
• 물리 엔진 계산 부분
• UI 렌더링
• 곱셈
• 10만개를 각 코어별로 나누어 계산
Task parallelism
(태스크 병렬화)
Data parallelism
(데이터 병렬화)
병렬 프로그래밍 모델?
• CPU를 위한 병렬 프로그래밍 모델
• pthreads
• OpenMP
• MPI
• Intel Threading Building Blocks
• GPU를 위한 병렬 프로그래밍 모델
• CUDA
• OpenCL
GPGPU
• General-purpose computing on graphics processing units
• GPU의 목적
• 모니터에 각 픽셀들의 색을 결정
• 이를 위해 다수의 코어가 존재함
• NVIDIA GTX960의 경우 1024개의 CUDA 코어가 있음
• 이렇게 많은 코어를 계산용으로 활용할 순 없을까?
• GPGPU의 탄생
• 초기의 프로그래밍 모델: OpenGL이나 DirectX를 이용
• 계산 전용 프로그래밍 모델의 등장
• CUDA/OpenCL
CUDA
• Compute Unified Device Architecture
• NVIDIA에서 제안/관리
• NVIDIA GPU에서만 동작함
• https://developer.nvidia.com/cuda-zone
OpenCL
• Open Computing Language
• Khronos Group에서 제안/관리
• 공개된 무료 표준
• CPU, GPU, FPGA등 다양한 계산이 가능한 프로세서에서 동작
가능
• 하드웨어 벤더가 OpenCL SDK를 제공해야 함
• https://www.khronos.org/opencl/
병렬 컴퓨팅의 한계
• 프로그래머에 따라 프로그램의 실행 속도가 크게 다를 수 있음
• 더 좋은 프로세서로 업그레이드
• 소프트웨어의 성능 향상은 기대하기 힘듦
• 주파수는 정체, 코어의 수가 증가
• 어떻게 병렬화를 할 것인가?
병렬화 방법
• 태스크 병렬화(Task parallelism)
• 게임의 각 부분을 각 코어가 담당하도록 구현
• 데이터 병렬화(Data parallelism)
• 전체 데이터를 N등분 하여 각 코어에게 할당
암달의 법칙(Amdahl‘s law)
• 멀티 코어를 이용한 프로그램의 성능 향상은 순차적으로 진행
하는 부분에 의해 결정됨
병렬화 영역
(Parallel portion)
암달의 법칙(Amdahl‘s law)
병렬화의 성능은 병렬화되지 않은
영역에 의해 제한된다!
http://en.wikipedia.org/wiki/Amdahl's_law
병렬 컴퓨팅의 실제
https://namu.wiki/w/멀티코어 프로세서
병렬 프로그래밍 시 유의 사항
• 정확성
• 실행 순서의 정의
• 임계 구역(Critical Section)
• 성능
• 접근 순서에 따른 성능
실행 순서의 정의
a=3;
b=a;
thread0 thread1
thread0
a=3
thread1
b=a
b=a
실행 순서의 정의
a=3;
b=a;
thread0 thread1
thread0 thread1
a=3;
b=a;
실행 순서의 정의
a=3;
flag=1;
while(flag==0);
b=a;
thread0 thread1
thread0 thread1
a=3;
b=a;
flag=1;
while(flag==0);
임계 구역(Critical Section)
C code
x++;
Instruction
Load x→reg
Inc reg
Store reg→x
thread0 thread1
임계 구역(Critical Section)
Load x→reg
Inc reg
Store reg→x
thread0
Load x→reg
Inc reg
Store reg→x
thread1
Load x→reg (0)
Inc reg (1)
Store reg→x (1)
Load x→reg (0)
Inc reg (1)
Store reg→x (1)
x = 1
원하는 결과: x=2
임계 구역(Critical Section)
Lock(s)
Load x→reg
Inc reg
Store reg→x
Unlock(s)
thread0
Lock(s)
Load x→reg
Inc reg
Store reg→x
Unlock(s)
thread1
thread0 thread1
Load x→reg (0)
Inc reg (1)
Store reg→x (1)
x = 2
Lock(s)
Unlock(s)
Load x→reg (1)
Inc reg (2)
Store reg→x (2)
Lock(s)
Unlock(s)
Critical section
성능 - 어느 것이 더 빠를까?
구현 1
int idx=my_id*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
구현 2
int idx=my_id;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
구현 1
Thread 0
int idx=0*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
Thread 1
int idx=1*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
2
N=16
2
4
A
B
C
*
=
구현 2
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
2
N=16
2
4
A
B
C
*
=
성능 - 어느 것이 더 빠를까?
구현 1
int idx=my_id*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
구현 2
int idx=my_id;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
구현 1 – 더 빠르다!
Thread 0
int idx=0*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
Thread 1
int idx=1*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
2
N=16
2
4
A
B
C
*
=
빠른 이유?
• 캐시(Cache)
• 캐시의 특성
• 시간적 지역성 (Temporal locality)
• 한 번 접근 한 곳에 또 접근함
• 공간적 지역성 (Spatial locality)
• 이전에 접근한 곳 근처를 접근함
• 캐시 접근의 단위
• 캐시 블록(라인)
• 64 Byte
구현 1
Thread 0
int idx=0*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
Thread 1
int idx=1*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
2
N=16
2
4
A
B
C
*
=
구현 1
Thread 0
int idx=0*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
Thread 1
int idx=1*N/2;
for(i=0; i<N/2; ++i) {
C[idx] = A[idx] * B[idx];
idx++;
}
Thread 0’s cache Thread 1’s cache
구현 2
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
2
N=16
2
4
A
B
C
*
=
구현 2 (더 많은 공간 차지)
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 0’s cache Thread 1’s cache
구현 2 (ping-ponging)
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 0’s cache Thread 1’s cache
구현 2 (ping-ponging)
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 0’s cache Thread 1’s cache
구현 2 (ping-ponging)
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 0’s cache Thread 1’s cache
구현 2 (ping-ponging)
Thread 0
int idx=0;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 1
int idx=1;
for(i=0; i<N/2; i++) {
C[idx] = A[idx] * B[idx];
idx+=2;
}
Thread 0’s cache Thread 1’s cache
요약
• 멀티 코어의 출현으로 인한 병렬 컴퓨팅의 대두
• 전력 장벽
• GPU를 이용한 병렬 컴퓨팅
• CUDA/OpenCL
• 병렬 컴퓨팅의 한계
• 따라서, 프로그래머의 역할이 중요해짐
• 동일한 하드웨어에서 소프트웨어의 구현에 따라 성능이 크게 변화함
질문?
1 sur 44

Recommandé

병렬프로그래밍과 Cuda par
병렬프로그래밍과 Cuda병렬프로그래밍과 Cuda
병렬프로그래밍과 CudaSeok-joon Yun
9.3K vues27 diapositives
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기 par
헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기헤테로지니어스 컴퓨팅 :  CPU 에서 GPU 로 옮겨가기
헤테로지니어스 컴퓨팅 : CPU 에서 GPU 로 옮겨가기zupet
22.2K vues47 diapositives
Cuda intro par
Cuda introCuda intro
Cuda intro주영 송
1.9K vues54 diapositives
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스 par
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스
이기종 멀티코어 프로세서를 위한 프로그래밍 언어 및 영상처리 오픈소스Seunghwa Song
5.8K vues49 diapositives
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인 par
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인Seunghwa Song
3.4K vues50 diapositives
이권일 Sse 를 이용한 최적화와 실제 사용 예 par
이권일 Sse 를 이용한 최적화와 실제 사용 예이권일 Sse 를 이용한 최적화와 실제 사용 예
이권일 Sse 를 이용한 최적화와 실제 사용 예zupet
6.3K vues42 diapositives

Contenu connexe

Tendances

Introduction to Parallel Programming par
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel ProgrammingUNIST
2.1K vues152 diapositives
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요? par
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요? 내훈 정
8.1K vues104 diapositives
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기 par
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Ki-Hwan Kim
7.6K vues59 diapositives
ffmpeg optimization using CUDA par
ffmpeg optimization using CUDAffmpeg optimization using CUDA
ffmpeg optimization using CUDAyyooooon
2.4K vues53 diapositives
윤석준 2015 cuda_contest par
윤석준 2015 cuda_contest윤석준 2015 cuda_contest
윤석준 2015 cuda_contestSeok-joon Yun
567 vues12 diapositives
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지) par
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
28.9K vues62 diapositives

Tendances(20)

Introduction to Parallel Programming par UNIST
Introduction to Parallel ProgrammingIntroduction to Parallel Programming
Introduction to Parallel Programming
UNIST2.1K vues
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요? par 내훈 정
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
내훈 정8.1K vues
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기 par Ki-Hwan Kim
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Python의 계산성능 향상을 위해 Fortran, C, CUDA-C, OpenCL-C 코드들과 연동하기
Ki-Hwan Kim7.6K vues
ffmpeg optimization using CUDA par yyooooon
ffmpeg optimization using CUDAffmpeg optimization using CUDA
ffmpeg optimization using CUDA
yyooooon2.4K vues
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지) par 내훈 정
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
내훈 정28.9K vues
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요 par NAVER D2
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
NAVER D27K vues
박기헌 NDC12 초보 클라이언트 프로그래머의 병렬 프로그래밍 도전기 par Kiheon Park
박기헌 NDC12 초보 클라이언트 프로그래머의 병렬 프로그래밍 도전기박기헌 NDC12 초보 클라이언트 프로그래머의 병렬 프로그래밍 도전기
박기헌 NDC12 초보 클라이언트 프로그래머의 병렬 프로그래밍 도전기
Kiheon Park5.7K vues
게임프로젝트에 적용하는 GPGPU par YEONG-CHEON YOU
게임프로젝트에 적용하는 GPGPU게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU
YEONG-CHEON YOU5.4K vues
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현 par NAVER D2
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
NAVER D26.3K vues
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리 par YEONG-CHEON YOU
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
YEONG-CHEON YOU5.7K vues
Multithread & shared_ptr par 내훈 정
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
내훈 정4.4K vues
병렬 프로그래밍 par 준혁 이
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
준혁 이2K vues
242 naver-2 par NAVER D2
242 naver-2242 naver-2
242 naver-2
NAVER D26.9K vues
[조진현] [Kgc2011]direct x11 이야기 par 진현 조
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
진현 조3.2K vues
[조진현]Kgc2012 c++amp par 진현 조
[조진현]Kgc2012 c++amp[조진현]Kgc2012 c++amp
[조진현]Kgc2012 c++amp
진현 조1.4K vues
Azure로 MMO게임 서비스하기 par YEONG-CHEON YOU
Azure로 MMO게임 서비스하기Azure로 MMO게임 서비스하기
Azure로 MMO게임 서비스하기
YEONG-CHEON YOU1.5K vues

En vedette

프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장 par
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장SukYun Yoon
10.7K vues49 diapositives
OpenCV 에서 OpenCL 살짝 써보기 par
OpenCV 에서 OpenCL 살짝 써보기OpenCV 에서 OpenCL 살짝 써보기
OpenCV 에서 OpenCL 살짝 써보기Seunghwa Song
20.2K vues39 diapositives
Neural stream par
Neural streamNeural stream
Neural streamMk Kim
1.8K vues38 diapositives
[Kerference] 시작! 리버싱 - 김종범(KERT) par
[Kerference] 시작! 리버싱 - 김종범(KERT)[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)NAVER D2
3.4K vues18 diapositives
[Kerference] Nefarious SQL - 김동호(KERT) par
[Kerference] Nefarious SQL - 김동호(KERT)[Kerference] Nefarious SQL - 김동호(KERT)
[Kerference] Nefarious SQL - 김동호(KERT)NAVER D2
3.1K vues164 diapositives
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB) par
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)NAVER D2
4.5K vues61 diapositives

En vedette(10)

프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장 par SukYun Yoon
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장
SukYun Yoon10.7K vues
OpenCV 에서 OpenCL 살짝 써보기 par Seunghwa Song
OpenCV 에서 OpenCL 살짝 써보기OpenCV 에서 OpenCL 살짝 써보기
OpenCV 에서 OpenCL 살짝 써보기
Seunghwa Song20.2K vues
Neural stream par Mk Kim
Neural streamNeural stream
Neural stream
Mk Kim1.8K vues
[Kerference] 시작! 리버싱 - 김종범(KERT) par NAVER D2
[Kerference] 시작! 리버싱 - 김종범(KERT)[Kerference] 시작! 리버싱 - 김종범(KERT)
[Kerference] 시작! 리버싱 - 김종범(KERT)
NAVER D23.4K vues
[Kerference] Nefarious SQL - 김동호(KERT) par NAVER D2
[Kerference] Nefarious SQL - 김동호(KERT)[Kerference] Nefarious SQL - 김동호(KERT)
[Kerference] Nefarious SQL - 김동호(KERT)
NAVER D23.1K vues
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB) par NAVER D2
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
[Kerference] 쉽고 빠르게 시작하는 Volatility plugin 개발 - 김동현(BoB)
NAVER D24.5K vues
경희대 해커 기술 세미나 - Xamarin을 이용한 크로스 플랫폼 앱 개발(이현규) par NAVER D2
경희대 해커 기술 세미나 - Xamarin을 이용한 크로스 플랫폼 앱 개발(이현규)경희대 해커 기술 세미나 - Xamarin을 이용한 크로스 플랫폼 앱 개발(이현규)
경희대 해커 기술 세미나 - Xamarin을 이용한 크로스 플랫폼 앱 개발(이현규)
NAVER D24.6K vues
병렬 프로그래밍 패러다임 par codenavy
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
codenavy4.8K vues
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수) par NAVER D2
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
경희대 해커 기술 세미나 - Git hub으로 학교 팀프로젝트 하기(조성수)
NAVER D23.4K vues
[Kerference] DEFCON CTF 풀어보기 - 박상석(KERT) par NAVER D2
[Kerference]  DEFCON CTF 풀어보기 - 박상석(KERT)[Kerference]  DEFCON CTF 풀어보기 - 박상석(KERT)
[Kerference] DEFCON CTF 풀어보기 - 박상석(KERT)
NAVER D24.9K vues

Similaire à 2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)

CUDA를 게임 프로젝트에 적용하기 par
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기YEONG-CHEON YOU
2.8K vues61 diapositives
서버와 클라이언트 같은 엔진 사용하기 par
서버와 클라이언트 같은 엔진 사용하기서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기YEONG-CHEON YOU
1.3K vues28 diapositives
Quick & Dirty Tips for x64 hooks par
Quick & Dirty Tips for x64 hooksQuick & Dirty Tips for x64 hooks
Quick & Dirty Tips for x64 hooks용환 노
1.3K vues22 diapositives
Vectorized processing in_a_nutshell_DeView2014 par
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Gruter
2K vues43 diapositives
[KGC2014] DX9에서DX11로의이행경험공유 par
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
6.6K vues93 diapositives
Processor par
ProcessorProcessor
Processor박 경민
230 vues29 diapositives

Similaire à 2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)(20)

CUDA를 게임 프로젝트에 적용하기 par YEONG-CHEON YOU
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기
YEONG-CHEON YOU2.8K vues
서버와 클라이언트 같은 엔진 사용하기 par YEONG-CHEON YOU
서버와 클라이언트 같은 엔진 사용하기서버와 클라이언트 같은 엔진 사용하기
서버와 클라이언트 같은 엔진 사용하기
YEONG-CHEON YOU1.3K vues
Quick & Dirty Tips for x64 hooks par 용환 노
Quick & Dirty Tips for x64 hooksQuick & Dirty Tips for x64 hooks
Quick & Dirty Tips for x64 hooks
용환 노1.3K vues
Vectorized processing in_a_nutshell_DeView2014 par Gruter
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
Gruter2K vues
[KGC2014] DX9에서DX11로의이행경험공유 par Hwan Min
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
Hwan Min6.6K vues
Tips and experience of DX12 Engine development . par YEONG-CHEON YOU
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
YEONG-CHEON YOU2.6K vues
[박민근] 3 d렌더링 옵티마이징_nv_perfhud par MinGeun Park
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
MinGeun Park1.8K vues
Jnetpcap quickguide par Sukjin Yun
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguide
Sukjin Yun1.6K vues
[2B2]기계 친화성을 중심으로 접근한 최적화 기법 par NAVER D2
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
NAVER D22.8K vues
CUDA 프로그래밍 기초 MODUCON2018 par Shengzhe Li
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
Shengzhe Li2K vues
Introduction to DirectX 12 Programming , Ver 1.5 par YEONG-CHEON YOU
Introduction to DirectX 12 Programming , Ver 1.5Introduction to DirectX 12 Programming , Ver 1.5
Introduction to DirectX 12 Programming , Ver 1.5
YEONG-CHEON YOU840 vues
진화하는 컴퓨터 하드웨어와 게임 개발 기술의 발전 par Sukwoo Lee
진화하는 컴퓨터 하드웨어와 게임 개발 기술의 발전진화하는 컴퓨터 하드웨어와 게임 개발 기술의 발전
진화하는 컴퓨터 하드웨어와 게임 개발 기술의 발전
Sukwoo Lee899 vues
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018 par devCAT Studio, NEXON
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기 par Jaeseung Ha
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
Jaeseung Ha3.4K vues
[KGC 2013] Online Game Security in China par Seungmin Shin
[KGC 2013] Online Game Security in China[KGC 2013] Online Game Security in China
[KGC 2013] Online Game Security in China
Seungmin Shin1.6K vues
NDC12_Lockless게임서버설계와구현 par noerror
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
noerror7.7K vues
Boost 라이브리와 C++11 par OnGameServer
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
OnGameServer56.7K vues

2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)

  • 1. 병렬 컴퓨팅 소개 김정현 서울대학교 컴퓨터공학부 멀티코어 컴퓨팅 연구실 2015.05.23
  • 2. 발표자 소개 - 김정현 • 해커 16기 • 2007년 경희대 졸업(02학번) • 2009년 서울대 석사 • 2015년 현재 서울대 컴퓨터공학부 박사과정 • 관심분야 • 컴퓨터 구조, 병렬 컴퓨팅, 컴파일러
  • 3. 목차 • 전통적인 프로세서의 성능 향상 기법 • 멀티 코어의 출현 • 병렬 컴퓨팅이란? • 병렬 프로그래밍 모델 • GPGPU • CUDA/OpenCL • 병렬 컴퓨팅의 한계 • 병렬 프로그래밍 시 유의사항 • 요약
  • 4. 전통적인 프로세서의 속도 향상 기법 • 프로세서의 주파수를 높임 • 주파수 • 프로세서가 한 명령어를 수행하는데 필요한 주기 • 1GHz 프로세서: 1개의 명령을 1나노초에 처리 • 소프트웨어의 수정 없이 성능이 향상됨 • 1GHz 프로세서를 2GHz 프로세서로 업그레이드하면? • 대략 2배의 성능향상
  • 5. Intel Processor Clock Speed(MHz) http://people.cs.clemson.edu/~mark/330links.html 주파수가 더 이상 증가하지 않음
  • 6. 멀티 코어의 출현 • 주파수 증가가 멈춘 이유? • 하드웨어의 한계 • 주파수를 올리면 그에 따라 발열이 올라감 • CPU fan만으로는 제어 불가능한 발열량 발생 • 하지만 CPU 집적도는 계속하여 향상됨 • 동일한 면적에 더 많은 트랜지스터를 넣을 수 있음 • 이 공간을 어떻게 활용하지? • 멀티 코어!
  • 7. 멀티 코어란? • 프로세서 • CPU 칩을 의미 • 코어 • CPU 칩 안에서 계산을 담당하는 주체 • 멀티 코어? • 여러 개의 코어가 하나의 프로세서에 집적됨
  • 9. 병렬 컴퓨팅이란? • Parallel Computing • 동시에 다수의 계산을 수행하는 방법 • 예제 • 1부터 100까지의 합을 여러 개의 코어가 나누어 계산 • 1~50까지 코어 0이 계산 • 51~100까지 코어 1이 계산
  • 10. 왜 병렬 컴퓨팅이 필요한가? • 다수의 코어를 가진 현대 컴퓨터 • 데스크톱 프로세서 • 모바일 프로세서 • 다수의 코어를 효과적으로 이용하는 방법? • 다수의 프로그램을 동시에 실행 • 하나의 큰 프로그램을 여러 개로 분할하여 동시에 실행
  • 11. 다수의 프로그램을 동시에 실행 • 웹 브라우저는 코어 0에서 실행 • 엑셀 프로그램은 코어 1에서 실행 • 파워포인트 프로그램은 코어 2에서 실행 • 단점? • 위의 프로그램들은 모두 사용자의 입력을 기다리는 프로그램 • 일반적으로 사용자는 한 시점에 하나의 프로그램만을 이용 • 세 프로그램이 하나의 프로세서에서 실행되어도 유저는 감지하지 못함
  • 12. 하나의 큰 프로그램을 분할 • 많은 계산을 요구하는 프로그램? • 게임 • 원소가 10만 개인 두 배열의 곱셈 • 어떻게 분할하나? • 게임 • 네트워킹 담당 부분 • 물리 엔진 계산 부분 • UI 렌더링 • 곱셈 • 10만개를 각 코어별로 나누어 계산 Task parallelism (태스크 병렬화) Data parallelism (데이터 병렬화)
  • 13. 병렬 프로그래밍 모델? • CPU를 위한 병렬 프로그래밍 모델 • pthreads • OpenMP • MPI • Intel Threading Building Blocks • GPU를 위한 병렬 프로그래밍 모델 • CUDA • OpenCL
  • 14. GPGPU • General-purpose computing on graphics processing units • GPU의 목적 • 모니터에 각 픽셀들의 색을 결정 • 이를 위해 다수의 코어가 존재함 • NVIDIA GTX960의 경우 1024개의 CUDA 코어가 있음 • 이렇게 많은 코어를 계산용으로 활용할 순 없을까? • GPGPU의 탄생 • 초기의 프로그래밍 모델: OpenGL이나 DirectX를 이용 • 계산 전용 프로그래밍 모델의 등장 • CUDA/OpenCL
  • 15. CUDA • Compute Unified Device Architecture • NVIDIA에서 제안/관리 • NVIDIA GPU에서만 동작함 • https://developer.nvidia.com/cuda-zone
  • 16. OpenCL • Open Computing Language • Khronos Group에서 제안/관리 • 공개된 무료 표준 • CPU, GPU, FPGA등 다양한 계산이 가능한 프로세서에서 동작 가능 • 하드웨어 벤더가 OpenCL SDK를 제공해야 함 • https://www.khronos.org/opencl/
  • 17. 병렬 컴퓨팅의 한계 • 프로그래머에 따라 프로그램의 실행 속도가 크게 다를 수 있음 • 더 좋은 프로세서로 업그레이드 • 소프트웨어의 성능 향상은 기대하기 힘듦 • 주파수는 정체, 코어의 수가 증가 • 어떻게 병렬화를 할 것인가?
  • 18. 병렬화 방법 • 태스크 병렬화(Task parallelism) • 게임의 각 부분을 각 코어가 담당하도록 구현 • 데이터 병렬화(Data parallelism) • 전체 데이터를 N등분 하여 각 코어에게 할당
  • 19. 암달의 법칙(Amdahl‘s law) • 멀티 코어를 이용한 프로그램의 성능 향상은 순차적으로 진행 하는 부분에 의해 결정됨 병렬화 영역 (Parallel portion)
  • 20. 암달의 법칙(Amdahl‘s law) 병렬화의 성능은 병렬화되지 않은 영역에 의해 제한된다! http://en.wikipedia.org/wiki/Amdahl's_law
  • 22. 병렬 프로그래밍 시 유의 사항 • 정확성 • 실행 순서의 정의 • 임계 구역(Critical Section) • 성능 • 접근 순서에 따른 성능
  • 23. 실행 순서의 정의 a=3; b=a; thread0 thread1 thread0 a=3 thread1 b=a b=a
  • 24. 실행 순서의 정의 a=3; b=a; thread0 thread1 thread0 thread1 a=3; b=a;
  • 25. 실행 순서의 정의 a=3; flag=1; while(flag==0); b=a; thread0 thread1 thread0 thread1 a=3; b=a; flag=1; while(flag==0);
  • 26. 임계 구역(Critical Section) C code x++; Instruction Load x→reg Inc reg Store reg→x
  • 27. thread0 thread1 임계 구역(Critical Section) Load x→reg Inc reg Store reg→x thread0 Load x→reg Inc reg Store reg→x thread1 Load x→reg (0) Inc reg (1) Store reg→x (1) Load x→reg (0) Inc reg (1) Store reg→x (1) x = 1 원하는 결과: x=2
  • 28. 임계 구역(Critical Section) Lock(s) Load x→reg Inc reg Store reg→x Unlock(s) thread0 Lock(s) Load x→reg Inc reg Store reg→x Unlock(s) thread1 thread0 thread1 Load x→reg (0) Inc reg (1) Store reg→x (1) x = 2 Lock(s) Unlock(s) Load x→reg (1) Inc reg (2) Store reg→x (2) Lock(s) Unlock(s) Critical section
  • 29. 성능 - 어느 것이 더 빠를까? 구현 1 int idx=my_id*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } 구현 2 int idx=my_id; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; }
  • 30. 구현 1 Thread 0 int idx=0*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } Thread 1 int idx=1*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } 2 N=16 2 4 A B C * =
  • 31. 구현 2 Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } 2 N=16 2 4 A B C * =
  • 32. 성능 - 어느 것이 더 빠를까? 구현 1 int idx=my_id*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } 구현 2 int idx=my_id; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; }
  • 33. 구현 1 – 더 빠르다! Thread 0 int idx=0*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } Thread 1 int idx=1*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } 2 N=16 2 4 A B C * =
  • 34. 빠른 이유? • 캐시(Cache) • 캐시의 특성 • 시간적 지역성 (Temporal locality) • 한 번 접근 한 곳에 또 접근함 • 공간적 지역성 (Spatial locality) • 이전에 접근한 곳 근처를 접근함 • 캐시 접근의 단위 • 캐시 블록(라인) • 64 Byte
  • 35. 구현 1 Thread 0 int idx=0*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } Thread 1 int idx=1*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } 2 N=16 2 4 A B C * =
  • 36. 구현 1 Thread 0 int idx=0*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } Thread 1 int idx=1*N/2; for(i=0; i<N/2; ++i) { C[idx] = A[idx] * B[idx]; idx++; } Thread 0’s cache Thread 1’s cache
  • 37. 구현 2 Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } 2 N=16 2 4 A B C * =
  • 38. 구현 2 (더 많은 공간 차지) Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 0’s cache Thread 1’s cache
  • 39. 구현 2 (ping-ponging) Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 0’s cache Thread 1’s cache
  • 40. 구현 2 (ping-ponging) Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 0’s cache Thread 1’s cache
  • 41. 구현 2 (ping-ponging) Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 0’s cache Thread 1’s cache
  • 42. 구현 2 (ping-ponging) Thread 0 int idx=0; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 1 int idx=1; for(i=0; i<N/2; i++) { C[idx] = A[idx] * B[idx]; idx+=2; } Thread 0’s cache Thread 1’s cache
  • 43. 요약 • 멀티 코어의 출현으로 인한 병렬 컴퓨팅의 대두 • 전력 장벽 • GPU를 이용한 병렬 컴퓨팅 • CUDA/OpenCL • 병렬 컴퓨팅의 한계 • 따라서, 프로그래머의 역할이 중요해짐 • 동일한 하드웨어에서 소프트웨어의 구현에 따라 성능이 크게 변화함