Profile Guided Optimization (PGO)
Profile Guided Optimization, ์ดํ PGO๋ ๊ฐ์ฅ ๊ณต๊ฒฉ์ ์ธ ์ปดํ์ผ ์ต์ ํ ๋ฐฉ์ ์ค ํ๋๋ค.
์ปดํ์ผ ์ธ์ด๋ฅผ ์ฐ๊ณ ์ต์ ํ ์ต์ ์ ์ด๊ฒ์ ๊ฒ ๋ฃ๋๋ผ๋, ์ต์ ํ์ ํ๊ณ๋ ์จ๋ค.
์ต์ ํ ํํธ๋ฅผ ํตํ ๋ง์ดํฌ๋ก๋งค๋์ง๊ณผ ํ๋ง๋ฒ์ ๋ก์น ํ๋ค๋ฉด ๋น์ฅ์ ์ด๋ป๊ฒ ๋๋๋ผ๋, ๊ทธ๊ฑด ๋ณ๋ก ์ง์ ๊ฐ๋ฅํ์ง๊ฐ ์๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ด ๋ ์ ํํ ์ ์๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ ๊ทผ๋ฒ์ด ์ด PGO๋ผ๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ธ ์ปดํ์ผ
์ฐ๋ฆฌ๊ฐ ์ปดํ์ผ์ด๋ผ๊ณ ํํํ๋ ๊ฒ๋ค์ ๋๋ถ๋ถ ์ ์ ๋ถ์(Static program analysis)์ ํตํด์ ์๊ฒฉํ ๊ท์น ๊ธฐ๋ฐ์ผ๋ก, ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ๋ก ๋ณํํ๋ ๊ณผ์ ์ด๋ค.
์ด๋ฐ ๊ณ ์ ์ ์ธ ์ปดํ์ผ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์ ์๋ํ๊ณ , ์ฑ๋ฅ๋ ๊ทธ๋ญ์ ๋ญ ๋์ค๊ธด ํ๋ค.
ํ์ง๋ง ํด๋น ํ๋ก๊ทธ๋จ์ด ๋ผ ์ ์๋ ์ต์ ์ ์ฑ๋ฅ์ ๋ผ ์๋ ์๋ค๋ ๊ทผ๋ณธ์ ์ธ ํ๊ณ๊ฐ ์๋ค.
์ปดํ์ผํ์ ์์ ์ ๊ท์น์ ์ธ ๋ถ์์ผ๋ก๋ ์ค์ ๋ก ์ด๋ค ํจ์๊ฐ ๋ง์ด ํธ์ถ๋๋์ง, ์ด๋ค ๋ถ๊ธฐ๋ฅผ ๋ง์ด ํ๋์ง, ์ด๋ค ์
๋ ฅ์ด ๋ง์ด ๋ค์ด์ค๋์ง ๋ฑ์ ์ ๋๋ก ๋ฏธ๋ฆฌ ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
PGO๋ ์ด๋ฐ ํ๊ณ์ ์ ๋ณด์ํ๊ณ ์ ์๊ธด ๊ฐ๋ ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
PGO์ ์ ์ฉ ๊ณผ์
PGO๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ ์ํ๋๋ค.
-
์ผ๋จ ํ๋กํ์ผ๋ง ์์ง์ ํ์ฑํํ ์ฑ๋ก ์ปดํ์ผํด์ ์คํํ์ผ์ ๋ฝ๋๋ค.
-
์คํํ์ผ์ ์คํํ๊ณ , ์ค์ ์ฌ์ฉ์ฌ๋ก์ ๋ง๊ฒ ์คํ์ ์ ๋ํ๋ฉด์ ํ๋กํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ฝ๋๋ค.
-
ํ๋กํ์ผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ต์ ์ ์ฃผ๊ณ ๋ค์ ์ปดํ์ผ์ ํ๋ค.
-
๊ทธ๋ฌ๋ฉด ์ปดํฉํธํ๊ฒ ์ต์ ํ๋ ์คํํ์ผ์ด ๋์ค๋ ๊ฒ์ด๋ค.
Go์ Rust(LLVM)์ ์ฌ์ฉ ์์๋ฅผ ๋งํฌ๋ก ๋ฌ์๋๊ฒ ๋ค.
https://blog.naver.com/sssang97/222888877448
https://blog.naver.com/sssang97/223176448202
PGO๊ฐ ์ต์ ํ๋ฅผ ํ๋ ๋ฐฉ๋ฒ
PGO์ ์ต์ ํ ์์ค๊ณผ ์ ๊ทผ๋ฒ์ ํด์ฒด์ธ๋ง๋ค ๋ค๋ฅผ ์ ์๋๋ฐ, ์ฌ๊ธฐ์๋ LLVM์ ๊ธฐ์ค์ผ๋ก ์ค๋ช
ํด๋ณด๊ฒ ๋ค.
์๋ ํญ๋ชฉ์ ์ ์ธํ๊ณ ๋ ์ ๊ทผ๋ฒ์ ๋งค์ฐ ๋ค์ํ๋ค. ์์ง๊ตฌ๋ ํ ๊ฒ๊น์ง ๋ค๋ฃจ๋ฉด ๋๋ ์์ด์ ๋ํ์ ์ธ ๊ฒ ๋ช๊ฐ์ง๋ง ์ ๋ฆฌํด๋ณธ๋ค.
ํจ์ ์ธ๋ผ์ด๋
ํจ์ ํธ์ถ์ ์๊ฐ๋ณด๋ค ๋ฌด๊ฑฐ์ด ๋ฉด์ด ์๋ ๋์์ด๋ค.
์ธ์ ๋๊ธธ๋๋ง๋ค ๋ ์ง์คํฐ๋ฅผ ์๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ ์คํ์ ์์์ผ ํ๊ณ , ํจ์ ์ง์
์์ ๊ณผ ํ์ถ ์์ ๋ง๋ค jump ์ธ์คํธ๋ญ์
์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋๋ง ํจ์๋ก ์ง์
ํ ๋๋ ํจ์์ ์ฃผ์๊ฐ ๊ณ ์ ์ฃผ์๋๊น ๊ด์ฐฎ์๋ฐ, ํจ์๋ฅผ ์ดํํ ๋๋ return address๊ฐ ์ฌ๋ฌ๊ณณ์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๊ธฐ ์์ธก์ผ๋ก ์ธํ ์ต์ ํ๊ฐ ์ ์๋๋ ํธ์ด๋ค.
๊ทธ๋์ ํจ์ ๋จ์๋ฅผ ์ ๊ฑฐํ๊ณ ๋งคํฌ๋ก์ฒ๋ผ ์ฝ๋ ๋ณธ๋ฌธ์ ์ฝ์
ํ๋ ๊ฒ์ ์ธ๋ผ์ด๋์ด๋ผ๊ณ ํ๋ค. ํจ์ ํธ์ถ๋ก ์ธํ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ผ๋, ๊ทธ๊ฒ ํญ์ ์๋ฏธ๊ฐ ์๋๊ฑด ์๋๋ผ์ ์ปดํ์ผ๋ฌ๋ค๋ ๊ทธ๋๊ทธ๋ ์ํฉ ๋ด๊ฐ๋ฉด์ ํ๋ค.
๋ง๊ตฌ์ก์ด๋ก ๋ฃ์ด๋๋ฉด ์ฝ๋ ํฌ๊ธฐ๊ฐ ๋น๋ํด์ ธ์ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฅ ์ปค์ ธ์ ๋ช
๋ น์ด ์บ์ ๋ก๋๋ฅผ ์ ๋๋ก ๋ชปํ ์๋ ์๊ณ , branch prediction์ด ๋ ๋ณต์กํด์ง ์๋ ์๋ค.
์ธ๋ผ์ธ์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ ์ ์๋๋ฐ, ํน์ ํจ์๊ฐ ๊ทธ๋ฅ ๋ง์ด ํธ์ถ๋๋ ํจ์๋ผ๋ฉด ๊ทธ ํจ์๋ฅผ ๋ชจ๋ ํธ์ถ ์ง์ ์ ์ธ๋ผ์ธํ ์๋ ์๊ณ , ํน์ ํจ์๊ฐ ํน์ ๊ฒฝ๋ก์์๋ง ์์ฃผ ํธ์ถ๋๋ค๋ฉด ๊ฑฐ๊ธฐ์๋ง ์ธ๋ผ์ธ์ ํ ์๋ ์๋ค.
PGO๋ฅผ ์ ์ฉํ ๊ฒฝ์ฐ์๋ ํ์, ์์ฃผ ํธ์ถ๋๋ ํจ์ ํธ์ถ ๊ฒฝ๋ก์ ๋ํด ๋ ๊ณต๊ฒฉ์ ์ธ ์ธ๋ผ์ด๋์ ์ํํ๋ค.
๋ถ๊ธฐ ์์ธก (branch prediction)
branch, ๊ทธ๋ฌ๋๊น ์กฐ๊ฑด ๋ถ๊ธฐ์ ๋ํ ๋ด์ฉ์ด๋ค.
CPU๋ branch ๋ช
๋ น์ด๋ฅผ ๋ง๋๋ฉด ๋ค์์ ์คํ๋ ๋ช
๋ น์ด์ ์ฃผ์๋ฅผ ์์ธกํ๋ค. ์์ธก์ด ๋ง๋ค๋ฉด ๊ต์ฅํ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์์ง๋ง, ์คํจํ๋ค๋ฉด ๊ทธ ์์ ์ ๋ค์ ์ฝ๋๋ฅผ ์บ์๋ก ๋ถ๋ฌ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋์ฐํ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์๋ค.
PGO๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ปดํ์ผ๋ฌ๋ ์คํ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์์ฃผ ๊ฑธ๋ฆฌ๋ hot branch์ ๋ ๊ฑธ๋ฆฌ๋ cold branch๋ฅผ ํต๊ณ์ ์ผ๋ก ํ๋จํ ์ ์๋ค.
๊ทธ๋์ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์คํ ๋น๋๊ฐ ๋์ hot branch๋ฅผ ๊ฐ๊น์ด ๋ฐฐ์นํด์ ์บ์์ ํ๋๋ก ํ๊ณ , ์คํ ๋น๋๊ฐ ๋ฎ์ cold branch๋ฅผ ๋ฉ๋ฆฌ ๋ฐฐ์นํด์ ๋ถ๊ธฐ ์์ธก๋ฅ ์ด ๋์์ง๋๋ก ์ ๋ํ๋ ๊ฒ์ด๋ค.
์ฝ๋ ๋ ์ด์์ ์ต์ ํ
์์ ๊ณ ๊ธ ์ธ์ด๋ค์์๋ ํจ์๋ ์ฝ๋์ ์์น๊ฐ ์ฑ๋ฅ๊ณผ ์ฐ๊ด์ด ์๋ ๊ฒ์ฒ๋ผ ๋์ํ์ง๋ง, ์ค์ ์ด์
๋ธ๋ฆฌ ์์ค์์๋ ๊ทธ๋ ์ง ์๋ค.
CPU๋ผ๋ ๋
์๋ ๋ชจ๋ ์ฝ๋๋ฅผ ํญ์ ๋ค๊ณ ์์ง๋ ์๊ณ , ๊ทธ ๋ค์ ์ฝ๋๊ฐ ๊ฐ๊น์ด ์์นํด์ผ์ง ์บ์์์ ๋น ๋ฅด๊ฒ ๋ก๋ํด์ ์คํ์ ํ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ PGO๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ ์คํ ์์์ ๊ธฐ๋ฐํด์ ๋ช ๋ น์ด ๋ธ๋ก ๋ฐฐ์น ์์๋ฅผ ์กฐ์ ํ๊ณ , ์์ฃผ ์คํ๋๋ Hot ์ฝ๋๋ฅผ ๊ฐ๊น์ด์, ๋ ์คํ๋๋ Cold ์ฝ๋๋ฅผ ๋ฉ๋ฆฌ์ ๋ฐฐ์นํ๋ค.
๊ฐ์ ํธ์ถ ์ต์ ํ (indirect call)
๊ฐ์ ํธ์ถ์ด๋ ๊ฐ์ ๋ถ๊ธฐ(indirect branch)์ ์ํด์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๋งํ๋ค.
๊ฐ์ ๋ถ๊ธฐ๋, ๋ฉ๋ชจ๋ฆฌ(RAM)์ ์ ์ฅ๊ฐ ๊ธฐ์ค์ผ๋ก ๋ถ๊ธฐ๋ฅผ ํ์ฐ๋ ๊ฒ์ด๋ค.
C++์ ๊ฐ์ํจ์๋ฅผ ํฌํจํด์, ๊ฐ์ฒด์งํฅ์์์ ๋ฉ์๋ ๋คํ์ฑ ๋์์ ์ ๋ถ ๊ฐ์ ๋ถ๊ธฐ๋ก ๊ตฌํ๋๋ค. ์ค์ ๊ฐ์ฒด์ ํ์
๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ํ์
์ ๋ฉ์๋๋ฅผ ์คํ์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ ๋ถ๊ธฐ๋ ๋ถ๊ธฐ ์์ธก(branch prediction)์ ๋ง๊ฐ๋จ๋ฆฌ๋ ์ฃผ๋ฒ ์ค ํ๋์ธ์ง๋ผ, ์ด๋ฐ ๊ฐ์ ํธ์ถ์ด ์์ด๋ค๋ณด๋ฉด ์ฑ๋ฅ์ ๊ฝค ํฐ ์
์ํฅ์ ์ค ์๋ ์๋ค.
PGO๋ฅผ ์ ์ฉํ๋ค๋ฉด ์ค์ ์คํ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ๋ถ๊ธฐ๋ฅผ ์ต์ํํ ์ ์๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ branch prediction์ ์ถ๊ฐํด์ฃผ๊ฑฐ๋, ๊ฐ์ํจ์ ์์ฒด๋ฅผ ์ธ๋ผ์ด๋ํ๊ธฐ๋ ํ๋ค.
๋ฃจํ ์ต์ ํ: ๋ฃจํ ์ธ๋กค๋ง
๋ฃจํ ์ธ๋กค๋ง์ ๋ฃจํ ๋ด ์ฐ์ฐ ๋์์ ์์ถํ๊ณ branch ํ์๋ฅผ ์ค์ด๋ ์ต์ ํ ๋ฐฉ๋ฒ์ด๋ค.
PGO๋ฅผ ์ ์ฉํ๋ฉด ์คํ ๋น๋๊ฐ ๋์ ๋ฃจํ๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ธ๋กค๋ง์ ์๋ํ๋ค.
https://blog.naver.com/sssang97/221800631864
Dead Code ์ ๊ฑฐ
Dead Code ์ ๊ฑฐ, ๊ทธ๋ฌ๋๊น ์ฌ์ฉ๋์ง ์๋ ์ฝ๋์ ๋ํ ์ ๊ฑฐ๋ ์ฌ์ค ์ผ๋ฐ ์ปดํ์ผ์์๋ ์ถฉ๋ถํ ๊ฑธ๋ฌ์ง ์ ์๋ ๋ถ๋ถ์ด๊ธด ํ๋ค.
ํ์ง๋ง ์ปดํ์ผ ์์ ์์๋ ์ ์ ์๊ณ ์ค์ ๋ก ์คํ์ ํด๋ด์ผ dead code์ธ์ง ํ๋จํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌ ์๋ค.
๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋งํน์ด๋, OS๋ ๋๋ผ์ด๋ฒ ์ํ์ ๋ฐ๋ผ์ ์ง์
๊ฐ๋ฅ/๋ถ๊ฐ๋ฅํ ์ฝ๋ ์ง์ ์ด ์ ํด์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฐ๊ฑด PGO๋ JIT์ ํ์ด ๊ฒฝ์ฐ์๋ง ํ์คํ๊ฒ ํ๋จํด์ ์ ๊ฑฐํ ์ ์๋ค.
์ด๋ฅผ ํตํด์ ๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ์ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค.
PGO์ ์ ์ฉ ์ฌ๋ก
GCC, LLVM, MSVC, ICC ๋ฑ ๋ฉ์ด์ ํ ์ปดํ์ผ๋ฌ ํด์ฒด์ธ๋ค์ ๋ชจ๋ PGO ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
์ด๋ฐ ์งฌ์ด ์์ฌ์๋ ํ๊ฒฝ๋ค์ PGO๊ฐ ์์ฃผ ํจ๊ณผ์ ์ผ๋ก ๋์ํ๋ค. ๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ๋ ๋๋ถ๋ถ ํ์ฐํ ์ค์ด๋ค๊ณ , ์ฑ๋ฅ๋ ๋์ ๋๊ฒ ํฅ์๋๋ค. 2๋ฐฐ 3๋ฐฐ๊น์ง๋ ์๋๋๋ผ๋ 10~40% ์ ๋์ ์๋ ํฅ์์ ๋ณดํต ๋๋ผ๋ ๊ฒ ๊ฐ๋ค.
Golang์ ๋น๊ต์ ์ต๊ทผ์ PGO๋ฅผ ์์ฒด์ ์ผ๋ก ๊ตฌํํด์ ๋ด๋์๋๋ฐ, ๋ค๋ฅธ๊ฑด ๊ฑฐ์ ์๊ณ ์ธ๋ผ์ด๋๋ง ํ๋๊ฑฐ๋ผ์ ์ฑ๋ฅ ํฅ์๋ ๋ฏธ๋ฏธํ๊ณ ๋ฐ์ด๋๋ฆฌ๊ฐ ์คํ๋ ค ์ปค์ง๋๋ผ.
JIT ์ปดํ์ผ
PGO๊ฐ ๊ฐ์ฅ ์ ์ฌ์ฉ๋๋ ๋ถ์ผ๋ ์ฌ์ค ์ผ๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋๋ผ, ์ผ๋ถ ํ์ด๋ธ๋ฆฌ๋ ๋ฐํ์ ์ธ์ด๋ค์ด๋ค.
PGO ์ปดํ์ผ์ด ๊ฝค ๊ฐ๋ ฅํ๊ธด ํ๋ ๋งค๋ฒ ์ธํ ํ๊ณ ํ๋กํ์ผ ๋ฝ๊ณ , ๋ค์ ์ปดํ์ผํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ ๊ฒ์ ๋ฒ๊ฑฐ๋ก์ธ ์ ๋ฐ์ ์๋ค.
ํ์ด๋ธ๋ฆฌ๋ ์ปดํ์ผ ์ธ์ด์ธ Java์ C#๋ JIT ์ปดํ์ผ, ๊ทธ๋ฌ๋๊น ์ค์๊ฐ ์ปดํ์ผ ์ต์ ํ์์ ์ผ์ข
์ PGO๋ฅผ ์ํํ๋ค.
์ค์๊ฐ์ผ๋ก ์คํํ๋ฉด์ ์คํ ๊ธฐ๋ก์ ์์งํ๊ณ , ๊ทธ๊ฑธ ๊ธฐ๋ฐ์ผ๋ก PGO ์ต์ ํ๋ฅผ ๊ทธ๋๊ทธ๋ ํ๋ ๊ฒ์ด๋ค.
Java๊ฐ ์๋ํ๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋๋ถ๋ถ ์ฌ๊ธฐ์์ ๋์จ๋ค.
Java์ ์ต์ ํ ๊ตฌ์กฐ์ ๋ํ ์ฐธ์กฐ
https://blog.naver.com/sssang97/223573816314
์ฐธ์กฐ
https://llvm.org/devmtg/2020-09/slides/PGO_Instrumentation.pdf
https://chrisfeilbach.com/2025/07/05/understand-cpu-branch-instructions-better/
https://d2.naver.com/helloworld/8404108?ref=pangyoalto.com