프로그램 CPU부하가 적절히 분산되지않아 뭐가 문제인가 찾아보다가, 윈도우 10에서는 64프로세서 이상 구성시 그룹으로 다시 나눈다는 사실을 알게되었습니다. 프로세서할당을 따로 할수있는 고급 프로그램이 아니면 아무리 멀티코어/멀티쓰레드를 지원하는 프로그램이라고 한들 자기가 속한 그룹의 논리프로세서만 로드할수있게됩니다. 그럼 다른 그룹에 논리프로세서는 시간과 자원의 낭비가 됩니다.
제가 알아본 한도내에서는 프로그램 개발당시부터 그룹에 대응하는 코딩을 한게 아니라면 사용자쪽에서는 이런부분에 대응하기 어렵다고 판단했고 다만 이 문제의 대안으로 시도할수있는 방법이 윈도우 11로 옮겨가는것이였습니다.
윈도우 11에서는 이런 엄격한 그룹구성이 풀렸다는 글을 읽게되었거든요. Microsoft Learn에 써진내용을 그대로 기재하자면 W11부터는 "여러 그룹에 걸쳐 시스템의 모든 프로세서에 걸쳐 있는 프로세서 친화성이 있습니다."
따라서 윈도우 11로 올라 타게되었습니다. 때마침 23H2도 공식데뷔해서 23H2로 설치했습니다.
테스트 조건과 간략한 소개는 이렇습니다.
사양은 동일한 SPR 48C 2S 384GB 구성으로써 코어 갯수 조절은 SST-PP 프로필설정을 바꿔서 합니다. 그외엔 전부 동일하며 윈도우 버전만 다릅니다.
프로그램에 인식되는 CPU 스레드 수가 계산과 다르게 나타나는것은 Windows에서 그룹화한 프로세서 갯수를 표기하기때문입니다. 윈도우 10뿐만 아니라 윈도우 11에서도 CPU 그룹화를 합니다. 그룹화의 기준은 64 논리프로세서를 초과할경우이며 이 기준을 초과하면 절반으로 나눕니다. 아래는 예시입니다.
24물리코어(HT48논리프로세서) * 2S = 84 논리프로세서 인데 이경우 1그룹당 48프로세서 두그룹으로 인식됩니다.
48물리코어(HT96논리프로세서) * 2S = 192 논리프로세서 인데 이경우 1그룹당 48프로세서 네그룹으로 인식됩니다.
1그룹의 기준은 64프로세서인데 192 논리프로세서를 1그룹당 48프로세서로 네그룹으로 나눈걸 보면 무조건 짝수로만 나누게 된게 아닐까싶습니다. 그게 아니였다면 1그룹당 64프로세서로 세그룹을 만들었겠죠.
이 비교의 목적은 앞서 말했듯 W10은 개념상 프로그램이 한 그룹에만 들어가서 작동하기때문에 나머지 논리프로세서를 방치하게되어 리소스가 낭비되는 반면, W11은 프로그램이 필요하다면 이집 저집을 돌아다니면서 작동하기때문에 W10과는 다른 결과를 보여주는것을 보는것입니다.
결과값은 7zip 벤치마크로 비교하기로합니다.
프로그램 좌측상단에 보이는 [ CPU 스레드 수: 분자/분모 ] 조건에서 분자가 분모의 두배까지 허용되긴하는데 W11에서는 알아서 부하분산이 일어나나 W10에서는 단일 그룹에 중첩된상태로만 돌아서 동일하게 벤치마킹했습니다. W11에서의 다중스레드 벤치마크는 가장 뒤에 게시했습니다.
분모값은 한개 그룹의 논리프로세서 구성입니다.
또 W10에서는 vNUMA가 켜져있었지만 W11에서는 vNUMA는 꺼진상태입니다. W11에서는 vNUMA 커널패닉이 발생해서 끌수밖에없었습니다. NUMA는 작동중입니다.
보기좋게 정리한 이미지입니다. 24C, 32C 구성에서는 성능이 25%정도 좋아졌습니다.
반대로 가장 좋아야할것같은 48C는 오히려 떨어졌는데 vNUMA의 영향이거나 그룹구성이 다르게된것일수도있을것같습니다.
하지만 48C 구성이야말로 확실히 제가 해보고자 하는것에 가장 큰 결과를 보여줄수가있습니다.
글 초반에 제가 CPU 스레드 수 비율을 2배로 올릴수있다고 적은적이있었지요? 96/48 같이.
근데 그렇게 하지않은 이유는 W10의 경우엔 한그룹안에서 중첩되서 돌아서 안한다고했었습니다. 아래같은 사진이 되거든요.
바로 이런식으로 돌아갑니다. 이게 W10에서 7zip 벤치마킹이나 시네벤치 2024를 돌리면 벌어지는 현상인데요. 계속 얘기하는것처럼 한개그룹에서만 돌아갑니다. 1그룹당 48논리프로세서로 두그룹이있는데 한그룹은 계속 노는거죠.
지금 벤치마크의 기준으로 하고있는 프로그램 7zip 에서는 디폴트값이 48/48입니다. 근데 96/48 해도 뒤에 남아있는 48개의 논리 프로세서를 합쳐서 논리 프로세서 96개를 다 쓰는게아니라 그냥 한그룹안의 씨피유에서 쓰레드가 두개씩 돌아갑니다. 더 느려지겠죠.
하지만 W11은 "프로세서 친화성"이 있다고 했습니다. 그런이유로 같은작업을 W11에서 적용하면 아래와 같은 점유율과 효율을 보여줍니다.
이건 48C 2S 96논리프로세서에 1그룹은 48논리프로세서일때 48/48을 시도했을때. 거의 절반에 맞춰서 돌아갑니다.
그리고 이건 W10에서는 안돼던 48C 2S 96논리프로세서에 1그룹은 48논리프로세서일때 96/48을 시도했을때.
모든 자원을 끌어다가 씁니다. 분명 W10에서는 안됐었는데.
그럼 1그룹의 논리프로세서의 갯수로 정하는 CPU 스레드 수 비율이 2배를 초과하면 어떻게될까요?
96C HT를 키면 192C가 나옵니다. 이걸 윈도우식 계산으로하면 1그룹은 48논리프로세서로 4그룹. W10에서는 이조건으로 벤치마크 스크린샷을 찍어놓은게 없어서 검증이 불가능합니다만 제 기억으로 W10에서는 분명히 안되던 작업입니다.
-mmt96도 제대로 안돌아갔고 -mmt192도 안돌아갔습니다.
하지만 W11은 "여러 그룹에 걸쳐 시스템의 모든 프로세서에 걸쳐 있는 프로세서 친화성이 있습니다." 그렇기때문에 뭘 어떻게 갖다 박아도 잘 돌아가는 모습을 보여주네요. 1그룹 48논리프로세서의 네배인 192스레드를 열면 사이좋게 나눠가져갑니다.
이제서야 제 성능을 내주는것같아서 대 만족합니다.
한가지 웃기는점은 리눅스에서 30GIPS 나오던게 W11에서는 37GIPS 측정되네요. 원래 반대아닌가 ㅡㅡ;;
이 문제를 검색하면서 알게된것은 이 문제가 예전부터 검색되던 문제라는점입니다. 최첨단미세한 컴퓨터를 맞췄는데 렌더링하면 프레임도 안나오고 버벅거리는데 CPU는 50%만 사용되요 라는식으로.. 그럼 거기에 답변은 W11로 넘어가면 해결이 됩니다라고..
다중프로세서는 W11이 답이다..
끝.