"GCC рд╕рдВрдХрд▓рдХ рдХреЛ рдЕрдкрдЧреНрд░реЗрдб рдХреНрдпреЛрдВ рдХрд░реЗрдВ?" рдпрд╛ "рдЗрдВрдЯреЗрд▓ рдПрдЯрдо рдкрд░ GCC рд╕рдВрдХрд▓рдХ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рддрдХ"


рдЖрдЗрдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдЗрдВрдЯреЗрд▓ рдПрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЬреАрд╕реАрд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдХреНрдпрд╛ рдирдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рд╕рд┐рджреНрдз рдИрдИрдПрдордмреАрд╕реА рдХреЛрд░рдорд╛рд░реНрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдХреЛрдб рдЖрдХрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдКрдкрд░ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИ рдЬреЛ GCC рд╕рдВрд╕реНрдХрд░рдг 4.4.6 (рдЙрдЪреНрдЪрддрд░ рдмреЗрд╣рддрд░ рд╣реИ) рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ GCC рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЪреЛрдЯреА рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд CoreMark рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рдЖрдзрд╛рд░ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ (рдЖрдзрд╛рд░): "-O2 -рдлрд╛рд╕реНрдЯ-рдЧрдгрд┐рдд -mfpmath = sse -m32 -march = рдкрд░рдорд╛рдгреБ"
рдЖрдзрд╛рд░ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ (рдЖрдзрд╛рд░) + рдпрджрд┐ рд░реВрдкрд╛рдВрддрд░рдг: "-O2 -рдлрд╛рд╕реНрдЯ-рдЧрдгрд┐рдд -mfpmath = sse -ftree-loop-if-Convert -m32 -march = atom"
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрд░рдо рд╕реЗрдЯ (рд╢рд┐рдЦрд░): "-Ofast -funroll-loops -mfpmath = sse -m32 -march = atom", рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП 4.4 рдФрд░ 4.5 "-Ofast" рдХреЛ "-O3 -рдлреЙрд╕реНрдЯ-рдореИрде" рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
X86 рдкрд░ GCC рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ рд▓рд┐рдЦреА рдЧрдИ рдереА ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ "-flto" рд╡рд┐рдХрд▓реНрдк рдЕрднреА рддрдХ CoreMark рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдЧреНрд░рд╛рдл рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ CoreMark рдкрд░ "-ftree-loop-if-Convert" рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдореВрд▓ рд╕реЗрдЯ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ред

рдиреАрдЪреЗ GCC рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдкреЗрдХреНрд╖ рдЖрдзрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╢рд┐рдЦрд░ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп CoreMark рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИ:



рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд GCC 4.4.6 рдкрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдПрдХ рдореВрд▓ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде GCC рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдХрд▓рд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп CoreMark рдХреЛрдб рдХреЗ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЧреНрд░рд╛рдл рд╣реИ:



"-Ffunction-section -Wl, - рдЬреАрд╕реА-рд╕реЗрдХреНрд╢рди -fno-asynchronous-рдЦреЛрд▓-рдЯреЗрдмрд▓ -Wl, - рд╕реНрдЯреНрд░рд┐рдк-рдСрд▓" рдХреЛрдб рдЖрдХрд╛рд░ рдореЗрдВ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдФрд░ рд╢рд┐рдЦрд░ рд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗред рдпреЗ рд╡рд┐рдХрд▓реНрдк CoreMark рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рдЗрд╖реНрдЯрддрдо рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗред

рдЧреНрд░рд╛рдлрд╝ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЪрд░рдо рд╕реЗрдЯ рдкрд░ рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдЖрдзрд╛рд░ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ 2 рдЧреБрдирд╛ рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдмрдврд╝рдирд╛ рдЬрд╛рд░реА рд╣реИред рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдореВрд▓ рд╕реЗрдЯ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЛрдб рдЖрдХрд╛рд░ рдореЗрдВ рдереЛрдбрд╝реА рдХрдореА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

2-рдХреЛрд░ рдЗрдВрдЯреЗрд▓ рдПрдЯрдо рд╕реАрдкреАрдпреВ рдбреА 525 рдкрд░ 1 рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рд╕рднреА рдорд╛рдк рдХрд┐рдП рдЧрдП рдереЗ, 1.80 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдлреЗрдбреЛрд░рд╛ 17ред

GCC рдиреЗ рд╕рдВрд╕реНрдХрд░рдг 4.4 рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 4.8 (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 4.6 рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 4.7 рддрдХ рдФрд░ тАЬ-ftree-loop-if-ConvertтАЭ рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг 4.8 рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рд╕реЗрдЯ рддрдХ) рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдкреНрд░рдЧрддрд┐ рджрд┐рдЦрд╛рдИ рд╣реИред рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рд╕реЗрдЯ рдкрд░ рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИ, рдЪреЛрдЯреА рдХреЗ рд╕реЗрдЯ рдкрд░ рдпрд╣ рдмрдврд╝рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд GCC рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рддрдХ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рд╣реИ:


рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░, рдЬреАрд╕реАрд╕реА рд╕рдВрд╕реНрдХрд░рдг 4.8 рдореЗрдВ, "-march = atom" рдореЗрдВ рдХреЗрд╡рд▓ "-march = i686 -mtune = generic -mssse3" рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ ? CoreMark рдкрд░ рдкреНрд░рджрд░реНрд╢рди 5% рддрдХ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред "-рдлреНрдЯреНрд░реА-рд▓реВрдк-рдЗрдл-рдХрдиреНрд╡рд░реНрдЯ" рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдореВрд▓ рд╕реЗрдЯ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдПрдХ рдФрд░ 13% рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдПрдЯрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдХреЛрдб рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рджреЛрдиреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рддреЛ GCC рд╕рдВрд╕реНрдХрд░рдг 4.8 рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
"-O2 -рдлрд╛рд╕реНрдЯ-рдЧрдгрд┐рдд -mfpmath = sse -ftree-loop-if-convet -fschedule-insns -fsched-pressure -32 -march = atom"
рдпрджрд┐ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ GCC 4.8 рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╖реНрдЯрддрдо рд╣реИ:
"-Oft -fto -funroll-loops -mfpmath = sse -fschedule-insns -fsched-pressure -32 -mch = рдкрд░рдорд╛рдгреБ"

Source: https://habr.com/ru/post/In188386/


All Articles