рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рдХреЛрдб рдорд╛рдк


рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдВ рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдкрд░, рдмрд╣реБрдд рд╣реА рдЫреЛрдЯреЗ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдЧрддрд┐ (рдердХреНрдХреЛрдВ рдореЗрдВ рдереНрд░реВрдкреБрдЯ) рдХреЗ рдорд╛рдк рд╣реИрдВ - рдмрд╕ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢ред рдорд╛рдк рддрдХрдиреАрдХ рдХреБрдЯрд┐рд▓ рдереА, рд▓реЗрдХрд┐рди рдкреНрд░рд╢рдВрд╕рдиреАрдп рдкрд░рд┐рдгрд╛рдо рджрд┐рдпрд╛ред рдлрд┐рд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА рдЧрд▓рдд рдереЗ - рдПрдХ рд╕рддрд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрд╢рд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдиреНрдпреВрдирддрдо рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдФрд░ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ "рдиреИрдиреЛрдмреЗрдирдорд╛рд░реНрдХрд┐рдВрдЧ" рдХреА рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рдЬреЛ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореБрдЭреЗ рдорд┐рд▓рд╛ред рдкреНрд░рдпреЛрдЬреНрдпрддрд╛: рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдХреНрд╖рдорддрд╛ рдХреА рддреБрд▓рдирд╛, рдмрд╕ рдмреНрдпрд╛рдЬред

рдореИрдВ рдХреЗрд╡рд▓ рдЬреАрд╕реАрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рддрджрдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рддреЗрдЬ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЕрдиреНрдп рд╕рдВрдХрд▓рдХ рдХреЗ рдорд╛рд▓рд┐рдХ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВред


рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрд╛рдп рдЖрд░рдбреАрдЯреАрд╕реАрдЯреА рдЯреАрдо рд╣реИред рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕рд╣реА рд░реВрдк рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдУрдПрд╕ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдорд╛рдЗрдХреНрд░реЛрдорд░реНрдмрдореЗрдВрдЯреНрд╕ (рдШрдбрд╝реА рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рдЪрдХреНрд░) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рдЖрд░рдбреАрд╕реАрдЯреАрдПрд╕ рдЦреБрдж рдХреБрдЫ рджрд░реНрдЬрди рд╕реЗ рдЕрдзрд┐рдХ рдЪрдХреНрд░реЛрдВ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗрдЯ рдореЗрдВ рд╕реЗ рдПрдХред

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.55.55.57522.53.25 (?) - 3.5
рд╕реНрдорд╛рд░реНрдЯ рд╡рд┐рдзрд┐76675223

рдЖрдЧреЗ рдХреЗ рд╕рднреА рдкрд░реАрдХреНрд╖рдг 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 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрддреНрдкрдиреНрди рдорд╛рдЗрдХреНрд░реЛрдПрд░реЗ рд╢рд╛рдпрдж рд╕рд╛рдЗрди рдХреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдорд┐рд▓рддрд╛ рдЬреБрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рднреА рдХреЛрдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рд╣реА рдХреЛрдг рдХреЗ рд╕рд╛рдЗрди рдХреЛ рд▓реВрдк рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ рд╕рдЯреАрдХ рдереНрд░реВрдкреБрдЯ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЛрдг рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреЛрдг рдкрд░ рдФрд╕рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

 //  my_float randoms[DATA_LEN]; for (int i = 0; i < DATA_LEN; i++) randoms[i] = rand() / 2.0 / RAND_MAX * M_PI; //   angles[i] = 0.0  0.0001  M_PI * 0.5  randoms[i]; //   asm volatile ( "fldl (%0)\n\t" "fsin\n\t" "fstpl (%1)\n\t" :: "r" (angles + i), "r" (sines + i) ); 
рдХреЛрдг0.00.0001╧А / 2рдмрд┐рдирд╛ рд╕реЛрдЪреЗ рд╕рдордЭреЗ
K1030.2 .3 10.389.8 ┬▒ 2.9143.1 (8.5 (2, 71.6)75.6
рдХреЛрд░ 240.0 .0 11.068.0 ┬▒ 5.688.0 .0 13.089.4


рддреГрддреАрдп рдХреНрд░рдо рдЯреЗрд▓рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛
 //  my_float d6 = 1.0 / 6.0; my_float d120 = 1.0 / 120.0; my_float randoms[DATA_LEN]; for (int i = 0; i < DATA_LEN; i++) randoms[i] = rand() / 2.0 / RAND_MAX * M_PI; //   angles[i] = randoms[i]; //   my_float x = angles[i]; sines[i] = x - x*x*x*d6 + x*x*x*x*x*d120; 
K1061.2 ┬▒ 15.6 (8, 7.7 )
рдХреЛрд░ 235.2 ┬▒ 16.8 (4, 8.8 )

рд╕рджрд┐рд╢ рдЯреЗрд▓рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛
рдмрд╕ GCC -ftree-vectorize рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рдФрд░ рдпрд╣рд╛рдБ рд╡реЗрдХреНрдЯрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
 #define VEC_LEN (2) typedef my_float float_vector __attribute__ ((vector_size (16))); ... //  float_vector d6_v = {1.0 / 6.0, 1.0 / 6.0}; float_vector d120_v = {1.0 / 120.0, 1.0 / 120.0}; my_float randoms[DATA_LEN]; for (int i = 0; i < DATA_LEN; i++) randoms[i] = rand() / 2.0 / RAND_MAX * M_PI; //   angles[i] = randoms[i]; //   float_vector x = *((float_vector *)(angles + i)); *((float_vector *)(sines + i)) = x - x*x*x*d6_v + x*x*x*x*x*d120_v; 
K1041.8 .2 14.2 (5, 8.4, 4.2 рдкреНрд░рддрд┐ 1 рд╕рд╛рдЗрди)
рдХреЛрд░ 244.3 .6 16.6 (5, 8.9, 4.5 )
рд╕реНрдХреЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрддрд┐ рдереЛрдбрд╝реА рдХрдо рд╣реИ, рдФрд░ 1 рдХреЛрдг рдХреЗ рд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИред

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ 2 рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдХрдо рд╕реЗ рдХрдо 10 рдЧреБрдирд╛ рддреЗрдЬ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред


рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ


рдЕрдзрд┐рдХ рд▓рд┐рдВрдХ


рдкреБрдирд╢реНрдЪ

рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ ред рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рднреА рдмреЗрд╣рдж рдХрдо рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИ, рддреЛ рд╣рдореЗрд╢рд╛ рд╕рд╛рдорд╛рдиреНрдп рдШрдбрд╝реА () - рдкреНрд░рддрд┐ рдЪрдХреНрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

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


All Articles