Basic of Compiler Optimization ¶
Topology ¶
νμ¬ νλ‘μΈμμ μλλ 무μ΄μ λ²μΉμ λ°λΌ κ·ΉνμΌλ‘ μλκ° μ¦κ°νκ³ μλ€. μ΄λ¬ν μν©μμλ μμ μ²λΌ CPU μ μλ μ νλ‘κ·Έλ¨μ μ€νμλκ° ν¬κ² μν₯ λ°μ§λ μμΌλ―λ‘, μ»΄νμΌλ¬μ μ΅μ ν μμ
λ λμ΄μ μ°μ°(computation)μ μ€μ΄λ κ² λ§μ΄ λͺ©μ μ΄ λλ κ²μ΄ μλλΌ, μ’ λ λ©λͺ¨λ¦¬ κ³μΈ΅κ΅¬μ‘°λ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νλ κ²μ κ΄μ¬μ΄ κΈ°μΈμ¬μ§κ² λλ€.
Local optimization κ³Ό Global optimization.
νλ‘κ·Έλ¨(translation unit)μ μ§νλ°©ν₯μ΄ λΆκΈ°μ μν΄ λ³νμ§ μλ λΆλΆμ μ§ν©μΈ basic block λ€λ‘ λλ μ μλλ° μ΄ κ°κ°μ block μ λνμ¬ μ΅μ ν νλ κ²μ local optimization μ΄λΌ νκ³ , λ μ΄μμ block μ λνμ¬, νΉμ νλ‘κ·Έλ¨ μ 체λ₯Ό μ΄κ΄νλ λΆλΆμ λνμ¬ μ΅μ ν νλ κ²μ global optimization μ΄λΌκ³ νλ€.λͺ¨λ μ΅μ ν μμ
μ μκ° ν¨μ¨μ λνμ¬, νΉμ κ³΅κ° ν¨μ¨μ λνμ¬ μ΅μ νλ₯Ό νκ² λλλ°, λ°μ κ° μΉμ
μ λ°λΌ λΆλ¦¬ ν μ μλ€. μ΄ μμ
λ€μ μλ‘ μνΈ λ³΄μμ μΌλ‘ μ΄λ£¨μ΄μ§κ±°λ νΉμ μνΈ λ°°μ μ μΌλ‘ μ΄λ£¨μ΄ μ§ μ μλ€. (e.g. latency λ₯Ό μ€μΌ κ²½μ° μ½λ κΈΈμ΄κ° κΈΈμ΄μ§κ±°λ 볡μ‘λκ° μ¦κ°ν μ μλ€.)
Reduction of computation ¶
μ€ν μκ°(run time) μ€μ κ³μ°μ μ€μ΄λ κ²μ΄ λͺ©μ μ΄λ€. μ΄ μ΅μ νλ '미리 μ»΄νμΌ μκ°μ κ³μ°(precomputaion in compile time)' ν μ μκ±°λ, '미리 κ³μ°λ κ°μ μ¬μ¬μ©(reuse a previously computated value)' ν μ μλ μν©μμ μ μ©λλ€.
Constant propagation
λ³μκ° κ°μ ν λΉ λ°μμ, λ€μ μλ‘μ΄ κ°μΌλ‘ ν λΉ λ°κΈ° μ κΉμ§, κ·Έ λ³μλ μΌμ’
μ constant λΌκ³ λ³Ό μ μλ€. μ»΄νμΌλ¬λ μ΄λ₯Ό κ°μ§ν΄μ μ΅μ νλ₯Ό μννκ² λλ€.
PI = 3.14159; ... area = 2 * PI * radius;μμ κ°μ λΆλΆμμ, PI μ κ°μ΄ μ€κ°μ λ³κ²½λμ§ μλλ€λ©΄, μμ μ½λλ
PI = 3.14159; ... area = 2 * 3.14159 * radius;μ κ°μ΄ λ°λ μ μλ€.
Constant folding
μ°μ°μμ λκ° μ΄μμ constant λ€μ, 미리 κ³μ°λμ΄ νλμ constant κ°μΌλ‘ λ°κΏ μ μλ€. μμ μμ μ μ©νμλ©΄
PI = 3.14159; ... area = 6.28318 * radius;κ° λλ€.
μ»΄νμΌλ¬λ constant propagation κ³Ό constant folding μ λ°λ³΅νμ¬ μννλ€. κ°κ° μλ‘μ κ°λ₯μ±μ λ§λ€μ΄ μ€ μ μμΌλ―λ‘, λμ΄μ μ§ν ν μ μμ λκΉμ§ μ§ννλ€.
Copy propagation
Common subexpression elimination
a = x + y; b = x + y;
temp = x + y; a = temp; b = temp;Partial redundancy analysis
Removing loop invariant code
Reduction of space consumption ¶
Reduction of code size ¶
Reduction of complexity ¶
Strength reduction
μ»΄ν¨ν°κ° ν μ μλ μ°μ° λ€μ κ°κ° κ·Έ μ°μ°μ΄ μνλλλ° κ±Έλ¦¬λ μκ°μ μ°¨μ΄κ° μλ€. μ°μ°μ 볡μ‘λμ μν΄μ μ΄λ£¨μ΄μ§λ νμμΈλ°, κ·Ήλ¨μ μΈ μλ₯Ό λ€μλ©΄, shift μ°μ°μ λ³΄ν΅ 2 ν΄λμ μ²λ¦¬λλ λ°λ©΄μ, λλκΈ° μ°μ°μ κ²½μ° 80-90 ν΄λμ μλͺ¨νκ² λλ€.(i8088μλ£) μ΄λ° μ°μ°μ λν computation time μ μ°¨μ΄λ₯Ό μ€μ΄λ μ΅μ ν λ°©λ²μ strength reduction μ΄λΌκ³ νλ€.x = y / 6
μ κ°μ λ¬Έμ₯μ΄ μμλ, λλκΈ° μ°μ°μ κ³±νκΈ° μ°μ°λ³΄λ€ μ’λ λ§μ μκ°μ μμνλ―λ‘ μ»΄νμΌλ¬λ
x = y * (1 / 6)
μΌλ‘ λ°κΏ μ μλ€.
λ°°μ΄μ μ°Έμ‘° μ°μ° λν μ’μ μκ° λ μ μλ€. ai μ κ°μ ννμμμ aiμ μ£Όμλ λ°°μ΄ a μ μμμ£Όμλ‘λΆν° aμ νμ
ν¬κΈ° * i λ§νΌ λ¨μ΄μ§ κ³³μ΄ λλ€.
~cpp double a[ARRSIZE], b[ARRSIZE]; for (i = 0; i < ARRSIZE; i++) a[i] = b[i];μ κ°μ μ½λμμ ai μ μ£Όμλ 루νκ° μ§νλ¨μ λ°λΌ κ³μ evaluate λλ€. κ·ΈλΌ a + (i * 8) μ΄ λ§€λ² λ°λ³΅λκ² λλ€. μ΄λ¬ν μ°μ°μ λ¨μν 루νκ° μ§νλλ©° a μ μ£Όμμ 8 μ©μ λν΄μ£Όλ κ²μΌλ‘ ν΄κ²°λ μ μλ€.
Algebraic simplification
μνμ μΌλ‘ κ°μ κ°μ κ°μ§λ μλ‘ λμΉνλ κ²μ΄ λ°λ‘ algebraic simplification μ΄λ€.e.g.
Expression | Equivalent expression |
x + 0 | x |
x * 0 | 0 |
x * 1 | x |
x^2 | x * x |
x * 2 | x + x |
x / 1 | x |
Reduction of latency ¶
cpu architecture μ°¨μμμ μ§μνλ€.
e.g. instruction prefetching, branch prediction, out-of-order execution
Distribution of work ¶
μμ.. cpu μ°¨μμμ...
e.g. pipelining, superscalar