과학

인텔 CPU의 하이퍼쓰레딩에 대해서 알아보자

[컴판에서 옮겨옴]

http://www.catdrip.net/117760312


인텔의 애지간한 프로세서에는 하이퍼쓰레딩이라는게 들어가있다.


하이퍼쓰레딩은 CE에서는 보통 SMT(Simultaneous multithreading) 라고 부르는데, 하이퍼쓰레딩은 그냥 인텔의 마케팅 용어라고 보면된다!


그리고... 하이퍼쓰레딩은 사용자에게 작업관리자에 무수이 많은 쓰레드 갯수를 보면서, "하.. 코어 존나 많다." 이런 자위를 할 수 있을뿐더러, 실제로 어느정도 역할을 한다.


사실 하이퍼쓰레딩이라는건 생각보다 조금 오래된 기술이다. 자 이제 왜 생겼는지 알아보자


우선 하이퍼쓰레딩 이야기를 하기전에 CPU 아키텍쳐의 파이프라인부터 이야기 부터 해야겠다.


#1 CPU 파이프라인 이야기


아주 예전 CPU가 맨처음 만들어질때 CPU가 작동되는 순서는 아래와 같다.


명령어인출(Fetch) - 명령어해석(Decode) - 명령어실행(Execute) - 기록(Writeback)


(사실 뭐 사이클 이야기가 나와야 하는데, 계산하기 싫으니깐 모든 과정은 1사이클(1Hz)이라고 가정하자)


그러니깐 램에 올라온 프로그램의 명령어 하나를 CPU가 실행하기 위해서는 4사이클(4Hz)이 걸린다는 이야기다.


근데 F-D-E-W 저 네가지 순서를 거치는동은 현재 과정을 제외한 모든 과정은 놀고 있게 된다.


즉, Fetch 하는동안 Decode, Execute, Writeback 파이프라인은 놀고 있다. 이건 계산을 시키는 사람 입장에서는 매우 비효율적이다!


그래서 각 파이프라인이 놀지 않도록 파이프라이닝화 했다. 이때문에 CPU 작동되는 순서에 Pre-frech라는 과정이 추가된다.


Pre-fetch는 사실 Fetch와 동일한데, Fetch되기전 미리 명령을 불러오는거다.


왜 미리 불러오는가? 왜냐 하면 다른 명령을 또 파이프라인에 쑤셔넣어야 하기 때문이다.


하지만 파이프라이닝은 명령을 동시에 수행 할 수 있는 슈퍼스칼라와 다른데, 슈퍼스칼라는 FDEW 이런 파이프라인이 있을때, F 파이프라인에서도 여러개의 명령이 실행 될 수 있다. 즉, 명령이 특정 파이프라인을 점유 하고 있을때, 다른 명령은 점유 하고 있는 파이프라인 이외 것만 사용 할 수 있는 파이프라이닝과는 다르다.


➀ MOV RAX, PTR DWORD [RSP + 4]

➁ ADD RAX, RBX


자 위에 아주 단순한 프로그램 명령이 2개 있다.


파이프라이닝없이 위 프로그램이 수행된다면 아래처럼 총 8사이클이 걸릴 것이다.


F

D

E

W









F

D

E

W


하지만 파이프라이닝이 있다면, 아래처럼 총 5사이클로 줄어든다.


F 

D

E

W



F

D

E

W


엄청 줄었다! 그리고 저 과정을 더 길게 하면, 더 많은 명령을 빠른 시간안에 처리 할 수 있다!


현재 사용 하고 있는 하즈웰/스카이레이크의 경우 16개의 파이프라인이 사용되는데, 모든 파이프라인이 1사이클이라고 가정할때,


17사이클안에 2개의 명령을 수행 할 수 있다! 또한 파이프라인이 길어지면 CPU 클럭을 높일 수 있다고 한다.(이유는 모름.. 이건 컴아키/운영체제 시간에 안알려줫음.. 아.. 내가 잤나..)


하지만 장점도 있으면 단점도 있는법! 저 파이프라이닝에는 엄청난 문제점들이 있다. 많지만 먼저 데이터가 다른 명령에 의존성이 있다면 문제가된다.


그말이 무엇이냐 하면 100번지 메모리에 데이터를 기록하기 전에, 다음 명령이 100번지 메모리를 읽어가는 수가 있기때문이다.


당장 저 명령을 봐도, RAX 레지스터가 RSP + 4메모리로부터 데이터를 읽어 들이기전에, RAX 레지스터와 더하기를 수행 하고 있다.


이 때문에 파이프라이닝을 하는 CPU는 올바르게 데이터가 처리 될 수 있도록 명령어를 예측하는 회로가 있다.


파이프라이닝의 두번째 문제, 예측을 예측일뿐, 만약 예측 분기가 빗나가면 그것 저 파이프라인을 통해서 나온 데이터를 모두 취소하고, 다시 명령을 불러오고, 예측하고 파이프라이닝을 수행 해야 한다.


이것 나름대로 엄청난 CPU 사이클이 소요된다.


당장 위에만 봐도 5사이클을 수행했는데, 예측분기가 실패해서 5사이클을 다시 실행 해야 해서 총 10 + a 사이클이 수행되기 때문에, 만약 파이프라인이 더 길어진다면 더 많은 사이클을 소비한다.


하지만 정말 분기예측을 잘 할 수 있다면, 이만큼 성능을 내기 좋은것은 없다!


실예로 실패의 예로는 펜티엄4 프레스캇은 40개가 넘는 파이프라인에 비해 분기 예측 캐시가 턱없이 작아서 매번 분기 예측에 실패했다.


그리고 아시다 시피... 엄청난 발열과 분기예측 실패로 인한 저조한 성능까지 얻었다.


발열은 예측 분기 실패로 인해서 많은 파이프라이닝 회로가 작동되었다는것을 의미한다.


번외로 인텔 CPU에서는 파이프라이닝이 효과를 내기 어려운데, 왜냐 하면 인텔의 x86 CPU 명령어가 가변길이를 가지기 때문인데,


왜냐하면 메모리로부터 데이터를 읽었을때, 이 데이터가 어떤 명령을 수행 하는 지 알 수 없기 때문이다.


근데 이건 AMD가 예전에 CICS -> RISC로 명령을 내부적으로 변환하는 방법을 도입하면서, 딱히 문제 될것은 아닌듯


(그래서 인텔이 이 명령어 체계를 갈아 엎을라 그랬는데... IA64가 망하고... AMD는 AMD64라는 IA32를 64비트 확장으로만 내놓고... 이러니 64비트가 되도 성능 향상이 없다고 그러죳!!! AMD가 죄다..)


그래도 RISC보다야 효율이 떨어진다


#2 이제 하이퍼쓰레딩 이야기


무슨 하이퍼쓰레딩을 이야기 하려고 저리 긴 이야기를 설명 했느냐


바로 하이퍼쓰레딩이 인텔이 펜티엄4에서 엄청 길어진 파이프라이닝을 효율적으로 써보자고 해서 쓴 기술이니깐!


나도 듣던바로는 인텔도 2002년도 펜티엄4를 초기에 만들때 클럭을 AMD보다 엄청 높혀보자고 연산 유닛은 다 쳐내고 파이프라인을 졸라 늘렸는데,


그래도 이렇게 길어진거 리스크도 크고 해저드도 많이 생길것 같아서 하이퍼쓰레딩 넣어봐야  할것같아서 넣긴했는데, 마이크로코드 상으로만 막은거라고 들었다.


뭐 이건 잡소리니깐..


우선 쓰레드(Thread)라는것이 무엇인지 알고 가지, 쓰레드는 컴퓨터에서 가장 작은 논리적인 작업 단위를 의미해


원칙적으로는 CPU에서는 하나의 CPU가 하나의 쓰레드만 처리할 수 있지만, 하이퍼쓰레딩은 하나의 CPU가 두개 이상의 쓰레드를 처리하도록 해보자는거야


그것을 어떻게 가능하게 할까?


파이프라이닝에서 파이프라인이 무조건 작동되는건 아니라는것을 알게되었어,


그러니깐 그 놀고 있는 파이프라인을 더 갈궈보자 이소리야!


파이프라인이 제대로 사용될 수 없는경우가 있지?


데이터가 독립적이지 않는경우, 분기예측 실패났을경우 대표적인 이 두가지야

(추가로 메모리에서 데이터를 불러오는경우 메모리가 불러오기까지 파이프라프라인이 놀고 있기도 한다.)


데이터가 독립적이지 않을경우, 데이터가 독립된것이 보장됬다면 충분히 사용할 수 있지


이 쓰레드는 다른 쓰레드와 전혀 다른일을 하게 되


즉, 이말은 다른 쓰레드끼리는 명령어가 사용될 데이터가 서로 독립적이라는거야

(단, 메모리상 데이터 주소만 다르다!)


위에서 사용했던 프로그램을 다시 가져와봤어


➀ MOV RAX, PTR DWORD [RSP + 4]

➁ ADD RAX, RBX

쓰레드 A


➀ MOV RAX, PTR DWORD [RSP + 4]

➁ MOV RCX, PTR DWORD [RSP + 8]

DIV RCX


쓰레드 B


이미 쓰레드 A에서는 1번 과정이 수행되고 있는과정이라 가정하고, 쓰레드 B에서는 3번 과정이 수행 되고 있는 과정이라고 가정하자


쓰레드 A 1번 과정은 RSP + 4위치의 메모리를 4바이트 읽어들여서 RAX 레지스터에 올리는 명령이고


쓰레드 B 3번과정은 RAX 레지스터의 값과 RCX 레지스터의 값을 나누어서 RAX 레지스터에 저장하라는 명령이야


쓰레드 A, B 둘다 쓰레드내 프로그램은 데이터가 다른데이터에 의존적이지만, 각 쓰레드끼리는 데이터가 서로 영향을 미치지 않아

(IPC... IPC... IPC... 는 어디에 팔아먹은걸까..)


쓰레드 A에서 1번과정에서 메모리에서 데이터를 불러오는동안, 쓰레드 B에서 3번과정은 데이터를 계산하고 있으면 되겠지?


고로 아주 조금이라도 동시에 두가지 일을 하는것처럼 보이는거다!


근데 사실 그냥 명령어 단위의 파이프라닝과 다를바 없어보이지만, 작업 단위인 쓰레드간 데이터는 서로 데이터가 독립적이라는것을 사용한 최고의 방법이 아닐까 싶다.


#3 왜 하이퍼쓰레딩을 켜면 CPU 코어보다 2배 많은 CPU로 보일까?

답은 쓰레드끼리는 메모리상 데이터가 독립적이기 때문이다.


좀 원초적인 이야기로 가자면 CPU는 원칙적으로 하나밖에 못하기 때문에, 여러 쓰레드를 번갈아가면서 처리한다. 그것도 매우 빠르게


그래서 사람이 느끼기엔 동시에 처리되는것처럼 보이는데, 사실 이 멀티태스킹을 구현하기 위해서 20세기 중반부터 사람들이 엄청 고민을 했다.


바로 서로 다른 프로세스(또는 쓰레드)가 서로 다른 메모리 공간에 있어야 하지 않을까?


이게 왜 문제냐면 프로세스(또는 쓰레드가) 완전히 서로 다른 메모리 주소를 쓴다면 상관이 없다.


하지만 이 서로 다른 주소를 쓰게 하려면 매번 프로그램을 다시 컴파일해야한다는것이다.


마치 크롬을 켰을때, 포토샵을 켠다면 서로 주소가 충돌하니 크롬이 사용하지 않는 메모리 주소로 바꿔서 다시 컴파일해서 실행해야 한단 말이된다.


하지만 CPU 내부에 MMU(Memory Management Unit)이라는 회로가 만들어지면서 이 문제는 해결 됬다.


MMU가 움직이는 방식은 뭐 뻔하다.


각 프로세스마다 사용할 논리 메모리 주소 - 물리 메모리 주소를 테이블로 만들고, MMU는 이걸 참조해서 논리 메모리 주소를 물리 메모리 주소로 바꾸도록 CPU한테 뻥을 친다.


그러니깐 크롬의 100번지 메모리 주소나, 포토샵의 100번지 메모리 주소는 서로 다른 물리 메모리 주소를 가르킨다.

(근데 이게 무려 16비트 리얼모드에선 없었다.. 그래서 그당시 DOS 프로그램끼리 충돌 자주났던거다..)


인텔의 경우 OS가 기동될때 인텔각 코어의 MMU에 GDT(Global Desciptor Table)/IDT(Interript Descriptor Table)를 지정해주면서, CR0의 31번 비트를 1로 세트 하기 되면서 움직이게 된다.


다시 하이퍼쓰레딩으로 돌아오자.


하이퍼쓰레딩은 메모리상 데이터가 독립적인 쓰레드를 하나의 코어 파이프라인에 넣기 위한건데, 코어는 독립된 쓰레드끼리의 논리 주소를 실제 물리 주소로 바꿔야 하는 MMU가 두개 필요하게 된다.


결국 기존의 호환성은 유지하면서 성능은 향상 해야 하니 OS한테 CPU가 여러개 존재한다고 알려야 각 쓰레드의 물리 메모리 주소를 알 수 있게 되지 않을까?


이 섹션은 내가 생각한 추측이다..


그냥 여담으로는 IBM PowerPC CPU의 경우 코어당 6개의 논리 쓰레드가 보이게 된다고 한다.

와.. 씨.. 코어 2개만 있어도 12쓰레드.. 작업관리자가 꽉찬다!! 기모띠!!!

(출처- OS 공룡책)


#4 하이퍼쓰레딩은 무조건 좋을까?

답은 No.


하이퍼쓰레딩은 CPU의 많은 유닛중 놀고 있는 부분이 없게 만들자는 취지이기 때문에, 무조건 빨라지지 않는다.


예를 들면 IO-bounded한 쓰레드(메모리 입출력, USB 입출력, SATA 입출력, PCI 입출력, 네트워크 입출력)만 있거나


CPU-bounded한 쓰레드(게임과 같이 연산만 잔득 돌리는경우) 이런 경우에는 별 효과가 없다.


왜냐하면 어차피 CPU에 박혀잇는 유닛갯수는 같이 때문이지..


하지만 확실히 CPU-bounded한 쓰레드와 IO-bounded한 쓰레드가 같이 있다면, 분명 효과가 있다.


게임 방송처럼 게임을 하면서 영상 코딩, 네트워크 IO가 같이 일어날경우 어느정도 많은 CPU를 사용 할 수 있다.


또한 하이퍼쓰레딩의 단점으로는 쓰레드를 파이프라인에 잘 분배하도록 하는 회로가 있기때문에, 발열량이 증가 한다.


(또 그래서 이걸로 프레스캇이 욕 지대로 얻어먹었지..)



19개의 댓글

2017.01.15
헥헥 나이츠랜딩 288스레드 날 가져요
0
2017.01.15
으으 컴구 개극혐
0
2017.01.15
전공지식 없는사람이 이 글을 읽고 이해할수있을까
0
2017.01.15
요약해
0
2017.01.15
이게 out of order에 대한 거지???
0
2017.01.15
그래도 쉽게쓰려고 한편. ㅊㅊ
0
2017.01.15
쓰느라 고생했다 ㅊㅊ
0
2017.01.16
하이퍼 스레딩을 쓰면 왜 코어가 두 배로 보이냐면, 그 편이 OS쪽에서 쓰기 쉽기 때문이야.
설계상 한 스레드의 성능을 두 배로 늘리는게 아니고, 놀고 있는 자원을 잘 활용하려고 한거기 때문에 코어 수를 늘려서 보여주고 OS에서 스케줄링 하도록 허용해준 거지.
OS에서는 밑에서 어떻게 동작하던 상관없이 이것은 코어다 라고 인식하고 스레드들을 잘 분배해서 스케줄링 해주는 거고.
MMU는 보통의 경우 코어당 하나가 있는게 아니고, CPU 당 하나가 있을거기 때문에 지적한 문제랑은 상관 없을거야.
0
2017.01.16
@foon
내가 각 코어마다 하나씩 있다고 생각하냐면, 멀티코어 운영체제 만들때 BP(Base Processor)가 나머지 AP를 깨우고 인터럽트를 위해서 PIC를 켜는 작업하고 각 코어에 cr3레지스터에 페이징을 위한 GDT테이블 주소를 넘겨주걸랑... 그래서 각 코어마다 MMU가 있다고 생각한겨
0
2017.01.16
하나도 모르겠다~
0
2017.01.17
@크리스피롤
코어 한개가 한팀이라고보면됨
한팀에는 10명이 있다고 치면 쿼드코어일경우 4팀이 있고 총 10명이있지?
이 팀들은 한가지일을끝나야 다른일을 시작해

일을 4개를준다고하면 4팀이 1개씩 가져가서 일을 시작할꺼야 그치?

근데여기서 8개 일을 주는데 일들이 다 너무쉬운거라 10명의 팀원이 으쌰으쌰 하지않아도 될정도의 가벼운 일이 내려왔다고할때
그런데 팀들은 한가지의 일을끝나야 다음일을받고 시작하기때문에
어느정도 효율의 손실이 발생해 5명만있어도 되는일을 10명이 잡고있으니깐

거기서 효율을 위해서 한개의팀을 또 1조 5명으로해서 2개의 조로 나눠서 잡아버리는거야
그래서 4개의 팀이있고 1개의 팀마다 2개의조를 만들어
8개의 조를 형성하는거야

그렇게되면 다시금 8개의 쉬운 일감이있을때 4가지를 처리하고 다시 4가지일을 받아서 처리하는방식이아닌
8개를 동시에 시작해서 빠르게 처리할수있다는거지
0
뭔 말이야 씨불쟝
0
2017.01.17
무슨 컴퓨터활용능력1급 교재 그대로 배껴 적어왔나?
0
2017.01.17
아재요 이분들 컴퓨터의 컴자도 모르신데 에드삭부터 시작해야 하지 않것소?
0
2017.01.17
그냥 100층 짜리 건물에서 사용량은 어차피 30~50층만 쓰니까 1층과 50층을 출입문으로 만들어서 사용한다는거 아냐? 알고있던 지식인데 이거아닌가 ㅠㅠ?
0
2017.01.17
@궁금하냐고
그래서 사용량이 존나많은 프로그램응 쓸때는 하이퍼쓰레딩이 오히려 안좋다는 부분도 있다는거
0
2017.01.19
난 누군가 또 여긴 어딘가
0
2017.01.20
하이퍼스레딩이 사용자한테 ㅈㅇ? ㄷㄷ
0
2017.01.23
i7 코어딸 기분조타
0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 10 11 일 전
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23