IOS рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдЧреЗрдореНрд╕ рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред рдХреЛрдб рд╡реИрд╢реНрд╡реАрдХрд░рдг

рдЗрдЪреНрдЫрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓реЗрдЦреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрд╕рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ ARMv7 рд╕реАрдкреАрдпреВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 5 рдЬреАрдкреАрдпреВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рд╡рд╛рд▓реЗ рдЧреЗрдо рдкрд░ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдФрд░ рдЬреНрдЮрд╛рди рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЖрдИрдУрдПрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╕рднреА, рдпрд╛ рд▓рдЧрднрдЧ рд╕рднреА, рдЯрд┐рдкреНрд╕ рд╕рдорд╛рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, Android рдкрдврд╝рддреЗ рд╣реИрдВред рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдЦреЗрд▓реЛрдВ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдВрдЧ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдСрдбрд┐рдпреЛ, рд╡реАрдбрд┐рдпреЛ, рдЖрджрд┐ред рдореИрдВ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, IMHO, рдЕрдиреБрдХреВрд▓рди - NEON рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред

рдпрд╣ рд▓реЗрдЦ рд╕рдореНрдореЗрд▓рди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдЬреЛ 24.11 рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред IPhone рдЕрдиреБрдХреВрд▓рди рдпреБрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЦрдЬрд╛рдирд╛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдЗрд╕ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдЧрд╣рд░рд╛рдИ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдиреАрдпрди рдХреНрдпрд╛ рд╣реИ? NEON ARM рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓рд╛ SIMD рдЗрдВрдЬрди рд╣реИред рдмреЛрд░реНрдб рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 128 рдмрд┐рдЯреНрд╕ рдХреЗ 16 рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ 64 рдмрд┐рдЯреНрд╕ рдХреЗ 32 рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред NEON VFP рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рдЕрдкрдиреА рдЕрд▓рдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╣реИред рдПрд╕рдПрд╕рдИ рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛ рдХреЛ 16 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдпреЙрди рдХреЛ рдпрд╣ рднреА рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдпрд╣ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред

рдиреАрдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдпрд╣ рдЧреЗрдо рд╕рд╣рд┐рдд рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред

рдЖрдЗрдП рдореБрдЦреНрдп рдПрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ - рд╣рд░ рдЖрдзреБрдирд┐рдХ рдореЛрдмрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рджрд┐рд▓, рдПрдХ рдЪрд┐рдк рдпрд╛ SoC рдкрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо (рд╕рд┐рд╕реНрдЯрдо рдСрди рдЪрд┐рдк)ред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ iOS A рдбрд┐рд╡рд╛рдЗрд╕ рдЪрд┐рдк рдкрд░ Apple A рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд┐рд╕реНрдЯрдо - A4, A5, A5x, A6 рдФрд░ A6x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЪрд┐рдкреНрд╕ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рд╕реАрдкреАрдпреВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВрдП 4A5A5XрдП 6
рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ARMv7ARMv7ARMv7ARMv7
рдХреЛрд░рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдП 8рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдП 9рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдП 9рдЦреБрдж рдХрд╛ рд╡рд┐рдХрд╛рд╕
# рдХреЛрд░1222
рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА, рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ800100010001300
рд╡рд┐рд╕реНрддрд╛рд░VFPv3 (VFPLite), рдиреАрдпрдиVFPv3, рдиреАрдпрдиVFPv3, рдиреАрдпрдиVFPv4, рдиреАрдпрди
GPU рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ
рдЖрджрд░реНрд╢рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 535PowerVR SGX 543MP2рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 543 рдПрдордкреА 4рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 543 рдПрдордкреА 3
рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА, рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ200200200266
* рдиреЛрдЯ: рдиреАрдпрди рд╕реАрдкреАрдпреВ рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ

рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ GPU рдХреА рддреБрд▓рдирд╛ рдореЗрдВ NEON рдХреА рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ 5 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ! рдмреЗрд╢рдХ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ GPU - IPC, рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рдЖрджрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ 5 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рдорд┐рд▓реЗрдЧреАред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рд▓реЗрдХрд┐рди NEON рдореЗрдВ рдПрдХ рдлреАрдЪрд░ рдХрд┐рд▓рд░ рд╣реИ - рдпрд╣ рдПрдХ рд╕рд╛рде 4 32-рдмрд┐рдЯ рдлреНрд▓реЛрдЯреНрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ PowerVR SGX рдХреЗрд╡рд▓ рдПрдХ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ PowerVR SGX 5-рд╕реАрд░реАрдЬрд╝ рдХреЗ SIMD рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд▓рдВрдмрд╛рдИ 64 рдмрд┐рдЯреНрд╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ GPU рдПрдХ рд╕рд╛рде 4 рдЕрд░реНрдз-рд╕рдЯреАрдХ рдлрд╝реНрд▓реЛрдЯреНрд╕ (16 рдмрд┐рдЯреНрд╕) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

highp vec4 v1, v2; highp float s1, s2; //  v2 = (v1 * s1) * s2; //v1 * s1      тАУ 4 ,       s2,     -  4 . //8    //  v2 = v1 * (s1 * s2); //s1 * s2 тАУ 1    ;  * v1 тАУ 4   . //5    

рдЕрдм GPU рд╡реЗрдХреНрдЯрд░ рдЗрдВрдЬрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 mediump vec4 v1, v2, v3; highp vec4 s1, s2, s3; v3 = v1 * v2; //    тАУ 1  s3 = s1 * s2; //    тАУ 4  

рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд╛рдИ рд╕реНрдкреЗрд╕рд┐рдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ред рдиреАрдпрди рд╕реЗ рд▓рд╛рдн рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЕрдм рдЪрд▓рд┐рдП NEON рдХреЗ рдПрдХ рдФрд░ рд▓рд╛рдн рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред PowerVR SGX 5 рд╕реАрд░реАрдЬрд╝ рдХреЛ USSE рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдПрдХ shader рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ рдЬреЛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ shader рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рд╣реИ, рд╡рд░реНрдЯреЗрдХреНрд╕ рдпрд╛ рдкрд┐рдХреНрд╕реЗрд▓ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдЬрд▓реА рдмрдЬрдЯ рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рд╡рд╣ рдпрд╣ рддрдп рдХрд░реЗ рдХрд┐ рдЙрд╕реЗ рд╡рд░реНрд╕реЗрдЯреЗрдХреНрд╕ рдпрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░ рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдиреАрдпрди рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ - рдпрд╣ рдЖрдкрдХрд╛ рдирдпрд╛ рд╢реАрд░реНрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдЯреНрд░реЛрд▓рдлреЗрд╕ рдбрд╛рд▓рдирд╛ рднреВрд▓ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдмрд╣реБрдд рдЧрдВрднреАрд░ рд╣реИред рд▓рдЧрднрдЧ рд╣рд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдлрд┐рд▓ рджрд░ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИ, рд╡рд┐рд╢реЗрд╖рдХрд░ 2 рдбреА рдЧреЗрдореНрд╕ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдЖрдЬрдХрд▓ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП рджреМрдбрд╝ред рдиреАрдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдЖрдк рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, NEON рдбреНрд░реЙ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ - рд╡рд┐рд╢реНрд╡ рд╕рдордиреНрд╡рдп рдореЗрдВ рдПрдХ рдмреИрдЪ рдХреЗ рд╕рднреА рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдПрди рдХреЙрд▓ рдХреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдбреНрд░рд╛ рдХрд░реЗрдВред

рдереНрдпреЛрд░реА рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИ! рдЕрдм рдЪрд▓реЛ рдХрдЯреНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП! NEON рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:

рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рдбреЗрдореЛ рд▓рд┐рдЦрд╛ - 10,000 рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рд╕реНрдХреНрд░реАрди рдХреЗ рднреАрддрд░ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред рд▓рдХреНрд╖реНрдп рдиреНрдпреВрдирддрдо CPU рд▓реЛрдб рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рддреЗрдЬ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдЧреЗрдо рдореЗрдВ рдЖрдкрдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╣реБрдд рдХреБрдЫ рдЧрд┐рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╕рднреА рдбреЗрдЯрд╛ рдПрдХ VBO рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрджреНрдпрддрди рд╡рд┐рдзрд┐ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ ModelView рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреА рд╣реИред рдЕрдЧрд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рдкрд░рд┐рдгрд╛рдореА ModelViewProjection рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреА рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреЗрд╡рд▓ рд╢реАрд░реНрд╖ shader рдореЗрдВ gl_Position рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕рднреА рдбреЗрдЯрд╛ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕реАрдорд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рд╡рд┐рдзрд┐ рдЕрджреНрдпрддрди рдХреЛрдб:
 void Update() { GLKMatrix4 modelviewMat = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, }; const u32 QUADS_COUNT = 10000; const u32 VERTS_PER_QUAD = 4; const float Y_DELTA = 420.0f / QUADS_COUNT; //     Y float vertDelta = Y_DELTA; for (int i = 0; i < QUADS_COUNT * VERTS_PER_QUAD; i += VERTS_PER_QUAD) { float randX = random() % 260; //     modelviewMat.m[12] = randX; modelviewMat.m[13] = vertDelta; float32x4x4_t mvp; Matrix4ByMatrix4((float32x4x4_t*)proj.m, (float32x4x4_t*)modelviewMat.m, &mvp); for (int j = 0; j < 4; ++j) { Matrix4ByVec4(&mvp, &squareVertices[j], &data[i + j].pos); } vertDelta += Y_DELTA; } glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STREAM_DRAW); } 

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

рдХреЙрдкреА рдкреЗрд╕реНрдЯ GLKMath рдХреЗ рд╕рд╛рде:
 static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight) { float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft; float32x4_t v; iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]); iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]); iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]); iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]); iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]); iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]); v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]); return *(GLKVector4 *)&v; } static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) { float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; float32x4x4_t m; m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0)); m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0)); m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0)); m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0)); m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1)); m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1)); m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1)); m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1)); m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2)); m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2)); m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2)); m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2)); m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3)); m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3)); m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3)); m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3)); return *(GLKMatrix4 *)&m; } 
рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдРрдкреНрдкрд▓ рд╕реЗ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╖реНрдЯрддрдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмрд╣реБрдд рджреВрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдЪрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдЪрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ред рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдбрд┐рдмрдЧ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдХреЛрдбрд╛рдВрддрд░рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг:
 inline void Matrix4ByVec4(float32x4x4_t* __restrict__ mat, const float32x4_t* __restrict__ vec, float32x4_t* __restrict__ result) { asm ( "vldmia %0, { d24-d31 } \n\t" "vld1.32 {q1}, [%1]\n\t" "vmul.f32 q0, q12, d2[0]\n\t" "vmla.f32 q0, q13, d2[1]\n\t" "vmla.f32 q0, q14, d3[0]\n\t" "vmla.f32 q0, q15, d3[1]\n\t" "vstmia %2, { q0 }" : : "r" (mat), "r" (vec), "r" (result) : "memory", "q0", "q1", "q8", "q9", "q10", "q11" ); } inline void Matrix4ByMatrix4(const float32x4x4_t* __restrict__ m1, const float32x4x4_t* __restrict__ m2, float32x4x4_t* __restrict__ r) { asm ( "vldmia %1, { q0-q3 } \n\t" "vldmia %2, { q8-q11 }\n\t" "vmul.f32 q12, q8, d0[0]\n\t" "vmul.f32 q13, q8, d2[0]\n\t" "vmul.f32 q14, q8, d4[0]\n\t" "vmul.f32 q15, q8, d6[0]\n\t" "vmla.f32 q12, q9, d0[1]\n\t" "vmla.f32 q13, q9, d2[1]\n\t" "vmla.f32 q14, q9, d4[1]\n\t" "vmla.f32 q15, q9, d6[1]\n\t" "vmla.f32 q12, q10, d1[0]\n\t" "vmla.f32 q13, q10, d3[0]\n\t" "vmla.f32 q14, q10, d5[0]\n\t" "vmla.f32 q15, q10, d7[0]\n\t" "vmla.f32 q12, q11, d1[1]\n\t" "vmla.f32 q13, q11, d3[1]\n\t" "vmla.f32 q14, q11, d5[1]\n\t" "vmla.f32 q15, q11, d7[1]\n\t" "vstmia %0, { q12-q15 }" : : "r" (result), "r" (m2), "r" (m1) : "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" ); } 
рдХреЛрдбрд╛рдВрддрд░рдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдбрд░рд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ - рдореИрдВ рдЦреБрдж рдРрд╕рд╛ рд╣реВрдВ, рдореИрдВ рдХреЗрд╡рд▓ NEON рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - q1-q15 , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдиреАрдпрди рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВред vldmia \ vld1.32 - рдирд┐рд░реНрджреЗрд╢ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ; vstmia - рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рдг; vmul.f32 \ vmla.f32 - рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдЬреЛрдбрд╝реЗрдВред

рдЖрдВрддрд░рд┐рдХ рд╡рд┐рдзрд┐:
 inline void Matrix4ByVec4(float32x4x4_t* __restrict__ mat, const float32x4_t* __restrict__ vec, float32x4_t* __restrict__ result) { (*result) = vmulq_n_f32((*mat).val[0], (*vec)[0]); (*result) = vmlaq_n_f32((*result), (*mat).val[1], (*vec)[1]); (*result) = vmlaq_n_f32((*result), (*mat).val[2], (*vec)[2]); (*result) = vmlaq_n_f32((*result), (*mat).val[3], (*vec)[3]); } inline void Matrix4ByMatrix4(const float32x4x4_t* __restrict__ m1, const float32x4x4_t* __restrict__ m2, float32x4x4_t* __restrict__ r) { (*r).val[0] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[0], 0)); (*r).val[1] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[1], 0)); (*r).val[2] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[2], 0)); (*r).val[3] = vmulq_n_f32((*m1).val[0], vgetq_lane_f32((*m2).val[3], 0)); (*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[1], vgetq_lane_f32((*m2).val[0], 1)); (*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[1], vgetq_lane_f32((*m2).val[1], 1)); (*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[1], vgetq_lane_f32((*m2).val[2], 1)); (*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[1], vgetq_lane_f32((*m2).val[3], 1)); (*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[2], vgetq_lane_f32((*m2).val[0], 2)); (*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[2], vgetq_lane_f32((*m2).val[1], 2)); (*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[2], vgetq_lane_f32((*m2).val[2], 2)); (*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[2], vgetq_lane_f32((*m2).val[3], 2)); (*r).val[0] = vmlaq_n_f32((*r).val[0], (*m1).val[3], vgetq_lane_f32((*m2).val[0], 3)); (*r).val[1] = vmlaq_n_f32((*r).val[1], (*m1).val[3], vgetq_lane_f32((*m2).val[1], 3)); (*r).val[2] = vmlaq_n_f32((*r).val[2], (*m1).val[3], vgetq_lane_f32((*m2).val[2], 3)); (*r).val[3] = vmlaq_n_f32((*r).val[3], (*m1).val[3], vgetq_lane_f32((*m2).val[3], 3)); } 
GLKMath рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреЛрдб, рд▓реЗрдХрд┐рди рдорд╛рдореВрд▓реА рдЕрдВрддрд░ рд╣реИрдВред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: vmulq_n_f32 - рдПрдХ рд╕реНрдХреЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЧреБрдгрди; vgetq_lane_f32 - рдПрдХ рдореИрдХреНрд░реЛ рдЬреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рдПрдХ рд╕реНрдХреЗрд▓рд░ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ; vmlaq_n_f32 - рдПрдХ рд╕реНрдХреЗрд▓рд░ рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ рдФрд░ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдХреЛрдб рдЖрдВрддрд░рд┐рдХ рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣ рдЙрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЦреБрдж рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ iPod рдЯрдЪ 4 рдкрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрджреНрдпрддрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдкрд░реЗрдЦрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
рджреГрд╖реНрдЯрд┐рдХреЛрдгрдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп, рдПрдордПрд╕CPU рд▓реЛрдб,%
рдПрдлрдкреАрдпреВ6058 + 5067 *35-38
GLKMath278920-23
рдХреЛрдбрд╛рдВрддрд░рдХ530423-25
Intrinsiki280318-20
* рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреНрд╕ рд╕реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ , рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Matrix4ByMatrix4 рдлрд╝рдВрдХреНрд╢рди рдЗрдирдмрд┐рд▓реНрдб рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЯрд┐рдк рд╣реИ - рдЖрдХреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░реЗрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЗрдирд▓рд╛рдЗрди рдкрд░ __attribute __ ((always_inline)) рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред

рдЕрджреНрдпрддрди рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛:
рджреГрд╖реНрдЯрд┐рдХреЛрдгрдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп, рдПрдордПрд╕CPU рд▓реЛрдб,%
рдПрдлрдкреАрдпреВ рдиреЗ рдмрд▓ рджрд┐рдпрд╛620925-28
GLKMath278920-23
рдХреЛрдбрд╛рдВрддрд░рдХ530423-25
Intrinsiki280318-20
рдордЬрдмреВрд░ рдЗрдирд▓рд╛рдЗрди рдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛! рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рдХрд░рдг рдХреЛрдб рдЦреБрдж рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЕрдиреНрдп рд╕реА рдлреНрд▓реИрдЧ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ -mllvm тАУvectorize тАУmllvm -bb-рд╡реЗрдХреНрдЯрд░-рдПрд▓рд╛рдЗрдб-рдХреЗрд╡рд▓- рдЬреЛрдбрд╝реЗрдВред

рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЕрдВрддрд┐рдо рддрд╛рд▓рд┐рдХрд╛:
рджреГрд╖реНрдЯрд┐рдХреЛрдгрдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп, рдПрдордПрд╕рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (рд╡реЗрдХреНрдЯрд░), рдПрдордПрд╕CPU рд▓реЛрдб,%CPU рд▓реЛрдб (рд╡реЗрдХреНрдЯрд░),%
рдПрдлрдкреАрдпреВ рдиреЗ рдмрд▓ рджрд┐рдпрд╛6209502825-2822-24
GLKMath2789277620-2320-23
рдХреЛрдбрд╛рдВрддрд░рдХ5304529123-2522-24
Intrinsiki2803278918-2018-20

рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдлреА рдЕрдЬреАрдм рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ - рд▓рдЧрднрдЧ 2 рдмрд╛рд░! рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рд╕реВрдЪреА (рдЬреЛ рд▓реЛрдЧ рдЦреБрдж рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд╣реА рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рдЖрдВрддрд░рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдиреЗ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред рдзреАрдореА рдЧрддрд┐ рд╕реЗ, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, GLKMath рдХреЛрдб рдХрдВрдкрд╛рдЗрд▓рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рдЬрд┐рд╕рдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЖрдВрддрд░рд┐рдХ рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рджрд┐рдпрд╛ рдерд╛ред


рдЬрд╛рдпрдЬрд╛ рд▓реЗрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдХрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


рд╕рдВрджрд░реНрдн
www.arm.com/products/processors/technologies/neon.php
blogs.arm.com/software-enablement/161-coding-for-neon-part-1-load-and-stores
code.google.com/p/math-neon
llvm.org/devmtg/2012-04-12/Slides/Hal_Finkel.pdf
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ

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


All Articles