κ°μ π
μμ μ κ΄λ¦¬νλ λΈλ‘κ·Έμμ 컀λμμ μ¬μ©νλ likely
μ unlikely
μ
λν΄μ μ 리ν ν¬μ€ν
μ΄ μμλ€. νμ§λ§ μκ°μ΄ μ§λ 컀λ λΆμ μ±
μ λ€μ
보며 likely, unlikelyλ₯Ό 보λ λ€μ ν·κ°λ¦¬κΈ° μμνλ€.
νμ¬ μ 무μμ μ€ν μκ°μ μ€μ΄λ λ°μ μ€μλλ₯Ό λκ³ μμ§λ§ κ·Έ λ°©λ²μ λν΄μλ μμ§ λ€λ£¨μ§ λͺ»νκ³ μλ€. μ루μ μ΄ μμ νλκ³ μ 체μ μΈ μ 무 λ΄μ©μ΄ νμ λλ©΄ λ³Έ λ΄μ©μ μ 리νλ©΄μ μ€ν μκ°μ κ°μν λ°©λ²μΌλ‘ predictionμ μ΄μ©νλ κ²μ 건μν΄λ³΄κ³ μ§νν΄λ³Ό μ μμ κ² κ°λ€.
likely(), unlikely() π
ν¨μμ μ΄λ¦ κ·Έλλ‘, μμ£Ό μΌμ΄λ λ―νκ±°λ μμ£Ό μΌμ΄λμ§ μμ λ―ν κ²μ μν 맀ν¬λ‘μ΄λ€. μΆμ²μλ μλμ κ°μ μμ λ₯Ό μ 곡νκ³ μλ€.
νΉμ conditionμ νμΈνλ μ©λλ‘ μ¬μ©νλλ° μμ μ½λμμλ
bvec_alloc
μΌλ‘ ν λΉλ°κ³ bvlμ΄ μ ν¨ν μ£Όμκ°μ΄λΌλ©΄ λ©λͺ¨λ¦¬ ν΄μ λ₯Ό νκ³
NULLλ‘ λ³κ²½νλ μ½λμ΄λ€.
include/linux/compiler.h
νμΌμ μ μλμ΄ μλ 맀ν¬λ‘λ‘μ branch
prediction μ μν μ©λλ‘ μ¬μ©λλ€. μ¦, κ²°κ³Όκ°μ΄ λλΆλΆ falseλ‘
μμλλ€λ©΄ unlikely()
λ₯Ό, trueλ‘ μμλλ€λ©΄ likely()
λ₯Ό μ¬μ©ν¨μΌλ‘μ
μ»΄νμΌλ¬λ₯Ό ν΅ν λΆκΈ° μμΈ‘μ μ΄μ©νμ¬ μ±λ₯ ν₯μμ κΎν μ μλ€.
κ°κ°μ μ μλ₯Ό μ΄ν΄λ³΄λ©΄, μλμ κ°μ΄ λμ΄ μλ€.
__built-in function π
__builtin_expect
λ₯Ό μ¬μ©νλ κ²μ μ»΄νμΌλ¬μκ² λΆκΈ° μμΈ‘(branch
prediction) μ 보λ₯Ό μ 곡νκΈ° μν κ²μ΄λ€. μΌλ°μ μΌλ‘ κ°λ°μλ€μ μμ μ
νλ‘κ·Έλ¨μ΄ μ΄λ»κ² μνλλμ§ μκΈ° νλ€κΈ° λλ¬Έμ ‘-fprofile-arcs’
μ΅μ
μ ν΅ν΄ νλ‘νμΌμ νΌλλ°± λ°λ κ²μ μ νΈνλ€. νμ§λ§
μ ν리μΌμ΄μ
μ λ°λΌμ μ΄λ¬ν μ΅μ
μ ν΅ν΄ νλ‘νμΌλ§μ΄ νλ κ²½μ°λ
μλ€.
μμ π
μλμ μμ λ₯Ό ν΅ν΄ μ±λ₯ ν₯μμ΄ μ΄λ»κ² κ°λ₯νμ§ μ΄ν΄λ³΄μ.
μ μμ λ₯Ό μ»΄νμΌ ν λ€μ, objdumpλ‘ μ΄ν΄λ³΄λ©΄ μλμ κ°μ΄ main λΆλΆμ λ°κ²¬ν μ μλ€.
|
|
cmpl %0x2, -0x4(%rbp)
μμ λ³΄λ― 2μ κ°μ κ²½μ°μ jump λͺ
λ Ήμ΄λ₯Ό
μννκ³ κ°μ§ μμ κ²½μ°μλ κ³μν΄μ λͺ
λ Ήμ΄λ₯Ό μμ°¨ μ§ννλ€. je
λͺ
λ Ήμ΄λ₯Ό μ€ννμ§ μμΌλ pipeline flushκ° μΌμ΄λμ§ μμ branch
predictionμ νμ§ μμμ λλ³΄λ€ μ±λ₯ ν₯μμ κΎν μ μλ€.
λ§μ½, likely()
λ₯Ό νκ² λλ©΄ μ΄λ¨κΉ? μλ§ λ°λλ‘ λͺ
λ Ήμ΄κ° μ€νλ
κ²μ΄λ€. μ¦, νλ‘κ·Έλλ¨Έκ° μμνλ μλ리μ€λ‘ λΆκΈ° μμΈ‘μ νμ¬ μ΅λν
jump λͺ
λ Ήμ΄λ₯Ό μννμ§ μλλ‘ νλ κΈ°λ²μ΄λ€.