스레드 예약 분석

게임 프로세스 스레드가 적절히 활용되고 최상의 성능을 위해 예약되었는지 확인하려면 몇 가지 사항을 고려해야 합니다.

  • 프레임 속도
  • 멀티스레딩 및 스레드 동시 로드
  • CPU 코어 어피니티

멀티스레드

많은 게임과 게임 엔진은 멀티스레딩을 사용하여 CPU 작업을 어느 정도 독립적으로 실행할 수 있는 논리 작업으로 나눕니다. 일반적인 구성 중 하나는 입력 및 게임 로직을 위한 게임 스레드, 그릴 객체를 준비하고 제출하는 렌더링 스레드, 그리고 애니메이션이나 오디오와 같은 다른 하위 작업을 위한 작업자 스레드입니다.

멀티스레딩의 성능 이점을 활용하려면 스레드를 병렬화하는 것이 좋습니다. 이와 관련된 예로 게임 스레드와 렌더링 스레드가 서로 다른 코어에서 부분적으로 또는 전체적으로 동시에 실행되는 경우를 들 수 있습니다. 공유 데이터 종속 항목을 사용하는 경우처럼 항상 가능하지는 않습니다. 하지만 가능한 경우 이로 인해 CPU 시간이 단축되고 프레임 속도가 높아질 수 있습니다.

잘 병렬 처리된 기본 스레드와 렌더링 스레드는 물론 작업자 스레드와 오디오 스레드가 있는 게임
그림 1. 잘 병렬 처리된 기본 스레드와 렌더링 스레드는 물론 작업자 스레드와 오디오 스레드가 있는 게임

CPU 코어 어피니티

CPU 워크로드의 성능에 큰 영향을 미치는 요소 중 하나는 코어에 작업이 예약되는 방식입니다. 이는 다음과 같은 두 가지 구성요소로 나눌 수 있습니다.

  • 게임 스레드가 워크로드에 가장 적합한 코어에서 실행되는지 여부
  • 게임 스레드가 코어 간에 자주 전환되는지 여부입니다.

최신 기기에서는 이기종 컴퓨팅이라는 아키텍처를 사용하는 경우가 많으며, 이 아키텍처에서는 코어별로 성능 수준이 다릅니다.

  • 하나 또는 소수의 코어가 최고 성능을 제공하지만 전력 소비량이 더 많습니다. 이를 '빅' 코어라고도 합니다.
  • 다른 코어는 최대 성능이 낮지만 전력 효율이 더 높습니다. 이들은 때로 "리틀" 코어라고 불립니다.
  • 선택사항: 하나 이상의 코어가 성능과 전력 간의 균형을 제공합니다. 이를 '미드' 코어라고도 합니다.

트레이스 수행 시 프로필 구성에서 CPU를 사용 설정하여 CPU 사용량의 CPU 스레드 동작을 조사할 수 있습니다. 200ms 미만인 트레이스 섹션을 확대하면 기기의 CPU 코어에서 실행되는 개별 프로세스를 볼 수 있습니다. 일반적으로 작은 코어는 작은 색인 (예: CPU '0'-'3')에 해당하고 큰 코어는 높은 색인 (예: CPU '6'-'7')에 해당하며 중간 코어가 있는 경우 중간 코어는 색인 사이의 색인을 차지합니다 (예: CPU '5'~'6'). 이는 일반적인 관례이지만 이를 보장하지는 않습니다.

성능 또는 전력 요구사항을 충족하지 않는 CPU에 특정 스레드가 예약되는 것이 확인되면 이러한 스레드의 CPU 어피니티를 수동으로 설정하는 것이 좋습니다.

기본 및 렌더링 스레드가 주로 대형 코어(CPU 6~7)에서 실행 중인 게임(하늘색으로 표시됨)
그림 2. 기본 및 렌더링 스레드가 주로 대형 코어(CPU 6~7)에서 실행되는 게임(하늘색으로 표시됨)

스레드가 코어 간에 전환되는지도 관찰할 수 있습니다. 이러한 코어 스위치는 컨텍스트 전환으로 인한 일부 오버헤드 및 코어의 캐시/레지스터에 대한 상태 손실을 초래합니다.

코어 간에 전환하는 기본(Thread-7) 및 렌더링 스레드(Thread-8)가 있는 게임(보라색으로 표시)
그림 3. 코어 간에 전환하는 기본(Thread-7) 및 렌더링 스레드(Thread-8)가 있는 게임(보라색으로 표시)

스레드의 CPU 선호도를 설정하면 게임이 포그라운드에 있을 때 시스템이 지정된 코어에서 해당 스레드를 예약하도록 지시합니다. 이 작업을 수행할 때 고려해야 할 몇 가지 요소가 있습니다.

  • 플랫폼 소프트웨어는 로드 및 열 제한과 같은 런타임 요인을 위해 작업 배치를 동적으로 조정할 수 없습니다.
  • 특히 기기가 가격대나 출시일에 따라 크게 달라지는 경우 다양한 기기에서 성능 테스트를 실시하여 매우 다른 성능 특성을 얻을 수 있습니다.

    최신 기기 또는 더 비싼 기기는 특정 워크로드를 작은 코어에서 편안하게 실행할 수 있지만 구형이거나 더 저렴한 기기에서는 동일한 워크로드의 기한을 충족하기 위해 더 큰 코어가 필요할 수 있습니다.

  • 어피니티를 빅 코어로 강제 설정하면 배터리 소모와 열 부하가 불필요하게 증가할 수 있습니다.

따라서 일반적으로 CPU 어피니티를 수동으로 설정하지 않는 것이 가장 좋습니다.