
рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ
рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдкрд░, рдмрд╣реБрдд рд╣реА рдЫреЛрдЯреЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдЧрддрд┐ (рдердХреНрдХреЛрдВ рдореЗрдВ рдереНрд░реВрдкреБрдЯ) рдХреЗ рдорд╛рдк рд╣реИрдВ - рдмрд╕ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ред рдорд╛рдк рддрдХрдиреАрдХ рдХреБрдЯрд┐рд▓ рдереА, рд▓реЗрдХрд┐рди рдкреНрд░рд╢рдВрд╕рдиреАрдп рдкрд░рд┐рдгрд╛рдо рджрд┐рдпрд╛ред рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА рдЧрд▓рдд рдереЗ - рдПрдХ рд╕рддрд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрд╢рд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдиреНрдпреВрдирддрдо рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдФрд░ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ "рдиреИрдиреЛрдмреЗрдирдорд╛рд░реНрдХрд┐рдВрдЧ" рдХреА рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореБрдЭреЗ рдорд┐рд▓рд╛ред рдкреНрд░рдпреЛрдЬреНрдпрддрд╛: рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдХреНрд╖рдорддрд╛ рдХреА рддреБрд▓рдирд╛, рдмрд╕ рдмреНрдпрд╛рдЬред
рдореИрдВ рдХреЗрд╡рд▓ рдЬреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рддреЗрдЬ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЕрдиреНрдп рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рд▓рд┐рдХ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВред
рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрд╛рдп
рдЖрд░рдбреАрдЯреАрд╕реАрдЯреА рдЯреАрдо рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕рд╣реА рд░реВрдк рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдУрдПрд╕ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдорд╛рдЗрдХреНрд░реЛрдорд░реНрдмрдореЗрдВрдЯреНрд╕ (рдШрдбрд╝реА рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рдЪрдХреНрд░) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рдЖрд░рдбреАрд╕реАрдЯреАрдПрд╕ рдЦреБрдж рдХреБрдЫ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдЪрдХреНрд░реЛрдВ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗрдЯ рдореЗрдВ рд╕реЗ рдПрдХред
Micromeasurements рдореЗрдВ рдЖрд░рдбреАрдЯреАрд╕реА рдХрд╛ рдПрдХрдорд╛рддреНрд░ рджреЛрд╖ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдШрдбрд╝реА рдХреА рдЧрддрд┐ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдордп рд╕реНрдЯреИрдВрдк рдХрд╛рдЙрдВрдЯрд░ рд╣рдореЗрд╢рд╛ рдорд╛рдирдХ рдЧреБрдгрдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдШрдбрд╝рд┐рдпреЛрдВ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИред рдПрдХ рдЧреБрдгрдХ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рдЕрдкрдиреЗ рдУрдПрд╕ рдирд╛рдо рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ "
рдЕрдХреНрд╖рдо рд╕реАрдкреАрдпреВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ " рджреЗрдЦреЗрдВред рдЧреНрдиреЛрдо рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди
indicator-cpufreq
рдПрдкрд▓реЗрдЯ рд╣реИред
рдорд╛рдкрдиреЗ рд╡рд╛рд▓реЗ рд╣рд╛рд░реНрдиреЗрд╕ рдореЗрдВ рддреАрди рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдВрддрд░рд┐рдХ рд▓реВрдк рдПрдХ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рднрд╛рд╡рдирд╛ рдореЗрдВ:
type input1[n]; type input2[n]; type output[n]; ... for (int i = 0; i < n; i++) { input1[i] input2[i] output[i] }
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдореЗрдВ "рдХреЛрдб рдХреЛ рдорд╛рдкреЗрдВ", "рдХреЛрдб" рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдмреНрд░реИрдХреЗрдЯ рдХреЗ рдмреАрдЪ рд▓реВрдк рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╛ рддреЛ рдЕрд╕реЗрдВрдмрд▓рд░ рдпрд╛ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЗ рдХреНрдпрд╛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
-fno-prefetch-loop-arrays
рд╕рд╛рде GCC рдХреА рдЙрдиреНрдорддреНрдд рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреБрд░рдВрдд рд╡рд┐рдХрд▓реНрдк
-fno-prefetch-loop-arrays
,
-fno-unroll-loops
,
-ftree-vectorizer-verbose=1
ред
-fno-tree-vectorize
-ftree-vectorize
рдпрд╛
-ftree-vectorize
- рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ - "рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ" рдпрд╛ рд▓реВрдк рдХреЗ рд╡реЗрдХреНрдЯрд░ рд╕рдВрд╕реНрдХрд░рдгред
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЗрдирдкреБрдЯ рдпрд╛ рдХреЛрдб рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдорд╛рдкрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддрдм рднреА рдЗрд╕реЗ рд▓реВрдк рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред рдХреЛрдб рдХреЛ
-fno-gcse
рдХрд░рдиреЗ рд╕реЗ GCC рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП,
-fno-gcse
(рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд╛рдорд╛рдиреНрдп
-fno-gcse
рдПрд▓рд┐рдорд┐рдиреЗрд╢рди),
-fno-tree-pta
(рдкреЙрдЗрдВрдЯреНрд╕-рдЯреВ рдПрдирд╛рд▓рд┐рд╕рд┐рд╕), рдФрд░
-fno-tree-pre
(рдЖрдВрд╢рд┐рдХ рдЕрддрд┐рд░реЗрдХ рдЙрдиреНрдореВрд▓рди) рд╕рдХреНрд╖рдо рдХрд░реЗрдВред
рд╕рднреА рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдк рджреЗрдЦреЗрдВред
32 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд▓реВрдк рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдВред
-falign-loops
(
-falign-loops
) рдХреЗ рд╕рд╛рде, рдЬреАрд╕реАрд╕реА рдЕрдкрдиреЗ рджрдо рдкрд░ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред
рдордзреНрдп рдЪрдХреНрд░ рдореЗрдВ 2 рдорд╛рдк рдЪрдХреНрд░ рдФрд░ рдмреАрдЪ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рдЖрдВрддрд░рд┐рдХ рдЪрдХреНрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреА рднреВрдорд┐рдХрд╛ рдиреНрдпреВрдирддрдо рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдЪрдХреНрд░ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 20-30 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреИрд╢ рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдЖрд░рдбреАрдЯреАрд╕реАрдЯреА рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рд╕рд┐рддрд╛рд░реЗ рдПрдХ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЕрдЧрд░ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ :-)
рдмрд╛рд╣рд░реА рд▓реВрдк рдЖрдВрддрд░рд┐рдХ рдХреА
рд▓рдВрдмрд╛рдИ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдордзреНрдп рд▓реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЛ рд░рдЦреЗрдВред
рдмрд╛рд╣рд░реА рдЪрдХреНрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдордзреНрдп рдЪрдХреНрд░ рдореЗрдВ рдкрд╣реБрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рд╕рдордп рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрдерд┐рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ - рдЖрдВрддрд░рд┐рдХ рдЪрдХреНрд░ рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╕рдордп + рд╕рдВрдХреНрд░рдордг рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдореЗрдВ 1 рддреНрд░реБрдЯрд┐ рдХреА рд▓рд╛рдЧрдд (рд╕рдмрд╕реЗ рдмреБрджреНрдзрд┐рдорд╛рди рдЗрдВрдЯреЗрд▓ рдХреЛрд░ рдХрдо рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рдордзреНрдп рдЪрдХреНрд░ рд╕реЗ рд╕рдордп рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рднреА рд╕рдм рдирд╣реАрдВ рд╣реИ! рдЖрдВрддрд░рд┐рдХ рдЫреЛрд░реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рдЕрдВрддрд░, 1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд▓рдВрдмрд╛рдИ рдореЗрдВ рдЕрдВрддрд░, рдЕрдХреНрд╕рд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдХрд╛рд░рдг рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдХрдиреНрд╡реЗрдпрд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкреНрд░рднрд╛рд╡ рд╣реИред рдРрд╕реЗ рд╕рдордп рдореЗрдВ, рдЬрдм рдХрд┐рд╕реА рд╕реНрддрд░ рдкрд░, рд╡рд┐рдЪрд╛рд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
- рд╕рд░рд▓, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд▓рд╛ рдЪрд░рдг рдЕрднреА рднреА рд╡реНрдпрд╕реНрдд рд╣реИ,
- рд╕рд░рд▓, рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдХрд╛ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреБрдЫ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд╕рдВрдХреНрд░рдордг рдкреВрд░реНрд╡рд╕реВрдЪрдХ рдФрд░ рдорд╛рдЗрдХреНрд░реЛ-рдСрдкрд░реЗрд╢рди рд╢реЗрдбреНрдпреВрд▓рд░ред рдпрд╣ рд╕рдм рдЬрдЯрд┐рд▓ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред
рдирддреАрдЬрддрди, 1 рд╕реЗ 10-15 (?) рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдПрдХ "рдкреИрдЯрд░реНрди" рдХрдиреНрд╡реЗрдпрд░ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо 1 рдРрд╕реЗ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдЯрд┐рдХреНрд╕ рдореЗрдВ рд╕рдЯреАрдХ рдереНрд░реВрдкреБрдЯ рдХреА рдЧрд┐рдирддреА рдХрд░реЗрдВ, рди рдХрд┐ 1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреИрдЯрд░реНрди рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рджреМрд░рд╛рди рднреА, рдкрд░рд┐рдгрд╛рдо рдмрд┐рдЦрд░реЗ рд░рд╣рддреЗ рд╣реИрдВред рд╕рдВрднрд╡рддрдГ рдЖрд░рдбреАрд╕реАрдЯреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд :-)рдЗрд╕рд▓рд┐рдП, рдЖрдВрддрд░рд┐рдХ рдЪрдХреНрд░реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрдВ рдЙрди рдЕрдВрддрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдкреИрдЯрд░реНрди рдХреЗ рдХрджрдо рдХреЗ рдЧреБрдгрдХ рд╣реИрдВ, рдпрд╣ рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
рдорд╛рдк рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ (рдмрд╛рдж рдореЗрдВ рдЙрдкрд╛рдпреЛрдВ рдореЗрдВ рд╕рднреА рдорд╛рди) рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд▓реЗрдЦ рд╕реЗ:
рд╕рддрд╣ рдХреА рд╡рд┐рдзрд┐ | 7.5 | 5.5 | 5.5 | 7 | 5 | 2 | 2.5 | 3.25 (?) - 3.5 |
рд╕реНрдорд╛рд░реНрдЯ рд╡рд┐рдзрд┐ | 7 | 6 | 6 | 7 | 5 | 2 | 2 | 3 |
рдЖрдЧреЗ рдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг 2 рдХреЛрд░ рдкрд░ рдХрд┐рдП рдЧрдП:
рдПрдПрдордбреА рдХреЗ 10 рдФрд░
рдЗрдВрдЯреЗрд▓ рдХреЛрд░ 2 рд╡реЛрд▓реНрдлрдбреЗрд▓ ред
рдФрдЬрд╛рд░реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рд╕реНрд╡рдпрдВ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЦрд╛рд▓реА рдкрд╛рд╢
рднреАрддрд░реА рд▓реВрдк рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
for (int i = 0; i < inner_len; i++) { asm volatile ( "" ); }
рдХреЗ 10 1.8 10 0.7
10 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд░ 2 10.0 ┬▒ 2.4ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ (10, 1.0) - (рдкреИрдЯрд░реНрди рдХреА рд▓рдВрдмрд╛рдИ, рдХреБрд▓ 1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдФрд╕рдд)
RDTSC
рдордзреНрдпрдо рдФрд░ рдЖрдВрддрд░рд┐рдХ рдЪрдХреНрд░ рдХреЗ рдмрд┐рдирд╛:
typedef unsigned long long ull; inline ull rdtsc() { unsigned int lo, hi; asm volatile ( "rdtsc\n" : "=a" (lo), "=d" (hi) ); return ((ull)hi << 32) | lo; } ... for (int i = 0; i < TOTAL_VALUES; i++) { ull t1 = rdtsc(); ull t2 = rdtsc(); printf("%lld\n", t2 - t1); }
рдХреЗ 10 69.7 ┬▒ 1.5
рдХреЛрд░ 2 31.0 ┬▒ 0.3
рдЕрдиреБрдорд╛рдирд┐рдд рд╕рд╛рдЗрди рдЧрдгрдирд╛
рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЯреЗрд▓рд░ 3 рдХреЗ рдЖрджреЗрд╢ рдХреЗ рдмрд╛рдж рд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдЖрдк рдХрд┐рддрдирд╛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВред Ang / 2 рд╕реЗ ╧А / 2 рдХреЗ рдХреЛрдг рдкрд░, 2 рджрд╢рдорд▓рд╡ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рдлреНрд░реЗрдо:
#include <cstdio> #include <cstdlib> #include <cmath> #include <limits> typedef unsigned long long ull; #define MIDDLE_LEN (20) #define TOTAL_VALUES (10000) #define VEC_LEN (1) // len in _numbers_ #define DATA_LEN (TOTAL_VALUES * VEC_LEN) inline ull rdtsc() { unsigned int lo, hi; asm volatile ( "rdtsc\n" : "=a" (lo), "=d" (hi) ); return ((ull)hi << 32) | lo; } typedef double my_float; #define BYTE_LEN (DATA_LEN * sizeof(my_float)) int main() { my_float *angles = (my_float *) malloc(BYTE_LEN); my_float *sines = (my_float *) malloc(BYTE_LEN); for (int inner_len = 0; inner_len < DATA_LEN; inner_len += VEC_LEN) { for (int i = 0; i < inner_len; i++) angles[i] ull inner_min = std::numeric_limits<ull>::max(); for (int mi = 0; mi < MIDDLE_LEN; mi++) { ull t1 = rdtsc(); for (int i = 0; i < inner_len; i += VEC_LEN) { angles[i] sines[i] } ull t = rdtsc() - t1; inner_min = t < inner_min ? t : inner_min; } // printf("%lld\n", inner_min); } }
FSIN рдирд┐рд░реНрджреЗрд╢ - рд╕рдЯреАрдХ рд╕рд╛рдЗрди
рдпрд╣ рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ
math.h
рд╕реЗ
sin
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрддреНрдкрдиреНрди рдорд╛рдЗрдХреНрд░реЛрдПрд░реЗ рд╢рд╛рдпрдж
рд╕рд╛рдЗрди рдХреЗ рдЗрд╕
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдорд┐рд▓рддрд╛ рдЬреБрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рднреА рдХреЛрдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рд╣реА рдХреЛрдг рдХреЗ рд╕рд╛рдЗрди рдХреЛ рд▓реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ рд╕рдЯреАрдХ рдереНрд░реВрдкреБрдЯ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЛрдг рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЛрдг рдкрд░ рдФрд╕рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреЛрдг | 0.0 | 0.0001 | ╧А / 2 | рдмрд┐рдирд╛ рд╕реЛрдЪреЗ рд╕рдордЭреЗ |
K10 | 30.2 .3 10.3 | 89.8 ┬▒ 2.9 | 143.1 (8.5 (2, 71.6) | 75.6 |
рдХреЛрд░ 2 | 40.0 .0 11.0 | 68.0 ┬▒ 5.6 | 88.0 .0 13.0 | 89.4 |
рддреГрддреАрдп рдХреНрд░рдо рдЯреЗрд▓рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛
K10 | 61.2 ┬▒ 15.6 (8, 7.7 ) |
рдХреЛрд░ 2 | 35.2 ┬▒ 16.8 (4, 8.8 ) |
рд╕рджрд┐рд╢ рдЯреЗрд▓рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛
рдмрд╕ GCC
-ftree-vectorize
рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рдФрд░ рдпрд╣рд╛рдБ
рд╡реЗрдХреНрдЯрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
#define VEC_LEN (2) typedef my_float float_vector __attribute__ ((vector_size (16))); ...
K10 | 41.8 .2 14.2 (5, 8.4, 4.2 рдкреНрд░рддрд┐ 1 рд╕рд╛рдЗрди) |
рдХреЛрд░ 2 | 44.3 .6 16.6 (5, 8.9, 4.5 ) |
рд╕реНрдХреЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ
1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрддрд┐ рдереЛрдбрд╝реА рдХрдо рд╣реИ, рдФрд░
1 рдХреЛрдг рдХреЗ рд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ 2 рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдХрдо рд╕реЗ рдХрдо 10 рдЧреБрдирд╛ рддреЗрдЬ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИредрд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
рдЕрдзрд┐рдХ рд▓рд┐рдВрдХ
рдкреБрдирд╢реНрдЪ
рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓
рдирд╣реАрдВ рдХрд░рддреА рд╣реИ ред рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рднреА
рдмреЗрд╣рдж рдХрдо рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рддреЛ рд╣рдореЗрд╢рд╛ рд╕рд╛рдорд╛рдиреНрдп рдШрдбрд╝реА () - рдкреНрд░рддрд┐ рдЪрдХреНрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред