рдЗрдЪреНрдЫрд╛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓реЗрдЦреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрд╕рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдореИрдВ ARMv7 рд╕реАрдкреАрдпреВ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдФрд░ рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 5 рдЬреАрдкреАрдпреВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рд╡рд╛рд▓реЗ рдЧреЗрдо рдкрд░ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдФрд░ рдЬреНрдЮрд╛рди рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЖрдИрдУрдПрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рд╕рднреА, рдпрд╛ рд▓рдЧрднрдЧ рд╕рднреА, рдЯрд┐рдкреНрд╕ рд╕рдорд╛рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, Android рдкрдврд╝рддреЗ рд╣реИрдВред рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХреЗрд╡рд▓ рдЦреЗрд▓реЛрдВ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдВрдЧ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдСрдбрд┐рдпреЛ, рд╡реАрдбрд┐рдпреЛ, рдЖрджрд┐ред рдореИрдВ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг, IMHO, рдЕрдиреБрдХреВрд▓рди -
NEON рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЗ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред
рдпрд╣ рд▓реЗрдЦ рд╕рдореНрдореЗрд▓рди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реБрд░реВ рд╣реБрдЖ, рдЬреЛ 24.11 рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред IPhone рдЕрдиреБрдХреВрд▓рди рдпреБрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЦрдЬрд╛рдирд╛
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдЗрд╕ рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдЧрд╣рд░рд╛рдИ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдиреАрдпрди рдХреНрдпрд╛ рд╣реИ? NEON ARM рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рд╡рд╛рд▓рд╛
SIMD рдЗрдВрдЬрди рд╣реИред рдмреЛрд░реНрдб рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ 128 рдмрд┐рдЯреНрд╕ рдХреЗ 16 рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ 64 рдмрд┐рдЯреНрд╕ рдХреЗ 32 рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред NEON VFP рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреА рдЕрдкрдиреА рдЕрд▓рдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╣реИред рдПрд╕рдПрд╕рдИ рдХреЗ рд╕рд╛рде, рдбреЗрдЯрд╛ рдХреЛ 16 рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рдпреЙрди рдХреЛ рдпрд╣ рднреА рдкрддрд╛ рд╣реИ рдХрд┐ рдмрд┐рдирд╛ рдбреЗрдЯрд╛ рдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдпрд╣ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИред
рдиреАрдпрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд \ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 8 \ 16 \ 32 \ 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░;
- рдПрдХрд▓ рд╕рдЯреАрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ - 32-рдмрд┐рдЯ рдлреНрд▓реЛрдЯред
рдпрд╣ рдЧреЗрдо рд╕рд╣рд┐рдд рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рдЖрдЗрдП рдореБрдЦреНрдп рдПрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ - рд╣рд░ рдЖрдзреБрдирд┐рдХ рдореЛрдмрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рджрд┐рд▓, рдПрдХ рдЪрд┐рдк рдпрд╛ SoC рдкрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо (рд╕рд┐рд╕реНрдЯрдо рдСрди рдЪрд┐рдк)ред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ iOS A рдбрд┐рд╡рд╛рдЗрд╕ рдЪрд┐рдк рдкрд░ Apple A рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд┐рд╕реНрдЯрдо - A4, A5, A5x, A6 рдФрд░ A6x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдЪрд┐рдкреНрд╕ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рд╕реАрдкреАрдпреВ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ | рдП 4 | A5 | A5X | рдП 6 |
---|
рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ | ARMv7 | ARMv7 | ARMv7 | ARMv7 |
рдХреЛрд░ | рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдП 8 | рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдП 9 | рдХреЛрд░реНрдЯреЗрдХреНрд╕ рдП 9 | рдЦреБрдж рдХрд╛ рд╡рд┐рдХрд╛рд╕ |
# рдХреЛрд░ | 1 | 2 | 2 | 2 |
рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА, рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ | 800 | 1000 | 1000 | 1300 |
рд╡рд┐рд╕реНрддрд╛рд░ | VFPv3 (VFPLite), рдиреАрдпрди | VFPv3, рдиреАрдпрди | VFPv3, рдиреАрдпрди | VFPv4, рдиреАрдпрди |
GPU рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ | | | | |
рдЖрджрд░реНрд╢ | рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 535 | PowerVR SGX 543MP2 | рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 543 рдПрдордкреА 4 | рдкрд╛рд╡рд░рд╡реАрдЖрд░ рдПрд╕рдЬреАрдПрдХреНрд╕ 543 рдПрдордкреА 3 |
рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА, рдореЗрдЧрд╛рд╣рд░реНрдЯреНрдЬ | 200 | 200 | 200 | 266 |
* рдиреЛрдЯ: рдиреАрдпрди рд╕реАрдкреАрдпреВ рдЖрд╡реГрддреНрддрд┐ рдкрд░ рдЪрд▓рддрд╛ рд╣реИрдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ 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;
рдЕрдм GPU рд╡реЗрдХреНрдЯрд░ рдЗрдВрдЬрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
mediump vec4 v1, v2, v3; highp vec4 s1, s2, s3; v3 = v1 * v2;
рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ
рд╣рд╛рдИ рд╕реНрдкреЗрд╕рд┐рдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ред рдиреАрдпрди рд╕реЗ рд▓рд╛рдн рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдЕрдм рдЪрд▓рд┐рдП NEON рдХреЗ рдПрдХ рдФрд░ рд▓рд╛рдн рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред PowerVR SGX 5 рд╕реАрд░реАрдЬрд╝ рдХреЛ
USSE рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдПрдХ shader рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИ рдЬреЛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ shader рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдирд╛ рд╣реИ, рд╡рд░реНрдЯреЗрдХреНрд╕ рдпрд╛ рдкрд┐рдХреНрд╕реЗрд▓ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдЬрд▓реА рдмрдЬрдЯ рд╣реИ рдФрд░ рдпрд╣ рдЙрд╕рдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рд╡рд╣ рдпрд╣ рддрдп рдХрд░реЗ рдХрд┐ рдЙрд╕реЗ рд╡рд░реНрд╕реЗрдЯреЗрдХреНрд╕ рдпрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░ рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдиреАрдпрди рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ - рдпрд╣ рдЖрдкрдХрд╛ рдирдпрд╛ рд╢реАрд░реНрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ рдЯреНрд░реЛрд▓рдлреЗрд╕ рдбрд╛рд▓рдирд╛ рднреВрд▓ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдмрд╣реБрдд рдЧрдВрднреАрд░ рд╣реИред рд▓рдЧрднрдЧ рд╣рд░ рдореЛрдмрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдлрд┐рд▓ рджрд░ рд╕реЗ рд╕реАрдорд┐рдд рд╣реИ, рд╡рд┐рд╢реЗрд╖рдХрд░ 2 рдбреА рдЧреЗрдореНрд╕ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖рдХрд░ рдЖрдЬрдХрд▓ рд╕реНрдХреНрд░реАрди рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП рджреМрдбрд╝ред рдиреАрдпрди рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛, рдЖрдк рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, NEON рдбреНрд░реЙ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ - рд╡рд┐рд╢реНрд╡ рд╕рдордиреНрд╡рдп рдореЗрдВ рдПрдХ рдмреИрдЪ рдХреЗ рд╕рднреА рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдПрди рдХреЙрд▓ рдХреЛ рдПрдХ рдХреЙрд▓ рдореЗрдВ рдбреНрд░рд╛ рдХрд░реЗрдВред
рдереНрдпреЛрд░реА рдЦрддреНрдо рд╣реЛ рдЧрдИ рд╣реИ! рдЕрдм рдЪрд▓реЛ рдХрдЯреНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП! NEON рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЛрдб рд╡реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреБрд░рд╛ рддрд░реАрдХрд╛ред рдХрдВрдкрд╛рдЗрд▓рд░ рд╡реЗрдХреНрдЯрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ... рдпрд╛ рдпрд╣ рд╡реЗрдХреНрдЯрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреЛрдб рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди, рджреВрд╕рд░реА рдУрд░, рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЖрдкрдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЖрдкрдХреЛ рд╕рдВрдХрд▓рдХ рдкрд░ рдЖрдВрдЦ рдмрдВрдж рдХрд░рдХреЗ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдХреЛ рд╡реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдиреАрдпрди рдХреЛрдбрдХред рдФрд░ рдпрд╣рд╛рдБ рд╡рд╣, рдХрдЯреНрдЯрд░ рд╣реИред рд╕рдЪреНрдЪреА рдЬреЗрдбреА рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдФрд░ рд╡рд╣ рд╕рдмред рд╣рдореЗрдВ рдбрд╛рд░реНрдХ рдореИрдЬрд┐рдХ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛, рдПрдЖрд░рдПрдо рдореИрдиреБрдЕрд▓ рдЖрджрд┐ рдкрд░ рд░рд╛рддреЗрдВ рдмрд┐рддрд╛рдиреА рд╣реЛрдВрдЧреАред рдпрд╣ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ ARM рдФрд░ Thumb-2 рдореЛрдб рдореЗрдВ NEON рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
- рдирд┐рдпреЛрди рдЖрдВрддрд░рд┐рдХ (x86 рдХреЗ рд▓рд┐рдП рдПрд╕рдПрд╕рдИ рдХреЗ рд╕рдорд╛рди)ред рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрд╣рд╛рдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХреНрдпрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЖрдВрддрд░рд┐рдХрддрд╛ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрдирдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ - рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╕рдордп рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдкрд╛рдЗрдк рдХреЗ рдард╣рд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлреЗрд░рдмрджрд▓ рдХрд░реЗрдВ, рдЖрджрд┐ред
- рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реЗрдХреНрдЯрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - GLKMath, рдЧрдгрд┐рдд рдирд┐рдпреЙрдиред
рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рдбреЗрдореЛ рд▓рд┐рдЦрд╛ - 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;
рдЦреИрд░, рдЕрдм рд╣рдо рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рд╛рд░ рдкрд░ рдЖрддреЗ рд╣реИрдВ - рдХреЛрдб рдХрд╛ рд╡реИрд╢реНрд╡реАрдХрд░рдгред рдЗрд╕рдХреЗ рдмрд╛рдж, рдХреЛрдб рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЦреЗрд▓ рджреЗрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рддреАрди рддреБрд▓рдирд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╡реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрд╛ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ред
рдХреЙрдкреА рдкреЗрд╕реНрдЯ 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 |
GLKMath | 2789 | 20-23 |
рдХреЛрдбрд╛рдВрддрд░рдХ | 5304 | 23-25 |
Intrinsiki | 2803 | 18-20 |
* рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреНрд╕ рд╕реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ , рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Matrix4ByMatrix4 рдлрд╝рдВрдХреНрд╢рди рдЗрдирдмрд┐рд▓реНрдб рдирд╣реАрдВ рд╣реИредрдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЯрд┐рдк рд╣реИ - рдЖрдХреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди-рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛрдб рдХреЛ рдЗрдирд▓рд╛рдЗрди рдХрд░реЗрдВред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ
рдЗрдирд▓рд╛рдЗрди рдкрд░
__attribute __ ((always_inline)) рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВред
рдЕрджреНрдпрддрди рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛:
рджреГрд╖реНрдЯрд┐рдХреЛрдг | рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп, рдПрдордПрд╕ | CPU рд▓реЛрдб,% |
---|
рдПрдлрдкреАрдпреВ рдиреЗ рдмрд▓ рджрд┐рдпрд╛ | 6209 | 25-28 |
GLKMath | 2789 | 20-23 |
рдХреЛрдбрд╛рдВрддрд░рдХ | 5304 | 23-25 |
Intrinsiki | 2803 | 18-20 |
рдордЬрдмреВрд░ рдЗрдирд▓рд╛рдЗрди рдиреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛! рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рдХрд░рдг рдХреЛрдб рдЦреБрдж рдХреЛ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдПрдЧрд╛ред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ
рдЕрдиреНрдп рд╕реА рдлреНрд▓реИрдЧ рдХреЗ рд▓рд┐рдП
рдХреЗрд╡рд▓ -mllvm тАУvectorize тАУmllvm -bb-рд╡реЗрдХреНрдЯрд░-рдПрд▓рд╛рдЗрдб-рдХреЗрд╡рд▓- рдЬреЛрдбрд╝реЗрдВред
рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЕрдВрддрд┐рдо рддрд╛рд▓рд┐рдХрд╛:
рджреГрд╖реНрдЯрд┐рдХреЛрдг | рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп, рдПрдордПрд╕ | рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп (рд╡реЗрдХреНрдЯрд░), рдПрдордПрд╕ | CPU рд▓реЛрдб,% | CPU рд▓реЛрдб (рд╡реЗрдХреНрдЯрд░),% |
---|
рдПрдлрдкреАрдпреВ рдиреЗ рдмрд▓ рджрд┐рдпрд╛ | 6209 | 5028 | 25-28 | 22-24 |
GLKMath | 2789 | 2776 | 20-23 | 20-23 |
рдХреЛрдбрд╛рдВрддрд░рдХ | 5304 | 5291 | 23-25 | 22-24 |
Intrinsiki | 2803 | 2789 | 18-20 | 18-20 |
рдХреЛрдбрд╛рдВрддрд░рдХ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдлреА рдЕрдЬреАрдм рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ - рд▓рдЧрднрдЧ 2 рдмрд╛рд░! рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреА рд╕реВрдЪреА (рдЬреЛ рд▓реЛрдЧ рдЦреБрдж рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд╣реА рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ред рдЖрдВрддрд░рд┐рдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдиреЗ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред рдзреАрдореА рдЧрддрд┐ рд╕реЗ, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, GLKMath рдХреЛрдб рдХрдВрдкрд╛рдЗрд▓рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рдЬрд┐рд╕рдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд┐рдд рдЖрдВрддрд░рд┐рдХ рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рджрд┐рдпрд╛ рдерд╛ред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкрд░рд┐рдгрд╛рдо рдЬрд╛рдпрдЬрд╛ рд▓реЗрдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред рдХрдИ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдПрд▓рдПрд▓рд╡реАрдПрдо рдореЗрдВ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред рдирддреАрдЬрддрди, рд╕рдВрдХрд▓рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдЖрдВрддрд░рд┐рдХ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдерд╛ рдЬрдм рдПрдХреНрд╕рдХреЛрдб рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреАрд╕реАрд╕реА 4.2 рдерд╛ рдФрд░ рдЗрд╕рдиреЗ рдПрдлрдкреАрдпреВ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ 10-15% рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ - рдХреЛрдбрд╛рдВрддрд░рдХ рд╕реАрдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдЦреБрд╢ рд╣реВрдВ!
- рдХреНрд▓реИрдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдЯреЛ-рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝ рдХреЛрдб рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рд┐рд░реНрдл 4 рд╢рдмреНрдж рд▓рд┐рдЦрдХрд░ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдмреЛрдирд╕ рд╣реИред рдореИрдВ рдФрд░ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ?
- рдирд┐рдпреЙрди рдХреЛрдб рдирд┐рдпрдорд┐рдд рд╕реА рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИ - 2.22 рдмрд╛рд░! рдЕрдиреБрдХреВрд▓рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, GPU рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЗрди рдмрд╣реБрдд рд╡рд░реНрдЯреАрдХрд▓реНрд╕ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рддреЗрдЬрд╝ рд╣реЛ рдЧрдпрд╛ рд╣реИ! рдпрджрд┐ рдЖрдк рдореЗрдореНрдЪреА рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ NEON рдХреЛрдб рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрд░реНрдЯреЗрдХреНрд╕ рдП 8 рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдШреБрди рдХреА рдХрдореА рдзреАрдореА рдХреЛрдб рдХрд╛ рдХрд╛рд░рдг рд▓рдЧрддреА рд╣реИред
- рдЗрди рд╕рднреА рдирд┐рдореНрди рд╕реНрддрд░реАрдп рдЪреАрдЬреЛрдВ рдХреЛ рд╕реАрдЦрдирд╛ рд╕рдордп рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХрд╛ рд▓рдХреНрд╖реНрдп рдкреЗрд╢реЗрд╡рд░ рдмрдирдирд╛ рд╣реИред
рд╕рдВрджрд░реНрдн
www.arm.com/products/processors/technologies/neon.phpblogs.arm.com/software-enablement/161-coding-for-neon-part-1-load-and-storescode.google.com/p/math-neonllvm.org/devmtg/2012-04-12/Slides/Hal_Finkel.pdfрдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ