SlideShare a Scribd company logo
1 of 49
프로그래머가몰랐던멀티코어CPU 이야기 Story 13, 14장 2011. 06. 11 아꿈사스터디( http://andstudy.com ) 윤석윤( seedyoon@gmail.com )
Story 13If 문은 그냥 실행되는 것이 아니다. Story 14가상 함수에 담긴 복잡함
Story 13If 문은 그냥 실행되는 것이 아니다. Story 14가상 함수에 담긴 복잡함
분기문 명령어와 프로그래밍 언어 분기문(branch) 분기문은 프로그램의 실행 흐름, PC(program counter) 값이 바뀔 수 있는 명령어를 가리킨다. 분기 여부를 따지는 방식 조건분기(conditional branch) 무조건 분기(unconditional branch) 분기 목적지를 얻는 방식 직접 분기문(direct branch) 간접 분기문(indirect branch)
분기문 명령어와 프로그래밍 언어 분기문(branch) 조건 분기 특정 연산 결과가 어떤 조건 만족 시 분기(For, while, do, until) 무조건 분기 항상 해당 목적지로 분기(goto, jump)
분기문 명령어와 프로그래밍 언어 분기문(branch) 직접 분기문 분기 목적지를 바로 얻을 수 있는 경우 간접 분기문 메모리를 한번 참조해서 목적지를 얻음(콜백, 프로시저 리턴, 가상함수 호출, C# 델리게이트)
분기 예측이 필요한 이유 컨트롤 의존성 분기문은 컨트롤 의존성을 만듬 파이프라인 프로세서에서 컨트롤 해저드가 되어 파이프라인의 효율 저하 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS If a== 0 goto 5 stall stall Stall a = a + 1 stall stall Stall b = a + 2
분기 예측이 필요한 이유 컨트롤 의존성 분기문은 컨트롤 의존성을 만듬 파이프라인 프로세서에서 컨트롤 해저드가 되어 파이프라인의 효율 저하 분기문이exe 단계에서 밝혀진다면 파이프라인 스톨이 발생 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS If a== 0 goto 5 stall stall stall a = a + 1 stall stall stall b = a + 2
분기 예측이 필요한 이유 컨트롤 의존성 MIPS 프로세서는 분기문 해결을 최대한 앞 단계에서 해결하여 파이파인 스톨 횟수를 줄임 컴파일러가 분기문의 결과와 상관없이 실행되는 명령어를 배치할 수도 있음( 지연슬롯) 간접 분기문 역시 컨트롤 해저드를 유발 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS Jump[100] stall stall a = 10 stall stall b = a + 10
분기 예측이 필요한 이유 컨트롤 의존성 MIPS 프로세서는 분기문 해결을 최대한 앞 단계에서 해결하여 파이파인 스톨 횟수를 줄임 컴파일러가 분기문의 결과와 상관없이 실행되는 명령어를 배치할 수도 있음( 지연슬롯) 간접 분기문 역시 컨트롤 해저드를 유발 100번지에 저장된 값, 20으로 분기하므로 이 값을 읽으려면 기다려야 한다. IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS Jump[100] stall stall a = 10 stall stall b = a + 10
분기 예측이 필요한 이유 분기 예측(branch prediction) 무조건 분기문은 계산이 필요하지 않고, 직접 분기문은 메모리 참조가 필요 없이 바로 명령어만 해독하면 분기 지점을 알 수 있다. 하지만 CISC 구조처럼 복잡한 명령어에서는 이 작업도 바로 이루어 지기 어려워 파이프라인 스톨 발생 분기문이 파이프라인의 첫 단계에서 그 결과가 알려 진다면 파이프라인 스톨 없이 파이프라인은 작동 할 수 있다.
분기 예측이 필요한 이유 분기 예측(branch prediction) 그러나 파이프라인을 해결하는 방법은 일반적인 정수 연산에 버금간다. 분기예측을 이용해 분기문의 결과가 나오지 않았음에도 분기문의 결과를 예측해 파이프라인을 진행시킨다.
분기 예측이 필요한 이유 분기 예측(branch prediction) 분기 방향 예측(taken)주어진 조건 분기문이 분기하느냐(taken) 아니면분기하지 않느냐(not taken)를 예측 ( 0 or 1) If a== 0 goto 5 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS a = a +1 b = a +2 분기 결과 예측
분기 예측이 필요한 이유 분기 예측(branch prediction) 분기목적지 예측(target)분기문이 어디로 분기할지 목적지(target)를예측. 가능한 모든 분기 목적지 중 하나를 고르는 것이므로 훨씬 더 많은 대상 가운데 예측해야 하는 어려움이 있다 Jump[100] IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS a = 10 b = a +10 분기 목적지 예측
분기 예측이 필요한 이유 분기 예측(branch prediction) 프로세서가 순차든 비순차든 상관 없음 파이프라인 프로세서이고 컨트롤 해저드로 파이프라인 스톨이 발생하는 경우라면 분기 예측은 항상 필요하다 분기 예측은 미래에 벌어질 일을 예측하는 것이므로 100% 완벽하다는 것은 있을 수 없다. 분기문이 틀릴 경우를 대비해야 한다.
분기 예측에 기반한 투기적 실행 투기적 실행(speculative execution) 불확실한예측을 기반으로 더 나은 성능을 가져오는 방향으로 명령어를 처리하는 일반적인 개념 분기문의 예측 값이 실제와 같다면 명령어 완료 사이클을 단축 예측 값과 다르다면 처리한 명령어를 삭제 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS If a== 0 goto 5 a = a +1 b = a +2 c = b +3 a = a +10
분기 예측에 기반한 투기적 실행 투기적 실행(speculative execution) 예측에 기반해 확실하지 않은 일을 미리 수행해서 그 결과가 맞기를 기대 1 미래를 예측하는 장치 2 결과가 확실하지 않아도 실행을 계속 진행시킬 수있는 장치(ROB) 투기적 실행에 필요한 장치 3예측이 틀렸을때 원상태로 복구하는 장치(UNDO)
미래를 예측하는 장치 정적 분기 예측 정해진 규칙에 따라서만 움직임 실시간으로 프로그램의 내역을 분석하는 능동적인대처는 없다. 과거 프로세서에서 장치를 많이 넣을 수 없었던시절에 사용한 방법 모든 분기문을 분기하게 한다(always taken) 모든 분기문을 분기하지 않게 한다(always not taken) 뒤로 가는 분기문은 분기하게, 앞으로 가는 분기문은 분기하지 않게 한다.(BTFNT) 프로그램의 프로파일 정보를 활용한다
미래를 예측하는 장치 동적 분기 예측 실제 프로그램의 실행 내역으로 미래에 일어날 분기를 예측 캐시의 원리와 흡사( locality), 과거정보를 활용해서 아직 일어나지 않은 미래를 예측 예제- 과거 분기 예측기단순 과거 비교만을 수행하므로 어쩌다 한번일어나는 분기 결과 값으로 빗나간 예측을 하게 됨    - 2비트를 활용한 분기 예측기단순히 분기 여부만을 기억하는 것이 아니라  강도까지 기억(약간의 저항을 적용)
미래를 예측하는 장치 더 똑똑한 과거 기반의 예측 웹 브라우저의 다운로드 폴더의 예- 파일 종류와 함께 폴더 이름을 기억- 더 많은 과거 정보, 어떤 사건들 사이의 관계를  이용하여 예측 성능 향상- 특정 분기문의 과거 결과만으로 미래를 예측하는 것보다 정보를 기억하여 예측 성능을 높임
미래를 예측하는 장치 히스토리를 이용한 분기 예측 한 분기문의 결과를 예측하는데 다른 분기문의결과를 함께 고려해 예측하는 것 모든 결과를 기억할 수는 없으므로 가장최근의N개의 분기문의 결과만 기억
미래를 예측하는 장치 초기값 0 0 0 0 0 0 0 0 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터
미래를 예측하는 장치 초기값 0 0 0 0 0 0 0 0 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터 taken
미래를 예측하는 장치 초기값 0 0 0 0 0 0 0 1   (shift) 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터 taken
미래를 예측하는 장치 초기값 0 0 0 0 0 1 01 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터 taken not taken taken
미래를 예측하는 장치 BHR 분기 예측 시, 분기문의 PC 주소와 현재 BHR 획득 2비트 카운터 PC
미래를 예측하는 장치 BHR 분기 예측 시, 분기문의 PC 주소와 현재 BHR 획득 2비트 카운터 BHR의 값에 따라 4개 중 하나의 테이블을 선택 PC
미래를 예측하는 장치 BHR 분기 예측 시, 분기문의 PC 주소와 현재 BHR 획득 2비트 카운터 BHR의 값에 따라 4개 중 하나의 테이블을 선택 PC 2비트 분기 예측기와 동일하게 작동
미래를 예측하는 장치 BHR BHR을 이용하고 그 뒤에 PC를 이용하므로 Two-level branch predictor라고 부른다 2비트 카운터 PC
미래를 예측하는 장치 분기문의 결과 기록을 전역으로 하지 않고 각 분기문에 국한해서 선택 로컬 BHR테이블 2비트 카운터 PC
미래를 예측하는 장치 분기문의 결과 기록을 전역으로 하지 않고 각 분기문에 국한해서 선택 로컬 BHR테이블 2비트 카운터 테이블의 크기는 한정적이므로 모든 PC마다 만들 수는 없고 겹쳐지는 일이 발생 PC
미래를 예측하는 장치 분기문의 결과 기록을 전역으로 하지 않고 각 분기문에 국한해서 선택 로컬 BHR테이블 2비트 카운터 테이블의 크기는 한정적이므로 모든 PC마다 만들 수는 없고 겹쳐지는 일이 발생 PC 예측 시 PC에 해당하는 로컬 BHR을 찾아 분기 예측 테이블을 선택, PC를 이용해 엔트리를 찾고 2비트 카운터 값을 예측
미래를 예측하는 장치 로컬 BHR테이블 비효율적….. 어떤 BHR과 PC 조합 값은 잘 나타나지 않을수도 있으므로 많은 테이블이 놀게 된다. 2비트 카운터 PC
미래를 예측하는 장치 PC와 BHR을 합쳐서… PC 2비트 카운터 XOR BHR
미래를 예측하는 장치 PC와 BHR을 합쳐서… PC 2비트 카운터 XOR gShare분기 예측기 BHR
미래를 예측하는 장치 프리디케이션(predication) 컨트롤 의존성을 데이터 의존성으로 바꾸는 방법으로 분기문을 변환 컴파일러는 최대한 분기 흐름이 없는 곧은 상태의 코드에서 최적화를 더 많이 수행 할 수 있다. If (rand() %2)    a = 10;else    a = 20; predicate = (rand %2); a = 10 (predicate);  // predicate가 true일 때만 실행 a = 20 (predicate);// predicate가 false일 때만 실행
미래를 예측하는 장치 프리디케이션(predication) 프리디케이션 레지스터가 필요하고 명령어가 프리디케이션 레지스터를 쓸 수 있게 확장해야 한다. 하드웨어를 대폭적으로 수정해야 하므로 특별한 명령어 구조를 제외하고 제한적으로 지원된다. X86은 CMOV라는 명령어로 프리디케이션을 지원하나 그 성능이 프로세서 세대마다 구조마다 차이가 있어 조심스럽게 사용해야 한다. 분기 예측이 어려운 비교적 짧은 분기문에 적합하나 실제로 실행되지 않는 명령도 함께 수행되므로 파이프라인 자원과 전력이 낭비된다.
미래를 예측하는 장치 결론 분기예측은 아직 실행되지 않은 분기문의 결과, 분기 방향과 분기 목적지를 미리 예측해 쉬지 않고 파이프라인에 명령어를 넣을 수 있게 한다. 예측이 맞으면 프로세서의 성능은 크게 향상된다. 분기 예측은 실패할 수 있기에 적절한 장치를 두어 복구하도록 한다. 이러한 기법을 투기적 실행이라고 한다.
미래를 예측하는 장치 결론 분기 예측기가 부정확 하면 적은 명령어 밖에 인출하지 못하게 된다. 이것은 ILP(명령어 수준의 병렬성)와 연관성이 있어 성능의 저하를 일으킴 한 사이클당 최대로 인출할 수 있는 명령어 수가 결국 IPC(사이클 당 완료 명령어 수)의 상한값 이기에 분기 예측기의 성능은 더 높은 IPC를 얻기 위한 기본 조건이다.
Story 13If 문은 그냥 실행되는 것이 아니다. Story 14가상 함수에 담긴 복잡함
분기 목적지 예측 직접 분기문( direct branch ) 분기목적지가 명령어에 인코딩 되어 있음 명령어만 해독하면 목적지를 알아 낼 수 있다. x86 같은 CISC 명령은 명령어 인출 2~3 사이클이 지나야 해독이 가능. 경우의 수가 최대 두 가지 밖에 없음
분기 목적지 예측 간접분기문( indirect branch ) 분기 목적지가 레지스터 또는 메모리에 있어 한번 더 참조해야 한다. 분기문의 분기 목적지를 얻는 것은 레지스터 파일이나 메모리 접근이 필요하기에 직접 분기문 보다 더 오랜 시간이 걸린다. 파이프라인 단계 중 EXE를 지나야 알 수 있다. 가능한 경우의 수가 훨씬 많기 때문에 어렵다.
간접 분기문의 분기 목적지 예측 RAS( Return Address Stack ) 어떤 함수가 불리고 할 일이 끝났으면 함수를 부른 곳으로 다시 돌아가야 한다. 이때 돌아가는 주소는 프로그램이 직접 수행 될 때 알 수 있다. 일반적으로 돌아갈 주소는 레지스터에 들어 있어 함수 리턴 역시 간접 분기문으로 구현된다. 0x200 1. 함수 호출시 리턴 주소를 push 0x100 2. 함수리턴시pop하고 이 값으로 분기 목적지를 예측
간접 분기문의 분기 목적지 예측 콜백 함수와 가상 함수 Object* p = new Computer;p->NoVirtual();00BA15D9movecx,dword ptr [p]00BA15DCcallObject::NoVirtual (0BA1028h)p->TurnOn(10);00BA15E1 push 0Ah ; 함수 인자 1000BA15E3 mov eax,dword ptr [p] ; eax = p00BA15E6 mov edx,dword ptr [eax] ; edx = *p00BA15E8 mov ecx,dword ptr [p] ; this = p00BA15EB mov eax,dword ptr [edx+8] ; eax = *(*p + 8)00BA15EE call eax
간접 분기문의 분기 목적지 예측 콜백 함수와 가상 함수 일반 함수의 호출은 직접 분기문으로 구현된다. 가상 함수는 컴파일할 때 함수 목적지를 알 수 없다.- 다이나믹디스패쳐라고 부르며 의미와 작동 방식은   C++ 언어가 규정하지만 컴파일러가 이것을 어떻게 구현할지는 컴파일러마다 다르다.- 일반적으로 Virtual table이라는 테이블을 참조하여 프로그램이 실행될 때 포인터가 실제로 기리키는곳을 읽어 해당 타입에 맞는 구현을 호출할 수 있다.- 가상 함수라 할지라도 표현만 다를 뿐이지 실제 구현은 콜백 함수와 같은 간접 분기문으로이루어진다.
간접 분기문의 분기 목적지 예측 점프 테이블 switch-case 구문에서 case구문의 개수가 적다면 if-else로 구현 case 구문의 개수가 많다면 비교 횟수를 최악의 경의 case 구문수 만큼 늘리게 된다. 컴파일러는 특정 조건이 만족할 때 switch-case를 점프 테이블이라는 것으로 대체한다. 일종의 해시 테이블로 switch 값에 대해 분기할 곳의 주소를 미리 테이블로 만들어 두어서 비교 없이 바로 목적지로 간다.
간접 분기문의 분기 목적지 예측 iBTB(간접 분기문을 위해 특화된 BTB) 콜백 함수, 가상 함수, switch-case는 함수 리턴과는 상당히 다른 어려움을 가지고 있다 분기할 대상이 여러 개가 될 수 있기에 단순히 과거 값만 기억하는 BTB로는 좋은 성능을 낼 수 없다. 히스토리(이전 다른 분기문의 결과)를활용하면 예측률이 더 높아진다. 잘 돌아가는 이유는 분기문 사이에 서로 관련이 많기 때문이다.
간접 분기문의 분기 목적지 예측 결론 기본적인 BTB는 직접 분기문에서는 잘 작동하지만 간접 분기문에서는 그렇지 않다. 간접 분기문은 종류에 따라 각기 특화된 알고리즘으로 예측률을 높인다. 함수 리턴에 의한 간접 분기문은RAS로, 가상함수, 콜백 함수, 스위치 문은 히스토리를 이용한 iBTB를 이용한다.
프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장

More Related Content

What's hot

Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonSeungmo Koo
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
PINTOS Operating system homework 2
PINTOS Operating system homework 2PINTOS Operating system homework 2
PINTOS Operating system homework 2Gichan Lee
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술YEONG-CHEON YOU
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree AlgorithmMerry Merry
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPSeungmo Koo
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)Seungmo Koo
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기YEONG-CHEON YOU
 
파이썬 리액티브하게 짜기 - PyCon Korea 2017
파이썬 리액티브하게 짜기 - PyCon Korea 2017파이썬 리액티브하게 짜기 - PyCon Korea 2017
파이썬 리액티브하게 짜기 - PyCon Korea 2017Kenneth Ceyer
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델Seungmo Koo
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법YEONG-CHEON YOU
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기ChangKyu Song
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015devCAT Studio, NEXON
 
Horizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case StudyHorizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case StudyGuerrilla
 
[모두의연구소] 쫄지말자딥러닝
[모두의연구소] 쫄지말자딥러닝[모두의연구소] 쫄지말자딥러닝
[모두의연구소] 쫄지말자딥러닝Modulabs
 
김동건, 게임 디렉터가 되려면, 2008.07.04
김동건, 게임 디렉터가 되려면, 2008.07.04김동건, 게임 디렉터가 되려면, 2008.07.04
김동건, 게임 디렉터가 되려면, 2008.07.04devCAT Studio, NEXON
 

What's hot (20)

Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
PINTOS Operating system homework 2
PINTOS Operating system homework 2PINTOS Operating system homework 2
PINTOS Operating system homework 2
 
빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술빠른 렌더링을 위한 오브젝트 제외 기술
빠른 렌더링을 위한 오브젝트 제외 기술
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
사설 서버를 막는 방법들 (프리섭, 더이상은 Naver)
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기CUDA를 게임 프로젝트에 적용하기
CUDA를 게임 프로젝트에 적용하기
 
파이썬 리액티브하게 짜기 - PyCon Korea 2017
파이썬 리액티브하게 짜기 - PyCon Korea 2017파이썬 리액티브하게 짜기 - PyCon Korea 2017
파이썬 리액티브하게 짜기 - PyCon Korea 2017
 
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
게임서버프로그래밍 #0 - TCP 및 이벤트 통지모델
 
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
프레임레이트 향상을 위한 공간분할 및 오브젝트 컬링 기법
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
이승재, 마비노기 듀얼: 분산 데이터베이스 트랜잭션 설계와 구현, NDC2015
 
Horizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case StudyHorizon Zero Dawn: An Open World QA Case Study
Horizon Zero Dawn: An Open World QA Case Study
 
[모두의연구소] 쫄지말자딥러닝
[모두의연구소] 쫄지말자딥러닝[모두의연구소] 쫄지말자딥러닝
[모두의연구소] 쫄지말자딥러닝
 
김동건, 게임 디렉터가 되려면, 2008.07.04
김동건, 게임 디렉터가 되려면, 2008.07.04김동건, 게임 디렉터가 되려면, 2008.07.04
김동건, 게임 디렉터가 되려면, 2008.07.04
 

Viewers also liked

[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표sung ki choi
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장JangHyuk You
 
[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장sung ki choi
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?내훈 정
 
병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda병렬프로그래밍과 Cuda
병렬프로그래밍과 CudaSeok-joon Yun
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크MinGeun Park
 
Pitfalls of Object Oriented Programming by SONY
Pitfalls of Object Oriented Programming by SONYPitfalls of Object Oriented Programming by SONY
Pitfalls of Object Oriented Programming by SONYAnaya Medias Swiss
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요? 내훈 정
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)khuhacker
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5JinWoo Lee
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7JinWoo Lee
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/StudioDevgear
 
팩토리 메소드 패턴과 추상 팩토리 패턴
팩토리 메소드 패턴과 추상 팩토리 패턴팩토리 메소드 패턴과 추상 팩토리 패턴
팩토리 메소드 패턴과 추상 팩토리 패턴GeniusYG
 
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가Devgear
 

Viewers also liked (20)

[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표[아꿈사/110514] 멀티코어cpu이야기 시작발표
[아꿈사/110514] 멀티코어cpu이야기 시작발표
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
 
[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장[아꿈사/110528] 멀티코어cpu이야기 5,6장
[아꿈사/110528] 멀티코어cpu이야기 5,6장
 
TBB 소개
TBB 소개TBB 소개
TBB 소개
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda병렬프로그래밍과 Cuda
병렬프로그래밍과 Cuda
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크[C++ lab] 10. 메모리 누수 체크
[C++ lab] 10. 메모리 누수 체크
 
Pitfalls of Object Oriented Programming by SONY
Pitfalls of Object Oriented Programming by SONYPitfalls of Object Oriented Programming by SONY
Pitfalls of Object Oriented Programming by SONY
 
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요? (2013 DEVIEW) 멀티쓰레드 프로그래밍이  왜이리 힘드나요?
(2013 DEVIEW) 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
Source Code Scanners
Source Code ScannersSource Code Scanners
Source Code Scanners
 
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
2015 제2회 동아리 해커 세미나 - 병렬컴퓨팅 소개 (16기 김정현)
 
Concurrency in action - chapter 5
Concurrency in action - chapter 5Concurrency in action - chapter 5
Concurrency in action - chapter 5
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
Concurrency in action - chapter 7
Concurrency in action - chapter 7Concurrency in action - chapter 7
Concurrency in action - chapter 7
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio20150305 스마트한 데이터모델링 with ER/Studio
20150305 스마트한 데이터모델링 with ER/Studio
 
팩토리 메소드 패턴과 추상 팩토리 패턴
팩토리 메소드 패턴과 추상 팩토리 패턴팩토리 메소드 패턴과 추상 팩토리 패턴
팩토리 메소드 패턴과 추상 팩토리 패턴
 
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
XML, NoSQL, 빅데이터, 클라우드로 옮겨가는 시장 상황 속, 데이터모델링 여전히 중요한가
 

Similar to 프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장

[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규ChangKyu Song
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나병걸 윤
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니Lusain Kim
 
Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_ozlael ozlael
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Sung-jae Park
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅NAVER D2
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2Wooseok Seo
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhudMinGeun Park
 
리액트 18 공유.pptx
리액트 18 공유.pptx리액트 18 공유.pptx
리액트 18 공유.pptxcksal4785911
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Bansook Nam
 
C Language I
C Language IC Language I
C Language ISuho Kwon
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법NAVER D2
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow InternalsKiho Hong
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
코딩클럽 왕초보 아두이노따라잡기 1탄
코딩클럽 왕초보 아두이노따라잡기 1탄코딩클럽 왕초보 아두이노따라잡기 1탄
코딩클럽 왕초보 아두이노따라잡기 1탄Eunhee Ha
 

Similar to 프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장 (20)

[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
 
llvm 소개
llvm 소개llvm 소개
llvm 소개
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
리액트 18 공유.pptx
리액트 18 공유.pptx리액트 18 공유.pptx
리액트 18 공유.pptx
 
Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지Android와 Flutter 앱 개발의 큰 차이점 5가지
Android와 Flutter 앱 개발의 큰 차이점 5가지
 
C Language I
C Language IC Language I
C Language I
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
 
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법[2B2]기계 친화성을 중심으로 접근한 최적화 기법
[2B2]기계 친화성을 중심으로 접근한 최적화 기법
 
TenforFlow Internals
TenforFlow InternalsTenforFlow Internals
TenforFlow Internals
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
코딩클럽 왕초보 아두이노따라잡기 1탄
코딩클럽 왕초보 아두이노따라잡기 1탄코딩클럽 왕초보 아두이노따라잡기 1탄
코딩클럽 왕초보 아두이노따라잡기 1탄
 

프로그래머가 몰랐던 멀티코어 CPU 이야기 13, 14장

  • 1. 프로그래머가몰랐던멀티코어CPU 이야기 Story 13, 14장 2011. 06. 11 아꿈사스터디( http://andstudy.com ) 윤석윤( seedyoon@gmail.com )
  • 2. Story 13If 문은 그냥 실행되는 것이 아니다. Story 14가상 함수에 담긴 복잡함
  • 3. Story 13If 문은 그냥 실행되는 것이 아니다. Story 14가상 함수에 담긴 복잡함
  • 4. 분기문 명령어와 프로그래밍 언어 분기문(branch) 분기문은 프로그램의 실행 흐름, PC(program counter) 값이 바뀔 수 있는 명령어를 가리킨다. 분기 여부를 따지는 방식 조건분기(conditional branch) 무조건 분기(unconditional branch) 분기 목적지를 얻는 방식 직접 분기문(direct branch) 간접 분기문(indirect branch)
  • 5. 분기문 명령어와 프로그래밍 언어 분기문(branch) 조건 분기 특정 연산 결과가 어떤 조건 만족 시 분기(For, while, do, until) 무조건 분기 항상 해당 목적지로 분기(goto, jump)
  • 6. 분기문 명령어와 프로그래밍 언어 분기문(branch) 직접 분기문 분기 목적지를 바로 얻을 수 있는 경우 간접 분기문 메모리를 한번 참조해서 목적지를 얻음(콜백, 프로시저 리턴, 가상함수 호출, C# 델리게이트)
  • 7. 분기 예측이 필요한 이유 컨트롤 의존성 분기문은 컨트롤 의존성을 만듬 파이프라인 프로세서에서 컨트롤 해저드가 되어 파이프라인의 효율 저하 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS If a== 0 goto 5 stall stall Stall a = a + 1 stall stall Stall b = a + 2
  • 8. 분기 예측이 필요한 이유 컨트롤 의존성 분기문은 컨트롤 의존성을 만듬 파이프라인 프로세서에서 컨트롤 해저드가 되어 파이프라인의 효율 저하 분기문이exe 단계에서 밝혀진다면 파이프라인 스톨이 발생 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS If a== 0 goto 5 stall stall stall a = a + 1 stall stall stall b = a + 2
  • 9. 분기 예측이 필요한 이유 컨트롤 의존성 MIPS 프로세서는 분기문 해결을 최대한 앞 단계에서 해결하여 파이파인 스톨 횟수를 줄임 컴파일러가 분기문의 결과와 상관없이 실행되는 명령어를 배치할 수도 있음( 지연슬롯) 간접 분기문 역시 컨트롤 해저드를 유발 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS Jump[100] stall stall a = 10 stall stall b = a + 10
  • 10. 분기 예측이 필요한 이유 컨트롤 의존성 MIPS 프로세서는 분기문 해결을 최대한 앞 단계에서 해결하여 파이파인 스톨 횟수를 줄임 컴파일러가 분기문의 결과와 상관없이 실행되는 명령어를 배치할 수도 있음( 지연슬롯) 간접 분기문 역시 컨트롤 해저드를 유발 100번지에 저장된 값, 20으로 분기하므로 이 값을 읽으려면 기다려야 한다. IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS Jump[100] stall stall a = 10 stall stall b = a + 10
  • 11. 분기 예측이 필요한 이유 분기 예측(branch prediction) 무조건 분기문은 계산이 필요하지 않고, 직접 분기문은 메모리 참조가 필요 없이 바로 명령어만 해독하면 분기 지점을 알 수 있다. 하지만 CISC 구조처럼 복잡한 명령어에서는 이 작업도 바로 이루어 지기 어려워 파이프라인 스톨 발생 분기문이 파이프라인의 첫 단계에서 그 결과가 알려 진다면 파이프라인 스톨 없이 파이프라인은 작동 할 수 있다.
  • 12. 분기 예측이 필요한 이유 분기 예측(branch prediction) 그러나 파이프라인을 해결하는 방법은 일반적인 정수 연산에 버금간다. 분기예측을 이용해 분기문의 결과가 나오지 않았음에도 분기문의 결과를 예측해 파이프라인을 진행시킨다.
  • 13. 분기 예측이 필요한 이유 분기 예측(branch prediction) 분기 방향 예측(taken)주어진 조건 분기문이 분기하느냐(taken) 아니면분기하지 않느냐(not taken)를 예측 ( 0 or 1) If a== 0 goto 5 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS a = a +1 b = a +2 분기 결과 예측
  • 14. 분기 예측이 필요한 이유 분기 예측(branch prediction) 분기목적지 예측(target)분기문이 어디로 분기할지 목적지(target)를예측. 가능한 모든 분기 목적지 중 하나를 고르는 것이므로 훨씬 더 많은 대상 가운데 예측해야 하는 어려움이 있다 Jump[100] IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS a = 10 b = a +10 분기 목적지 예측
  • 15. 분기 예측이 필요한 이유 분기 예측(branch prediction) 프로세서가 순차든 비순차든 상관 없음 파이프라인 프로세서이고 컨트롤 해저드로 파이프라인 스톨이 발생하는 경우라면 분기 예측은 항상 필요하다 분기 예측은 미래에 벌어질 일을 예측하는 것이므로 100% 완벽하다는 것은 있을 수 없다. 분기문이 틀릴 경우를 대비해야 한다.
  • 16. 분기 예측에 기반한 투기적 실행 투기적 실행(speculative execution) 불확실한예측을 기반으로 더 나은 성능을 가져오는 방향으로 명령어를 처리하는 일반적인 개념 분기문의 예측 값이 실제와 같다면 명령어 완료 사이클을 단축 예측 값과 다르다면 처리한 명령어를 삭제 IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS IF ID OF EXE OS If a== 0 goto 5 a = a +1 b = a +2 c = b +3 a = a +10
  • 17. 분기 예측에 기반한 투기적 실행 투기적 실행(speculative execution) 예측에 기반해 확실하지 않은 일을 미리 수행해서 그 결과가 맞기를 기대 1 미래를 예측하는 장치 2 결과가 확실하지 않아도 실행을 계속 진행시킬 수있는 장치(ROB) 투기적 실행에 필요한 장치 3예측이 틀렸을때 원상태로 복구하는 장치(UNDO)
  • 18. 미래를 예측하는 장치 정적 분기 예측 정해진 규칙에 따라서만 움직임 실시간으로 프로그램의 내역을 분석하는 능동적인대처는 없다. 과거 프로세서에서 장치를 많이 넣을 수 없었던시절에 사용한 방법 모든 분기문을 분기하게 한다(always taken) 모든 분기문을 분기하지 않게 한다(always not taken) 뒤로 가는 분기문은 분기하게, 앞으로 가는 분기문은 분기하지 않게 한다.(BTFNT) 프로그램의 프로파일 정보를 활용한다
  • 19. 미래를 예측하는 장치 동적 분기 예측 실제 프로그램의 실행 내역으로 미래에 일어날 분기를 예측 캐시의 원리와 흡사( locality), 과거정보를 활용해서 아직 일어나지 않은 미래를 예측 예제- 과거 분기 예측기단순 과거 비교만을 수행하므로 어쩌다 한번일어나는 분기 결과 값으로 빗나간 예측을 하게 됨 - 2비트를 활용한 분기 예측기단순히 분기 여부만을 기억하는 것이 아니라 강도까지 기억(약간의 저항을 적용)
  • 20. 미래를 예측하는 장치 더 똑똑한 과거 기반의 예측 웹 브라우저의 다운로드 폴더의 예- 파일 종류와 함께 폴더 이름을 기억- 더 많은 과거 정보, 어떤 사건들 사이의 관계를 이용하여 예측 성능 향상- 특정 분기문의 과거 결과만으로 미래를 예측하는 것보다 정보를 기억하여 예측 성능을 높임
  • 21. 미래를 예측하는 장치 히스토리를 이용한 분기 예측 한 분기문의 결과를 예측하는데 다른 분기문의결과를 함께 고려해 예측하는 것 모든 결과를 기억할 수는 없으므로 가장최근의N개의 분기문의 결과만 기억
  • 22. 미래를 예측하는 장치 초기값 0 0 0 0 0 0 0 0 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터
  • 23. 미래를 예측하는 장치 초기값 0 0 0 0 0 0 0 0 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터 taken
  • 24. 미래를 예측하는 장치 초기값 0 0 0 0 0 0 0 1 (shift) 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터 taken
  • 25. 미래를 예측하는 장치 초기값 0 0 0 0 0 1 01 관찰한 모든 분기문의결과를 비트 벡터로 표현 2비트 카운터 taken not taken taken
  • 26. 미래를 예측하는 장치 BHR 분기 예측 시, 분기문의 PC 주소와 현재 BHR 획득 2비트 카운터 PC
  • 27. 미래를 예측하는 장치 BHR 분기 예측 시, 분기문의 PC 주소와 현재 BHR 획득 2비트 카운터 BHR의 값에 따라 4개 중 하나의 테이블을 선택 PC
  • 28. 미래를 예측하는 장치 BHR 분기 예측 시, 분기문의 PC 주소와 현재 BHR 획득 2비트 카운터 BHR의 값에 따라 4개 중 하나의 테이블을 선택 PC 2비트 분기 예측기와 동일하게 작동
  • 29. 미래를 예측하는 장치 BHR BHR을 이용하고 그 뒤에 PC를 이용하므로 Two-level branch predictor라고 부른다 2비트 카운터 PC
  • 30. 미래를 예측하는 장치 분기문의 결과 기록을 전역으로 하지 않고 각 분기문에 국한해서 선택 로컬 BHR테이블 2비트 카운터 PC
  • 31. 미래를 예측하는 장치 분기문의 결과 기록을 전역으로 하지 않고 각 분기문에 국한해서 선택 로컬 BHR테이블 2비트 카운터 테이블의 크기는 한정적이므로 모든 PC마다 만들 수는 없고 겹쳐지는 일이 발생 PC
  • 32. 미래를 예측하는 장치 분기문의 결과 기록을 전역으로 하지 않고 각 분기문에 국한해서 선택 로컬 BHR테이블 2비트 카운터 테이블의 크기는 한정적이므로 모든 PC마다 만들 수는 없고 겹쳐지는 일이 발생 PC 예측 시 PC에 해당하는 로컬 BHR을 찾아 분기 예측 테이블을 선택, PC를 이용해 엔트리를 찾고 2비트 카운터 값을 예측
  • 33. 미래를 예측하는 장치 로컬 BHR테이블 비효율적….. 어떤 BHR과 PC 조합 값은 잘 나타나지 않을수도 있으므로 많은 테이블이 놀게 된다. 2비트 카운터 PC
  • 34. 미래를 예측하는 장치 PC와 BHR을 합쳐서… PC 2비트 카운터 XOR BHR
  • 35. 미래를 예측하는 장치 PC와 BHR을 합쳐서… PC 2비트 카운터 XOR gShare분기 예측기 BHR
  • 36. 미래를 예측하는 장치 프리디케이션(predication) 컨트롤 의존성을 데이터 의존성으로 바꾸는 방법으로 분기문을 변환 컴파일러는 최대한 분기 흐름이 없는 곧은 상태의 코드에서 최적화를 더 많이 수행 할 수 있다. If (rand() %2) a = 10;else a = 20; predicate = (rand %2); a = 10 (predicate); // predicate가 true일 때만 실행 a = 20 (predicate);// predicate가 false일 때만 실행
  • 37. 미래를 예측하는 장치 프리디케이션(predication) 프리디케이션 레지스터가 필요하고 명령어가 프리디케이션 레지스터를 쓸 수 있게 확장해야 한다. 하드웨어를 대폭적으로 수정해야 하므로 특별한 명령어 구조를 제외하고 제한적으로 지원된다. X86은 CMOV라는 명령어로 프리디케이션을 지원하나 그 성능이 프로세서 세대마다 구조마다 차이가 있어 조심스럽게 사용해야 한다. 분기 예측이 어려운 비교적 짧은 분기문에 적합하나 실제로 실행되지 않는 명령도 함께 수행되므로 파이프라인 자원과 전력이 낭비된다.
  • 38. 미래를 예측하는 장치 결론 분기예측은 아직 실행되지 않은 분기문의 결과, 분기 방향과 분기 목적지를 미리 예측해 쉬지 않고 파이프라인에 명령어를 넣을 수 있게 한다. 예측이 맞으면 프로세서의 성능은 크게 향상된다. 분기 예측은 실패할 수 있기에 적절한 장치를 두어 복구하도록 한다. 이러한 기법을 투기적 실행이라고 한다.
  • 39. 미래를 예측하는 장치 결론 분기 예측기가 부정확 하면 적은 명령어 밖에 인출하지 못하게 된다. 이것은 ILP(명령어 수준의 병렬성)와 연관성이 있어 성능의 저하를 일으킴 한 사이클당 최대로 인출할 수 있는 명령어 수가 결국 IPC(사이클 당 완료 명령어 수)의 상한값 이기에 분기 예측기의 성능은 더 높은 IPC를 얻기 위한 기본 조건이다.
  • 40. Story 13If 문은 그냥 실행되는 것이 아니다. Story 14가상 함수에 담긴 복잡함
  • 41. 분기 목적지 예측 직접 분기문( direct branch ) 분기목적지가 명령어에 인코딩 되어 있음 명령어만 해독하면 목적지를 알아 낼 수 있다. x86 같은 CISC 명령은 명령어 인출 2~3 사이클이 지나야 해독이 가능. 경우의 수가 최대 두 가지 밖에 없음
  • 42. 분기 목적지 예측 간접분기문( indirect branch ) 분기 목적지가 레지스터 또는 메모리에 있어 한번 더 참조해야 한다. 분기문의 분기 목적지를 얻는 것은 레지스터 파일이나 메모리 접근이 필요하기에 직접 분기문 보다 더 오랜 시간이 걸린다. 파이프라인 단계 중 EXE를 지나야 알 수 있다. 가능한 경우의 수가 훨씬 많기 때문에 어렵다.
  • 43. 간접 분기문의 분기 목적지 예측 RAS( Return Address Stack ) 어떤 함수가 불리고 할 일이 끝났으면 함수를 부른 곳으로 다시 돌아가야 한다. 이때 돌아가는 주소는 프로그램이 직접 수행 될 때 알 수 있다. 일반적으로 돌아갈 주소는 레지스터에 들어 있어 함수 리턴 역시 간접 분기문으로 구현된다. 0x200 1. 함수 호출시 리턴 주소를 push 0x100 2. 함수리턴시pop하고 이 값으로 분기 목적지를 예측
  • 44. 간접 분기문의 분기 목적지 예측 콜백 함수와 가상 함수 Object* p = new Computer;p->NoVirtual();00BA15D9movecx,dword ptr [p]00BA15DCcallObject::NoVirtual (0BA1028h)p->TurnOn(10);00BA15E1 push 0Ah ; 함수 인자 1000BA15E3 mov eax,dword ptr [p] ; eax = p00BA15E6 mov edx,dword ptr [eax] ; edx = *p00BA15E8 mov ecx,dword ptr [p] ; this = p00BA15EB mov eax,dword ptr [edx+8] ; eax = *(*p + 8)00BA15EE call eax
  • 45. 간접 분기문의 분기 목적지 예측 콜백 함수와 가상 함수 일반 함수의 호출은 직접 분기문으로 구현된다. 가상 함수는 컴파일할 때 함수 목적지를 알 수 없다.- 다이나믹디스패쳐라고 부르며 의미와 작동 방식은 C++ 언어가 규정하지만 컴파일러가 이것을 어떻게 구현할지는 컴파일러마다 다르다.- 일반적으로 Virtual table이라는 테이블을 참조하여 프로그램이 실행될 때 포인터가 실제로 기리키는곳을 읽어 해당 타입에 맞는 구현을 호출할 수 있다.- 가상 함수라 할지라도 표현만 다를 뿐이지 실제 구현은 콜백 함수와 같은 간접 분기문으로이루어진다.
  • 46. 간접 분기문의 분기 목적지 예측 점프 테이블 switch-case 구문에서 case구문의 개수가 적다면 if-else로 구현 case 구문의 개수가 많다면 비교 횟수를 최악의 경의 case 구문수 만큼 늘리게 된다. 컴파일러는 특정 조건이 만족할 때 switch-case를 점프 테이블이라는 것으로 대체한다. 일종의 해시 테이블로 switch 값에 대해 분기할 곳의 주소를 미리 테이블로 만들어 두어서 비교 없이 바로 목적지로 간다.
  • 47. 간접 분기문의 분기 목적지 예측 iBTB(간접 분기문을 위해 특화된 BTB) 콜백 함수, 가상 함수, switch-case는 함수 리턴과는 상당히 다른 어려움을 가지고 있다 분기할 대상이 여러 개가 될 수 있기에 단순히 과거 값만 기억하는 BTB로는 좋은 성능을 낼 수 없다. 히스토리(이전 다른 분기문의 결과)를활용하면 예측률이 더 높아진다. 잘 돌아가는 이유는 분기문 사이에 서로 관련이 많기 때문이다.
  • 48. 간접 분기문의 분기 목적지 예측 결론 기본적인 BTB는 직접 분기문에서는 잘 작동하지만 간접 분기문에서는 그렇지 않다. 간접 분기문은 종류에 따라 각기 특화된 알고리즘으로 예측률을 높인다. 함수 리턴에 의한 간접 분기문은RAS로, 가상함수, 콜백 함수, 스위치 문은 히스토리를 이용한 iBTB를 이용한다.