시작하기

환경 설정 방법

이 비디오 강좌의 실습을 빌드하려면 반드시 설치해야 하는 도구 목록은 다음과 같습니다:

나머지는 선택한 플랫폼에 따라 선택 사항입니다. 현재까지는 Windows와 Linux에서의 네이티브 빌드를 지원합니다. 각 플랫폼별 안내를 확인하십시오(Windows) (Linux) (MacOS).

실습 과제 빌드 방법

준비 영상을 시청하십시오:

모든 실습 과제는 다음으로 구성됩니다:

요약 영상을 보기 전에 먼저 실습 과제를 직접 풀어 보시기를 권장합니다.

모든 실습은 다음 명령으로 빌드하고 실행할 수 있습니다:

cmake -E make_directory build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release --parallel 8
cmake --build . --target validateLab
cmake --build . --target benchmarkLab

개인 브랜치에 변경 사항을 푸시하면 CI 벤치마크 작업이 자동으로 실행됩니다. 이에 대한 자세한 내용은 페이지 하단에 있습니다.

프로파일링

프로파일에서 어셈블리 코드를 소스 코드와 대응시키려면 디버그 정보를 포함하여 바이너리를 빌드하십시오:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-g" -DCMAKE_CXX_FLAGS="-g" ..

실습 과제는 Google Benchmark 벤치마크 라이브러리를 기반으로 만들어졌으며, 이 라이브러리는 기본적으로 벤치마크 반복 횟수를 가변적으로 수행합니다. 이 때문에 두 실행이 동일한 양의 작업을 수행하지 않으므로 두 실행의 성능 프로파일을 비교하기 어렵습니다. 반복 횟수가 다르더라도 같은 실행 시간(wall time)이 나타날 수 있습니다. 반복 횟수를 고정하려면 다음과 같이 변경하면 됩니다:

  BENCHMARK(bench1)->Iterations(10);

이렇게 하면 Google Benchmark 프레임워크가 벤치마크를 정확히 10회 반복 실행합니다. 이제 코드를 개선하면 실행 시간이 달라지므로 성능 프로파일도 비교할 수 있습니다.

대상 플랫폼

사용 가능한 어떤 플랫폼에서든 자유롭게 작업하셔도 됩니다. 다만 제출물은 다음 CI 머신에서 실행합니다:

머신 1 - (Linux + Alderlake)

머신 2 - (Mac OS + M1)

머신 3 - (Windows + Zen3)

~머신 4 - (Linux + CoffeeLake)~

플랫폼에 따라 속도 향상 정도가 다르게 나타날 수 있다는 점에 유의하십시오.

로컬 실험:

다음은 실험 결과를 기준 버전과 비교하는 데 도움이 되는 몇 가지 팁입니다. 기준 버전을 실행하고 그 결과를 기록해 두었다가, 나중에 실험 결과와 비교하는 데 사용할 수 있습니다. 하지만 이 과정을 자동화하는 더 좋은 방법이 있습니다. 다음 두 가지 방법 중 하나를 선택할 수 있습니다:

  1. Google benchmark 벤치마크 라이브러리에 포함된 compare.py 스크립트를 사용하십시오:

    # 1. Benchmark the baseline and save the score into a JSON file
    ./lab --benchmark_min_time=1 --benchmark_out_format=json --benchmark_out=baseline.json
    # 2. Change the code
    # 3. Benchmark your solution and save the score into a JSON file
    ./lab --benchmark_min_time=1 --benchmark_out_format=json --benchmark_out=solution.json
    # 4. Compare solution.json against baseline.json
    /path/to/benchmark/tools/compare.py benchmarks baseline.json solution.json
  2. Performance Ninja 저장소에 있는 check_speedup.py 스크립트를 사용하십시오(내부적으로 compare.py 스크립트를 사용합니다):

    # 1. Put your solution under `#ifdef SOLUTION`:
      #ifdef SOLUTION
        // your solution
      #else
        // baseline version
      #endif
    # 2. Run the script, which will build and run your solution against the baseline N times
    cd build
    python3 ~/workspace/perf-ninja/tools/check_speedup.py -lab_path ../ -num_runs 3

제출 가이드라인:

중요: 이 Github 저장소에 협업자로 추가해 달라는 요청을 보내십시오. 그렇지 않으면 비공개 브랜치를 푸시할 수 없습니다. "[PerfNinjaAccessRequest]"라는 제목으로 github 아이디를 dendibakh@gmail.com으로 보내십시오. 저장소를 포크하여 풀 리퀘스트로 해답을 제출하지 마십시오. 그렇게 하면 CI 작업이 실행되지 않습니다.

제출물은 자신의 브랜치에 푸시하십시오. 원격 Github 브랜치에 변경 사항을 푸시할 때마다 CI 작업이 실행됩니다. 현재는 벤치마크 용도로 특별히 구성된 셀프 호스티드 러너를 사용합니다.

기본적으로 CI는 마지막 커밋에서 어떤 실습이 수정되었는지 감지하여 해당 과제만 벤치마크합니다. 둘 이상의 실습을 변경하면 CI 작업은 모든 실습을 벤치마크합니다. 커밋 메시지에 [CheckAll]을 추가하여 모든 실습을 강제로 벤치마크할 수도 있습니다.

모든 실습이 벤치마크된 경우 마지막에 다음과 같은 요약이 제공됩니다.

Lab Assignments Summary:
  memory_bound:
    data_packing: Passed
    sequential_accesses: Failed: not fast enough
  core_bound:
    function_inlining: Failed: build error
  misc:
    warmup: Skipped