L1 i-캐시(L1 i-cache) 연관성 문제, Go 코드 성능을 갉아먹다!

by DD
1주 전
조회수 10

Go 코드베이스에서 L1 i-캐시(L1 i-cache) 연관성 문제로 인해 예상치 못한 성능 저하 발생

코드 변경 없이 함수 정렬(Function Alignment)으로 인한 L1 i-캐시(L1 i-cache) 미스(Miss) 증가가 원인으로 밝혀짐

`perf` 도구를 활용한 상세 분석(Deep Dive)을 통해 L1 i-캐시(L1 i-cache) 충돌 지점 파악

함수 정렬(Function Alignment) 설정을 통해 벤치마크(Benchmark) 신뢰도 확보 및 문제 해결 시도

L1 i-캐시(L1 i-cache) 연관성 문제의 심층 분석

게시물은 코드 변경 없이 함수 정렬(Function Alignment)으로 인해 L1 i-캐시(L1 i-cache)의 충돌(Conflict)이 발생하여 성능 저하가 일어났다고 설명한다. 특히, L1 i-캐시(L1 i-cache)는 CPU 명령어 캐싱에 사용되며, 8-way set associative 구조를 가진다. 코드 정렬(Code Alignment) 변경으로 인해 핫 루프(Hot Loop)가 다른 핫 루프와 동일한 캐시 세트(Cache Set)에 매핑되면서 캐시 미스(Cache Miss)가 증가하는 현상을 보였다.

성능 분석 도구 `perf`를 활용한 문제 해결

저자는 `perf` 도구를 사용하여 L1 i-캐시(L1 i-cache) 미스(Miss)의 원인을 분석했다. `perf stat` 명령어를 통해 사이클(Cycles), 명령어(Instructions), 분기 예측(Branch Prediction) 등의 성능 지표를 측정하고, `perf record` 및 `perf report` 명령어를 사용하여 L1 i-캐시(L1 i-cache) 미스(Miss)가 발생하는 함수를 식별했다. 이러한 분석 과정을 통해 L1 i-캐시(L1 i-cache) 충돌(Conflict)의 구체적인 원인을 파악할 수 있었다.

함수 정렬(Function Alignment) 설정을 통한 벤치마크(Benchmark) 신뢰도 확보

게시물에서는 함수 정렬(Function Alignment) 설정을 통해 벤치마크(Benchmark) 결과의 일관성을 확보하는 방법을 제시한다. Go 컴파일러의 `-ldflags="-funcalign=64"` 옵션을 사용하여 함수를 64바이트 단위로 정렬함으로써, 코드 레이아웃(Code Layout) 변화에 따른 성능 변동성을 줄일 수 있다. 이는 벤치마크(Benchmark) 결과의 신뢰도를 높이고, 성능 개선(Performance Improvement)의 정확한 평가를 가능하게 한다.

L1 i-캐시(L1 i-cache) 연관성 문제의 근본적인 해결책 부재

저자는 L1 i-캐시(L1 i-cache) 연관성 문제에 대한 근본적인 해결책이 없음을 강조한다. 코드의 정렬(Alignment) 변경은 의도치 않게 L1 i-캐시(L1 i-cache) 충돌(Conflict)을 유발할 수 있으며, 이는 예측하기 어렵다. PGO(Profile Guided Optimization)를 통해 레이아웃(Layout)을 변경할 수 있지만, 라이브러리 개발자(Library Author)는 이를 제어할 수 없다. 따라서, 핫 루프(Hot Loop)의 크기를 조절하거나, 함수 정렬(Function Alignment) 설정을 통해 벤치마크(Benchmark)의 신뢰도를 확보하는 것이 최선이다.

A performance regression in code I didn’t touch: debugging an L1 i-cache associativity issue

댓글 0

첫 번째 댓글을 남겨보세요!