hyperthreading은 보통 SMT라고 불리는 기술의 하나입니다. 실제 물리코어 하나
를 4개 개씩으로 불릴수 있는 기술이죠.. 실제 구현은 꽤나 쉬운 편입니다.. 하
드웨어 자원이 비교적 크게들지 않고도 여러 코어로 보이게할수 있는 기법이..
알파에서 처음 구현되었다가 인텔로 넘어가는 바람에 인텔에서도 구현되었다고
합니다. 비슷한 종류로 하드웨어 MT(multithreading)기법이 있습니다.
암튼 이런 기법은 cpu안에 놀고있는 자원들을 최대한 활용하자는 아이디어인데요,
인텔에서 hyperthreading이라는 이름으로 SMT를 구현했습니다. 근데 물리코어당
2개의 논리코어만을 만들었죠.. 그 이상 넘어가면 아마 단점들이 마구 드러나지
않을까싶습니다.
자세한 얘기를 하자면 끝이 없으니 이만 줄이고, 좀더 썰을 풀어보자면..
코어가 마치 2개로 보이니 성능이 2배가 될리는...없죠 물론..
물리코어가 2개가 되어도 성능이 2배가 되지도 않는 마당에 말이죠..
물리코어가 설사 2개 라고해도 메모리가 공유되기때문에 서로 성능을 저해할수
있습니다.
물론 메모리대역폭이 충분하게 만드니까 그런일이 그다지 없을뿐이죠..
어떤 워크로드에 대해서는 그런일이 벌어질수도 있습니다..
이러한 현상은 일반적인 현상입니다.. 아랫부분에서는 어디선가 자원들이 경쟁적
으로 공유되고 있기때문이죠..
결론적으로는, hyperthreading은 실제로는 물리코어하나뿐이라서, cpu내의
다른 자원들은 전부 공유됩니다. 대표적으로 캐시가 공유되기 때문에
오히려 서로가 상대방의 캐시라인을 지워버리는 바람에 성능이 서로 떨어질수 있
습니다..
그리고 그것도 크게..떨어질수 있기때문에 고성능을 원한다면 차라리 끄는것이
좋겠습니다. 캐시를 많이 사용하는 프로세스 두개가 하나의 물리코어에 스케쥴되
면..재앙이라고 보시면 되겠습니다.. 성능이 몇배씩 떨어지기도 합니다.
이렇게 cache contention문제에 대한 논문도 많이 나와있습니다..
물론 best case로 캐시를 거의 사용하지 않으면서 오래도는 프로그램이라면
hyperthread가 두배 가까운 성능을 보여주겠지만, 이런건 좀 드물죠..
그래서 스케쥴링이 중요한데, 이렇게 서로간의 영향을 줄여주기 위해서 잘~~ 스
케쥴링해야하겠습니다..만.. 이런거 다 연구과정이고 딱 부러지는 방법은 현재
안보이는 실정입니다.. 그리고 아무리 잘 스케쥴링한다고 해도 애초에 물리코어
가 두개인것이 훨씬 낫겠죠..
그리고 전력소비문제가 껴들면 문제가 더 복잡해지죠.. 전력을 얼마나 더 먹는지는
모르겠지만 만약 2배의 성능/throughput이 나왔는데 전력도 2배 가까이 더 먹는
다면 과연 그게 '효율적'인 것인지도 좀 의문이긴 합니다..
말이 자꾸 두서없어지는데, 결론은, workload의 특성에 따라 다르다는..얘기가
되겠습니다. 클라우드환경이라면, 저라면 예를 들어 hyperthread를 켜놓은 경우
에는 가격을 싸게 받고 아닌 경우에는 좀더 비싸게 받거나 해서 팔수는 있을것
같습니다.
아무래도 hyperthread끈 경우가 더 좋은 코어라고 볼수 있겠죠.
그래서, 클라우드같은 환경이라면 더더욱 hyperthread를 켠다고해서 전체 효율이
높아진다고 볼수는 없을것 같습니다...
뭐 그러한 등등의 이유로 개인적으로 hyperthread 꺼놓고 잘 안씁니다만..
서버나 클라우드환경에서 특정한 워크로드만 돌린다면 hyperthread가 이득이 되
는 경우도 있을수 있겠죠... 그러나 과연??
> --
> Google 그룹스 'osinside' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 웹에서 이 토론을 보려면
https://groups.google.com/d/msg/osinside/-
> /iZTpohfmUYcJ을(를) 방문하세요.
> 이 그룹에 게시하려면
osin...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면
osinside+u...@googlegroups.com로 이메일을 보내주
> 세요.
> 더 많은 옵션을 보려면
http://groups.google.com/group/osinside?hl=ko에서 그
> 룹을 방문하세요.