프로파일 기반 최적화(Profile Guided Optimizations, PGO)는 대부분의 최적화 컴파일러에서 프로파일링 데이터를 바탕으로 알고리즘을 조정할 수 있는 일련의 변환입니다. 문헌에서는 피드백 기반 최적화(Feedback Directed Optimizations, FDO)라는 용어를 볼 수도 있는데, 이는 본질적으로 같은 것을 가리킵니다. 컴파일러는 프로파일링 데이터로 "훈련"되고 그 데이터를 사용해 기계어 코드를 생성하므로, 프로파일링 데이터의 품질과 적합성은 성능에 결정적인 영향을 미칩니다. 프로파일링 데이터는 컴파일러가 인라이닝 결정, 코드 배치, 레지스터 할당 등을 개선하는 데 도움이 됩니다. PGO를 사용하여 실제 워크로드의 성능이 최대 15%까지 향상되는 경우도 드물지 않습니다.

이 실습 과제에서는 특정 LUA 스크립트 집합을 처리하는 실행 시간을 개선해야 합니다. 소스에서 빌드되는 LUA 인터프리터의 전체 코드가 제공됩니다. 목표는 저희가 제공하는 특정 스크립트 집합에 최적화된 LUA 인터프리터를 생성하는 것임을 기억하십시오. 다른 LUA 스크립트를 실행하면 성능이 떨어질 가능성도 충분히 있습니다(프로덕션에서 사용할 때는 주의하십시오).

이 실습에서 권장하는 작업 흐름은 다음과 같습니다.

  1. 벤치마크를 프로파일링하고 병목 지점을 살펴보십시오.
  2. 프로파일링 데이터를 수집하고 그 내용을 확인하십시오(llvm-profdata -show)
  3. 수집한 프로파일링 데이터를 사용하여 다시 컴파일하고 속도 향상을 측정하십시오.
  4. 프로파일을 다시 수집하여 컴파일러가 어떤 변경을 통해 성능 속도 향상을 이끌어 냈는지 알아보십시오.
  5. 선택 사항: 다른 컴파일러(GCC, MSVC, Intel OneAPI)에서 PGO를 사용했을 때의 속도 향상을 확인하십시오.

제출

힌트: 이 실습 과제를 해결하려면 대상 컴파일러(Clang-12)용 프로파일링 데이터를 생성하고, 이 프로파일링 데이터를 사용하기 위한 적절한 옵션을 추가해야 합니다.

기대 속도 향상: 최소 5%.

출처

Co-authored-by: @dendibakh