기존에 사용하던 여타 노트북과 달리 CMOS등에서 하이퍼스레딩을 직접 제어하지는 못 하는 것 같았다. 계산목적으로 컴퓨터를 활용하다보니 늘 당연하다는 생각으로 하이퍼스레딩을 끄고 사용했었으나, 설정을 찾을 수 없어서 하이퍼스레딩이 어느정도 퍼포먼스를 내 주는지가 궁금했던 것이 이번 실험의 이유였는데, 여기서 몇 가지 유의미한 내용을 알 수 있었다.
현재 본인의 맥북은 2013 late macbook pro 15 기본형으로서 i7 쿼드코어를 가지고 있고, HT(Hyper-Threading)로 인하여 8개의 프로세서로 컴퓨터는 인지하고 있다. OS는 OSX Mavericks를 사용하고 있고, 여기서 HT를 enable/disable시키는 것은 Xcode설치이후 사용가능한 Instrument app에서이다.
테스트는 intel c++ compiler (icpc)와 MKL을 이용한 CBLAS를 활용하였고, 예시는 MKL의 쓰레드 테스트에 있는 소스코드를 사용하였다. 쓰레드를 1개에서 8개까지 (물리적은 코어는 4개이지만, HT로 인하여 8개의 프로세서가 있다고 맥은 인지하고 있음) 올려가며 1000번계산하여 평균 계산시간을 뽑아보았는데, 결과는 다음과 같다.
1 thread : 22.39 ms
2 threads: 11.05 ms
3 threads: 08.14 ms
4 threads: 08.24 ms
5 threads: 08.54 ms
6 threads: 08.23 ms
7 threads: 08.39 ms
8 threads: 08.68 ms
이때 iStat Menu에서 CPU 점유율 기준으로 1쓰레드에서 3쓰레드까지는 각기 100%, 200%, 그리고 300%로 올라갔고 4 쓰레드에서 8쓰레드까지는 모두 400%점유율을 가지고 있었다. 이 점을 바탕으로 생각해 볼때, HT가 있는 코어에서도 최적화된 코드 (MKL은 intel에서 제공한다)의 경우 적절하게 각 프로세서의 점유율을 조절하여 물리적인 코어 갯수와 같은양의 쓰레드 점유율을 보이면서 계산함을 알 수 있다. 여기에서 본인은 코어 모두에서 최대한도의 속도로 계산을 하게 되는 경우, 물리적인 코어 갯수 이상의 쓰레드를 열 필요는 없다고 결론을 내렸다.
하지만 threads가 3인 경우와 4인 경우에는 유의미한 속도차이가 없는데, 이는 아마도 다른 시스템 앱이 백그라운드상태에서 프로세서를 점유해서 나타나는 현상이라 생각하는데, 본인의 경우는 맥을 비교적 간단한 (하루미만) 계산용 혹은 계산용 컴퓨터에 접속하는 단말기 용도로 사용하고 있으므로 대부분의 경우 수많은 앱들이 백그라운드에서 작용하고 있을 것이다. 즉, 본인의 작업환경에서 HT를 사용하고 있는 경우에는 3개의 쓰레드 혹은 4개의 쓰레드간의 계산속도 차이가 그리 크지 않을 것이다.
HT를 disable시킨 다음의 결과는 다음과 같다.
1 thread : 22.22 ms
2 threads: 10.73 ms
3 threads: 07.44 ms
4 threads: 06.13 ms
5 threads: 06.28 ms
6 threads: 06.41 ms
7 threads: 06.22 ms
8 threads: 06.40 ms
두 결과를 비교하기 위하여 계산시간을 간단하게 플롯하였다. 일단 single thread의 경우 23ms 보다 약간 짧은 시간이 보여지기 때문에 scale factor를 23ms로 나누어서 두가지 계산시간 모두 플롯하고 동시에, 계산시간의 비율 역시 플롯해 보았다. 결과는 다음과 같다. 함께 첨부한 스크립트 파일은 해당 플롯에 사용한 파이썬 스크립트이다.
Single threaded computation의 경우에는 HT에 따른 의존성이 없었다. 다만 2쓰레드일때 약 3%정도의 차이, 3쓰레드일때 약 5%의 차이, 그리고 4 쓰레드 일때는 약 40%의 계산속도 차이를 보여주었다. 여기서 한 번 더 체크할 사항은, 현재 계산은 BLAS의 dgemm을 함수를 활용하여 2000*200 매트릭스와 200*1000매트릭스의 곱을 하는 계산을 지정해준 횟수(여기서는 1000번)동안 계산할 때 걸리는 평균 시간을 보여준 것이고, 이때 각 프로세서는 100%로 구동되면서 중간중간 병목현상등이 발생되지 않았음을 직접 지켜보면서 확인하였다. 다시말해, 병렬화가 매우 잘 된 계산을 체크한 것이고, 이 경우에는 hyperthreading을 disable하는 것이 물리적인 코어 갯수만큼의 쓰레드를 열었을때 상당한 계산속도의 향상을 보여 줌을 알 수 있다. 그리고 실제 계산에는 병목현상이나 병렬화 수준에 따른 의존성이 크게 되므로 이렇게 이상적인 상황에서의 결과와는 전혀다른 결과를 보여 줄 수 있다고 생각한다.
일단은 대부분의 목적에서는 HT를 켜 두고, 가끔 인텐시브한 계산을 할 때만 꺼 두는 것을 추천함. 만약, 인텐시브한 계산의 규모가 커진다면 (하루단위를 넘어갈 때) 그냥 클러스터 계정 열어서 계산할 생각임.
현재 글은 여기서 마무리 짓고, HT에 따른 효과를 보기 위해서 앞으로 몇 가지 체크할 사항을 정리해 보았다.
(1) 컴파일 혹은 계산 시점에서 HT를 제어할 수 있는지
(2) iStat Menus등과 같은 시스템 모니터링 프로그램에서 HT로 분할된 프로세서 한 개당 퍼포먼스를
Leave a Reply