{"id":156809,"date":"2012-10-31T12:19:04","date_gmt":"2012-10-31T08:19:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=156809"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=156809","title":{"rendered":"<span class=\"post_title\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0433\u0440 \u043f\u043e\u0434 iOS \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0414\u0430\u0432\u043d\u043e \u043d\u0430\u0437\u0440\u0435\u0432\u0430\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0441\u043c\u043e\u0433\u0443 \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u0442\u0435\u043c\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440 \u043f\u043e\u0434 ARMv7 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 CPU \u0438 PowerVR SGX 5 \u0441\u0435\u0440\u0438\u044e GPU, \u0447\u0438\u0442\u0430\u0439 iOS \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u041d\u043e \u0432\u0441\u0435, \u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435, \u0441\u043e\u0432\u0435\u0442\u044b \u0432 \u0440\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0442\u0435\u043c \u0436\u0435 \u0436\u0435\u043b\u0435\u0437\u043e\u043c, \u0447\u0438\u0442\u0430\u0439 \u0410\u043d\u0434\u0440\u043e\u0438\u0434\u044b. \u041d\u0430\u0447\u043d\u0443 \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e\u0439, \u0418\u041c\u0425\u041e, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2013 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 <b>NEON<\/b>.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 NEON? NEON \u2013 \u044d\u0442\u043e <abbr title=\"Single Instruction Multiple Data\">SIMD<\/abbr> \u0434\u0432\u0438\u0436\u043e\u043a \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 ARM \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445. \u041d\u0430 \u0431\u043e\u0440\u0442\u0443 \u0438\u043c\u0435\u0435\u0442 16 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043f\u043e 128 \u0431\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a 32 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043f\u043e 64 \u0431\u0438\u0442\u0430. NEON \u0434\u0435\u043b\u0438\u0442 \u0441\u0432\u043e\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0441 VFP, \u0445\u043e\u0442\u044f \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u041a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 SSE \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b \u043d\u0430 16 \u0431\u0430\u0439\u0442. NEON \u0442\u0430\u043a \u0436\u0435 \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435.<\/p>\n<p>  NEON \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441:  <\/p>\n<ul>\n<li>\u0417\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438\\\u0431\u0435\u0437 \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 8\\16\\32\\64-\u0431\u0438\u0442\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>\u0427\u0438\u0441\u043b\u0430\u043c\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u2013 32-\u0445 \u0431\u0438\u0442\u043d\u044b\u0439 float. <\/li>\n<\/ul>\n<p>  \u041e\u043d \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0439\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0438\u0433\u0440.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u2013 \u0441\u0435\u0440\u0434\u0446\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 \u0447\u0438\u043f\u0435 \u0438\u043b\u0438 SoC (System on Chip). \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0432 iOS \u0434\u0435\u0432\u0430\u0439\u0441\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Apple A \u0441\u0435\u0440\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c \u043d\u0430 \u0447\u0438\u043f\u0435 \u2013 \u04104, \u04105, \u04105\u0445, \u04106 \u0438 \u04106\u0445. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u0447\u0438\u043f\u043e\u0432 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435:  <\/p>\n<table>\n<tr>\n<th><i>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 CPU<\/i><\/th>\n<th>A4<\/th>\n<th>A5<\/th>\n<th>A5x<\/th>\n<th>A6<\/th>\n<\/tr>\n<tr>\n<td>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/td>\n<td>ARMv7<\/td>\n<td>ARMv7<\/td>\n<td>ARMv7<\/td>\n<td>ARMv7<\/td>\n<\/tr>\n<tr>\n<td>\u042f\u0434\u0440\u043e<\/td>\n<td>Cortex A8<\/td>\n<td>Cortex A9<\/td>\n<td>Cortex A9<\/td>\n<td>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/td>\n<\/tr>\n<tr>\n<td># \u044f\u0434\u0435\u0440<\/td>\n<td>1<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>\u0427\u0430\u0441\u0442\u043e\u0442\u0430, \u041c\u0413\u0446<\/td>\n<td>800<\/td>\n<td>1000<\/td>\n<td>1000<\/td>\n<td>1300<\/td>\n<\/tr>\n<tr>\n<td>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f<\/td>\n<td>VFPv3 (VFPLite), NEON<\/td>\n<td>VFPv3, NEON<\/td>\n<td>VFPv3, NEON<\/td>\n<td>VFPv4, NEON<\/td>\n<\/tr>\n<tr>\n<td><i>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 GPU<\/i><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td>\u041c\u043e\u0434\u0435\u043b\u044c<\/td>\n<td>PowerVR SGX 535<\/td>\n<td>PowerVR SGX 543MP2<\/td>\n<td>PowerVR SGX 543MP4<\/td>\n<td>PowerVR SGX 543MP3<\/td>\n<\/tr>\n<tr>\n<td>\u0427\u0430\u0441\u0442\u043e\u0442\u0430, \u041c\u0413\u0446<\/td>\n<td>200 <\/td>\n<td>200 <\/td>\n<td>200 <\/td>\n<td>266<\/td>\n<\/tr>\n<\/table>\n<p><i>*\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043a\u0430\u0436\u0434\u043e\u0435 \u044f\u0434\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441\u043d\u0430\u0431\u0436\u0435\u043d\u043e \u0441\u0432\u043e\u0438\u043c NEON \u044e\u043d\u0438\u0442\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0436\u0435 VFP \u2014 \u043e\u0434\u0438\u043d \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440.<br \/>  ** \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435: NEON \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 CPU<\/i><\/p>\n<p>  \u041b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e NEON \u0438\u043c\u0435\u0435\u0442 5-\u0442\u0438 \u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 GPU! \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c 5-\u0442\u0438 \u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 GPU \u2013 IPC, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d, \u0442.\u0434. \u0438\u043c\u0435\u044e\u0442 \u0432\u0435\u0441\u043e\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u043e \u0443 NEON\u2019\u0430 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043a\u0438\u043b\u043b\u0435\u0440 \u0444\u0438\u0447\u0430 \u2013 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 4 32-\u0445 \u0431\u0438\u0442\u043d\u044b\u0445 \u0444\u043b\u043e\u0430\u0442\u0430, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a PowerVR SGX \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0443 PowerVR SGX 5-\u0439 \u0441\u0435\u0440\u0438\u0438 SIMD \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0434\u043b\u0438\u043d\u0443 \u0432 64 \u0431\u0438\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a GPU \u043c\u043e\u0436\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 4 \u0444\u043b\u043e\u0430\u0442\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 (16 \u0431\u0438\u0442). \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">highp vec4 v1, v2;  highp float s1, s2;   \/\/ \u041f\u043b\u043e\u0445\u043e  v2 = (v1 * s1) * s2; \/\/v1 * s1 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u2013 4 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u043e\u0433\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d \u043d\u0430 s2, \u043e\u043f\u044f\u0442\u044c \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 - \u0435\u0449\u0435 4 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \/\/8 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043e\u0431\u0449\u0435\u043c  \/\/ \u0425\u043e\u0440\u043e\u0448\u043e  v2 = v1 * (s1 * s2); \/\/s1 * s2 \u2013 1 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435; \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 * v1 \u2013 4 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u043c. \/\/5 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043e\u0431\u0449\u0435\u043c <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 GPU:  <\/p>\n<pre><code class=\"cpp\">mediump vec4 v1, v2, v3;  highp vec4 s1, s2, s3;  v3 = v1 * v2; \/\/\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u2013 1 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f s3 = s1 * s2; \/\/\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u2013 4 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <\/code><\/pre>\n<p>  \u0412\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <b>highp<\/b> \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u0430\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d. \u041f\u0440\u043e\u0444\u0438\u0442 \u043e\u0442 NEON\u2019\u0430 \u0437\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0443 NEON\u2019\u0430. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e PowerVR SGX 5-\u0439 \u0441\u0435\u0440\u0438\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 <abbr title=\"Universal Scalable Shader Engine\">USSE<\/abbr>, \u0448\u0435\u0439\u0434\u0435\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0435\u0437 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u2013 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0431\u044e\u0434\u0436\u0435\u0442 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438 \u0435\u043c\u0443 \u0440\u0435\u0448\u0430\u0442\u044c, \u043d\u0430 \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u2013 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433. \u0412\u043e\u0442 \u0442\u0443\u0442-\u0442\u043e \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c NEON \u2013 \u044d\u0442\u043e \u0432\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044f \u0437\u0430\u0431\u044b\u043b \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0440\u043e\u043b\u043b\u0444\u0435\u0439\u0441, \u043d\u043e \u0432\u0441\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0444\u0438\u043b\u043b\u0440\u0435\u0439\u0442\u043e\u043c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 2D \u0438\u0433\u0440\u0430\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432 \u043d\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u0433\u043e\u043d\u043a\u0438 \u0437\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u044d\u043a\u0440\u0430\u043d\u043e\u0432. \u041f\u0435\u0440\u0435\u043d\u0435\u0441\u044f \u0432\u0435\u0441\u044c \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043d\u0430 NEON \u0443 \u0432\u0430\u0441 \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0430. \u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 NEON \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043d\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u2013 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0430\u0442\u0447\u0430 \u0432 \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 \u0438 \u043d\u0430\u0440\u0438\u0441\u0443\u0439\u0442\u0435 N \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u043e\u0434\u0438\u043d \u0432\u044b\u0437\u043e\u0432.<\/p>\n<p>  \u0421 \u0442\u0435\u043e\u0440\u0438\u0435\u0439 \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0445\u0430\u0440\u0434\u043a\u043e\u0440\u0443! \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 NEON\u2019a:  <\/p>\n<ul>\n<li>\u041f\u0443\u0441\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0430\u0441. \u041f\u043b\u043e\u0445\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u2026 \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434, \u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u041d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0441 \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0430 \u043f\u0440\u043e\u0444\u0438\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e. \u041d\u043e \u0432\u0441\u0435 \u0436\u0435 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u0435\u043f\u043e \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0430 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434.<\/li>\n<li>NEON \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440. \u0410 \u0432\u043e\u0442 \u0438 \u043e\u043d, \u0445\u0430\u0440\u0434\u043a\u043e\u0440. \u041f\u0443\u0442\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u0434\u0436\u0435\u0434\u0430\u044f \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0443\u0447\u0438\u0442\u044c \u0442\u0435\u043c\u043d\u0443\u044e \u043c\u0430\u0433\u0438\u044e, \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u043e\u0447\u0438 \u0437\u0430 \u043c\u0430\u043d\u0443\u0430\u043b\u0430\u043c\u0438 \u043e\u0442 ARM \u0438 \u0442.\u0434. \u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0438\u043c\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0443, \u0447\u0442\u043e NEON \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0431\u043e\u0438\u0445 ARM \u0438 Thumb-2 \u0440\u0435\u0436\u0438\u043c\u0430\u0445.<\/li>\n<li>NEON \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438 (\u0442\u0430\u043a\u0438\u0435 \u0436\u0435 \u043a\u0430\u043a SSE \u0434\u043b\u044f x86). \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430, \u0433\u0434\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0443\u043f\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u043e, \u0447\u0442\u043e \u0435\u043c\u0443 \u0434\u0430\u043b\u0438, \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b. \u0421 \u043d\u0438\u043c\u0438 \u0436\u0438\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435 \u2013 \u043d\u0435\u0442\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0445, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u0441\u0442\u043e\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u0442.\u0434.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u044b \u0441 \u0443\u0436\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u2013 GLKMath, math neon.<\/li>\n<\/ul>\n<p>  \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u043e\u0435 \u0434\u0435\u043c\u043e \u2013 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 10000 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u044d\u043a\u0440\u0430\u043d\u0430. \u0426\u0435\u043b\u044c \u2013 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043a\u043e\u0434 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043d\u0430 CPU \u2013 \u0432\u0435\u0434\u044c \u0432 \u0438\u0433\u0440\u0430\u0445 \u043d\u0430\u0434\u043e \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u043e\u043c\u0438\u043c\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430.<\/p>\n<p>  \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c VBO. \u041c\u0435\u0442\u043e\u0434 Update \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0430\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 ModelView \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. \u0414\u0430\u043b\u0435\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0440\u0448\u0438\u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0443\u044e ModelViewProjection \u043c\u0430\u0442\u0440\u0438\u0446\u0443. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0448\u0438\u043d\u044b \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0432 gl_Position \u0432 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u043e\u043c \u0448\u0435\u0439\u0434\u0435\u0440\u0435. \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0435\u043d\u044b \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 16 \u0431\u0430\u0439\u0442.<\/p>\n<p>  \u041a\u043e\u0434 Update \u043c\u0435\u0442\u043e\u0434\u0430:  <\/p>\n<pre><code class=\"cpp\">void Update() {     GLKMatrix4 modelviewMat =     { \t1, 0, 0, 0, \t0, 1, 0, 0, \t0, 0, 1, 0, \t0, 0, 0, 1,     };     const u32 QUADS_COUNT = 10000;     const u32 VERTS_PER_QUAD = 4;     const float Y_DELTA = 420.0f \/ QUADS_COUNT;\t\/\/\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u043f\u043e Y     float vertDelta = Y_DELTA;          for (int i = 0; i &lt; QUADS_COUNT * VERTS_PER_QUAD; i += VERTS_PER_QUAD)     {         float randX = random() % 260;\t\/\/\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e                  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 &lt; 4; ++j) {             Matrix4ByVec4(&mvp, &squareVertices[j], &data[i + j].pos);         }                  vertDelta += Y_DELTA;     } \t     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);     glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STREAM_DRAW); } <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0436, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0441\u0443\u0442\u0438 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430. \u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u0442\u0440\u0435\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445 \u0434\u043b\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0433\u0435\u0439\u043c\u0434\u0435\u0432\u0435 \u2013 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440 \u0438 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443.<br \/>  \u2003<br \/>  \u041a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430 \u0441 GLKMath:  <\/p>\n<pre><code class=\"cpp\">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; } <\/code><\/pre>\n<p>\u041b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0442 Apple \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2013 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0432 \u0434\u0435\u0431\u0430\u0433 \u0441\u0431\u043e\u0440\u043a\u0435 \u043e\u043d\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0432\u044b\u043c. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0441\u0435\u0431\u044f \u043f\u0440\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u043b\u0438\u0440\u043e\u0432\u043a\u0435.<br \/>  \u2003<br \/>  \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434:  <\/p>\n<pre><code class=\"cpp\">inline void Matrix4ByVec4(float32x4x4_t* __restrict__ mat, const float32x4_t* __restrict__ vec, float32x4_t* __restrict__ result) {     asm     (      &quot;vldmia %0, { d24-d31 } \\n\\t&quot;      &quot;vld1.32    {q1}, [%1]\\n\\t&quot;            &quot;vmul.f32 q0, q12, d2[0]\\n\\t&quot;            &quot;vmla.f32 q0, q13, d2[1]\\n\\t&quot;      &quot;vmla.f32 q0, q14, d3[0]\\n\\t&quot;      &quot;vmla.f32 q0, q15, d3[1]\\n\\t&quot;            &quot;vstmia %2, { q0 }&quot;            :      : &quot;r&quot; (mat), &quot;r&quot; (vec), &quot;r&quot; (result)      : &quot;memory&quot;, &quot;q0&quot;, &quot;q1&quot;, &quot;q8&quot;, &quot;q9&quot;, &quot;q10&quot;, &quot;q11&quot;      ); }  inline void Matrix4ByMatrix4(const float32x4x4_t* __restrict__ m1, const float32x4x4_t* __restrict__ m2, float32x4x4_t* __restrict__ r) {     asm      (      &quot;vldmia %1, { q0-q3 } \\n\\t&quot;      &quot;vldmia %2, { q8-q11 }\\n\\t&quot;            &quot;vmul.f32 q12, q8, d0[0]\\n\\t&quot;      &quot;vmul.f32 q13, q8, d2[0]\\n\\t&quot;      &quot;vmul.f32 q14, q8, d4[0]\\n\\t&quot;      &quot;vmul.f32 q15, q8, d6[0]\\n\\t&quot;            &quot;vmla.f32 q12, q9, d0[1]\\n\\t&quot;      &quot;vmla.f32 q13, q9, d2[1]\\n\\t&quot;      &quot;vmla.f32 q14, q9, d4[1]\\n\\t&quot;      &quot;vmla.f32 q15, q9, d6[1]\\n\\t&quot;            &quot;vmla.f32 q12, q10, d1[0]\\n\\t&quot;      &quot;vmla.f32 q13, q10, d3[0]\\n\\t&quot;      &quot;vmla.f32 q14, q10, d5[0]\\n\\t&quot;      &quot;vmla.f32 q15, q10, d7[0]\\n\\t&quot;            &quot;vmla.f32 q12, q11, d1[1]\\n\\t&quot;      &quot;vmla.f32 q13, q11, d3[1]\\n\\t&quot;      &quot;vmla.f32 q14, q11, d5[1]\\n\\t&quot;      &quot;vmla.f32 q15, q11, d7[1]\\n\\t&quot;            &quot;vstmia %0, { q12-q15 }&quot;      :      : &quot;r&quot; (result), &quot;r&quot; (m2), &quot;r&quot; (m1)      : &quot;memory&quot;, &quot;q0&quot;, &quot;q1&quot;, &quot;q2&quot;, &quot;q3&quot;, &quot;q8&quot;, &quot;q9&quot;, &quot;q10&quot;, &quot;q11&quot;, &quot;q12&quot;, &quot;q13&quot;, &quot;q14&quot;, &quot;q15&quot;      ); } <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u0432\u0441\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u043c \u2013 \u044f \u0441\u0430\u043c \u0442\u0430\u043a\u043e\u0439, \u043c\u043e\u0433\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 NEON \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435. \u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u2013 <i>q1-q15<\/i> \u044d\u0442\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, NEON \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. <b>vldmia\\vld1.32<\/b> \u2013 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438; <b>vstmia<\/b> \u2013 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c;<b> vmul.f32\\vmla.f32<\/b> \u2014 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c\\\u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c.<\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432:  <\/p>\n<pre><code class=\"cpp\">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)); } <\/code><\/pre>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u043e\u0434, \u043a\u0430\u043a \u0438 \u0432 GLKMath, \u043d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f. \u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f: <b>vmulq_n_f32<\/b> \u2013 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440;<b> vgetq_lane_f32<\/b> \u2013 \u043c\u0430\u043a\u0440\u043e\u0441, \u0432\u044b\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439 \u0441\u043a\u0430\u043b\u044f\u0440 \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430; <b>vmlaq_n_f32<\/b> \u2013 \u0443\u043c\u043d\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0441\u043a\u0430\u043b\u044f\u0440 \u0438 \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c. \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u2013 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043d\u0430 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0441\u0435\u0431\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 \u043d\u0438\u043c.<\/p>\n<p>  \u042f \u0434\u0435\u043b\u0430\u043b \u0442\u0435\u0441\u0442 \u043d\u0430 iPod Touch 4. \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Update \u0444\u0443\u043d\u043a\u0446\u0438\u0438:  <\/p>\n<table>\n<tr>\n<th>\u041f\u043e\u0434\u0445\u043e\u0434<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u0441<\/th>\n<th>CPU \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430, %<\/th>\n<\/tr>\n<tr>\n<td>FPU<\/td>\n<td>6058 + 5067*<\/td>\n<td>35-38<\/td>\n<\/tr>\n<tr>\n<td>GLKMath<\/td>\n<td>2789<\/td>\n<td>20-23<\/td>\n<\/tr>\n<tr>\n<td>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/td>\n<td>5304<\/td>\n<td>23-25<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/td>\n<td>2803<\/td>\n<td>18-20<\/td>\n<\/tr>\n<\/table>\n<p><i>*\u041d\u0430 <a href=\"http:\/\/habrastorage.org\/storage2\/2b1\/acd\/38c\/2b1acd38c2651dad7b43fe8ed97f74a0.png\">\u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435<\/a> \u0438\u0437 Instruments \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f Matrix4ByMatrix4 \u043d\u0435 \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043b\u0430\u0441\u044c.<\/i><\/p>\n<p>  \u0412\u043e\u0442 \u0438 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043e\u0432\u0435\u0442 \u2013 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e \u0438\u043d\u043b\u0430\u0439\u043d\u0442\u0435 \u0432\u0430\u0448 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u0434. \u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 <b>__attribute__((always_inline))<\/b> \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u044b\u0447\u043d\u044b\u043c <b>inline <\/b>\u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445.<\/p>\n<p>  \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432:  <\/p>\n<table>\n<tr>\n<th>\u041f\u043e\u0434\u0445\u043e\u0434<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u0441<\/th>\n<th>CPU \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430, %<\/th>\n<\/tr>\n<tr>\n<td>FPU forceinlined<\/td>\n<td>6209 <\/td>\n<td>25-28<\/td>\n<\/tr>\n<tr>\n<td>GLKMath<\/td>\n<td>2789<\/td>\n<td>20-23<\/td>\n<\/tr>\n<tr>\n<td>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/td>\n<td>5304<\/td>\n<td>23-25<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/td>\n<td>2803<\/td>\n<td>18-20<\/td>\n<\/tr>\n<\/table>\n<p>\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u043b\u0430\u0439\u043d \u0434\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438! \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0441\u0435\u0431\u044f \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u0434\u0430. \u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u2013 \u044d\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <b>\u2013mllvm \u2013vectorize \u2013mllvm \u2013bb-vectorize-aligned-only<\/b> \u0432 <i>Other C Flags<\/i> \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432:  <\/p>\n<table>\n<tr>\n<th>\u041f\u043e\u0434\u0445\u043e\u0434<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043c\u0441<\/th>\n<th>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0432\u0435\u043a\u0442\u043e\u0440), \u043c\u0441<\/th>\n<th>CPU \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430, %<\/th>\n<th>CPU \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (\u0432\u0435\u043a\u0442\u043e\u0440), %<\/th>\n<\/tr>\n<tr>\n<td>FPU forceinlined<\/td>\n<td>6209<\/td>\n<td>5028<\/td>\n<td>25-28<\/td>\n<td>22-24<\/td>\n<\/tr>\n<tr>\n<td>GLKMath<\/td>\n<td>2789<\/td>\n<td>2776<\/td>\n<td>20-23<\/td>\n<td>20-23<\/td>\n<\/tr>\n<tr>\n<td>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/td>\n<td>5304<\/td>\n<td>5291<\/td>\n<td>23-25<\/td>\n<td>22-24<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/td>\n<td>2803<\/td>\n<td>2789<\/td>\n<td>18-20<\/td>\n<td>18-20<\/td>\n<\/tr>\n<\/table>\n<p>  \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u0438 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438 \u2013 \u043f\u043e \u0441\u0443\u0442\u0438 \u043a\u043e\u0434 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u043e \u2013 \u043f\u043e\u0447\u0442\u0438 \u0432 2 \u0440\u0430\u0437\u0430! \u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435 (\u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442 \u0441\u0430\u043c\u0438). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u0434. \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u043e\u0434 GLKMath \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0447\u0442\u043e \u0434\u0430\u043b\u043e \u0442\u0430\u043a\u043e\u0435 \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u043a\u0430\u043a \u0438 \u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\"><a href=\"http:\/\/habrastorage.org\/storage2\/bef\/a49\/726\/befa4972653960ec1498558f4a30b329.png\">FPU forceinlined<\/a><br \/>  <a href=\"http:\/\/habrastorage.org\/storage2\/b21\/0a7\/82c\/b210a782cc439ff8689a7837a55dcb2c.png\">FPU \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439<\/a><br \/>  <a href=\"http:\/\/habrastorage.org\/storage2\/180\/818\/653\/180818653674b3348544a689c81d15eb.png\">GLKMath<\/a><br \/>  <a href=\"http:\/\/habrastorage.org\/storage2\/1b6\/8e4\/5b0\/1b68e45b0f00b10bf267b3374f17fc11.png\">\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/a><br \/>  <a href=\"http:\/\/habrastorage.org\/storage2\/fc3\/b6d\/c0c\/fc3b6dc0ce32781236a49f708ebaf9cb.png\">\u0418\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/a>  <\/div>\n<\/div>\n<p>  \u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0442\u043e\u0433\u0438. \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0432\u043e\u0434\u043e\u0432:  <\/p>\n<ul>\n<li>\u0418\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u044b LLVM \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432. \u042f \u0434\u0435\u043b\u0430\u043b \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u0442\u0435\u0441\u0442 \u0431\u043e\u043b\u0435\u0435 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c \u0432 XCode \u0431\u044b\u043b GCC 4.2 \u0438 \u043e\u043d \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2013 \u0432\u0441\u0435\u0433\u043e 10-15% \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 FPU \u043a\u043e\u0434\u043e\u043c. \u042d\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u2013 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0438 \u044f \u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e \u0440\u0430\u0434!<\/li>\n<li>Clang \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0443\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434. \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u044d\u0442\u043e \u0431\u043e\u043d\u0443\u0441 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u043b\u0438\u0448\u044c 4 \u0441\u043b\u043e\u0432\u0430. \u0427\u0442\u043e \u0442\u0443\u0442 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u0430\u044f \u0448\u0442\u0443\u043a\u0430?!<\/li>\n<li>NEON \u043a\u043e\u0434 \u0434\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0431\u0443\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c C \u043a\u043e\u0434\u043e\u043c \u2013 2.22 \u0440\u0430\u0437! \u041f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0448\u0438\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0441\u0442\u0430\u043b \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0432\u0435\u0440\u0448\u0438\u043d \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 GPU! \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 memcpy \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u0442\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f NEON \u043a\u043e\u0434. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u044f \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0432 \u043d\u0435\u043c \u043f\u0440\u0438\u0444\u0435\u0442\u0447\u0430, \u0447\u0442\u043e, \u0432\u0438\u0434\u0438\u043c\u043e, \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/li>\n<li>\u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043b\u043e\u0443 \u043b\u0435\u0432\u0435\u043b \u0432\u0435\u0449\u0435\u0439 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u0441\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u043c.<\/li>\n<\/ul>\n<h5>\u0421\u0441\u044b\u043b\u043a\u0438<\/h5>\n<p><a href=\"http:\/\/www.arm.com\/products\/processors\/technologies\/neon.php\">www.arm.com\/products\/processors\/technologies\/neon.php<\/a><br \/>  <a href=\"http:\/\/blogs.arm.com\/software-enablement\/161-coding-for-neon-part-1-load-and-stores\/\">blogs.arm.com\/software-enablement\/161-coding-for-neon-part-1-load-and-stores\/<\/a><br \/>  <a href=\"http:\/\/code.google.com\/p\/math-neon\/\">code.google.com\/p\/math-neon\/<\/a><br \/>  <a href=\"http:\/\/llvm.org\/devmtg\/2012-04-12\/Slides\/Hal_Finkel.pdf\">llvm.org\/devmtg\/2012-04-12\/Slides\/Hal_Finkel.pdf<\/a><br \/>  <a href=\"http:\/\/code.google.com\/p\/neon-demo\/\">\u0414\u0435\u043c\u043e \u043f\u0440\u043e\u0435\u043a\u0442<\/a> \t\t\t \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/156809\/\"> http:\/\/habrahabr.ru\/post\/156809\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0414\u0430\u0432\u043d\u043e \u043d\u0430\u0437\u0440\u0435\u0432\u0430\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u0441\u043c\u043e\u0433\u0443 \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043e\u043f\u044b\u0442 \u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0430 \u0442\u0435\u043c\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0433\u0440 \u043f\u043e\u0434 ARMv7 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 CPU \u0438 PowerVR SGX 5 \u0441\u0435\u0440\u0438\u044e GPU, \u0447\u0438\u0442\u0430\u0439 iOS \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443. \u041d\u043e \u0432\u0441\u0435, \u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435, \u0441\u043e\u0432\u0435\u0442\u044b \u0432 \u0440\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u043f\u043e\u0434 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0442\u0435\u043c \u0436\u0435 \u0436\u0435\u043b\u0435\u0437\u043e\u043c, \u0447\u0438\u0442\u0430\u0439 \u0410\u043d\u0434\u0440\u043e\u0438\u0434\u044b. \u041d\u0430\u0447\u043d\u0443 \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e\u0439, \u0418\u041c\u0425\u041e, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2013 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u043e\u0434 <b>NEON<\/b>.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-156809","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/156809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=156809"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/156809\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=156809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=156809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=156809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}