스레드 예약 분석

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

  • 프레임 속도
  • 멀티스레딩 및 스레드 병렬화
  • 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 어피니티를 수동으로 설정하지 않는 것이 좋습니다.