{"id":452745,"date":"2025-03-22T15:00:09","date_gmt":"2025-03-22T15:00:09","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=452745"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=452745","title":{"rendered":"<span>\u0420\u0430\u0437\u0433\u043e\u043d \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430: SIMD \u0441 \u0431\u0443\u0431\u043d\u0430\u043c\u0438, OpenMP \u0438 CUDA<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430 \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 (<strong>embarrassingly <\/strong>parallel problem).<\/p>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043f\u043e\u0438\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438 (intrinsics) \u0438, \u043d\u0435 \u0442\u0435\u0440\u044f\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043c SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u043c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0442\u0430\u0440\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 CUDA.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8bd\/6b7\/520\/8bd6b752000758fb84e4ee85e8f08bb7.png\" width=\"1600\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8bd\/6b7\/520\/8bd6b752000758fb84e4ee85e8f08bb7.png\"\/><\/figure>\n<h2>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043a\u0443\u0440\u0441\u0435 \u041c\u0424\u0422\u0418, \u043d\u0430 \u0424\u0430\u043a\u0443\u043b\u044c\u0442\u0435\u0442\u0435 \u0440\u0430\u0434\u0438\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043d\u0430\u0448 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, <a href=\"https:\/\/wiki.mipt.tech\/index.php\/%D0%94%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A0%D1%83%D0%B4%D0%BE%D0%BB%D1%8C%D1%84%D0%BE%D0%B2%D0%B8%D1%87\" rel=\"noopener noreferrer nofollow\">\u0418\u043b\u044c\u044f \u0414\u0435\u0434\u0438\u043d\u0441\u043a\u0438\u0439<\/a>, \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b \u043d\u0430\u0441 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 x86-64, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430 \u0438 \u0435\u0433\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0441\u0440\u0430\u0437\u0443 \u043c\u0435\u043d\u044f \u0443\u0432\u043b\u0435\u043a\u043b\u0430, \u0438 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043c\u0435\u0441\u0442\u0440\u0430 \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u043d\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0438 \u0437\u043d\u0430\u043d\u0438\u0439. \u0421\u043f\u0443\u0441\u0442\u044f \u0433\u043e\u0434 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430?<\/h2>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BD%D0%B4%D0%B5%D0%BB%D1%8C%D0%B1%D1%80%D0%BE%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\"><strong>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430<\/strong><\/a>\u00a0\u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a <strong><em>c<\/em><\/strong> \u043d\u0430 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 <strong><em>z\u2099\u208a\u2081 = z\u2099\u00b2 + c<\/em><\/strong> \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 <strong>z\u2080 = 0<\/strong>.<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u043e\u0447\u043a\u0443 <strong><em>c <\/em><\/strong>\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0451 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <strong>z\u2099<\/strong>. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\u200b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0432\u0435\u0441\u0442\u0438 <strong>\u0440\u044f\u0434 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0439<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0448\u0430\u0433\u0435 <strong><em>z\u2099\u00b2 &gt; 4 <\/em><\/strong>(\u0438\u043b\u0438 <strong>|z\u2099| &gt; 2<\/strong>), \u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 <strong><em>N<\/em><\/strong>: \u0435\u0441\u043b\u0438 \u0437\u0430 <strong><em>N<\/em><\/strong> \u0448\u0430\u0433\u043e\u0432 <strong>|<em>z\u2099| <\/em><\/strong>\u0442\u0430\u043a \u0438 \u043d\u0435 \u0432\u044b\u0448\u0435\u043b \u0437\u0430 \u0440\u0430\u0434\u0438\u0443\u0441 <strong>2<\/strong>, \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0435\u0451 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f <strong>\u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c.<\/strong> \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0441\u043e\u0441\u0435\u0434\u0435\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0425\u043e\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0441\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430, \u043d\u043e, &#171;\u0432\u043e \u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e&#187;, \u0430, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441 \u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c<strong> \u0446\u0432\u0435\u0442\u043e\u0432\u0443\u044e \u043f\u0430\u043b\u0438\u0442\u0440\u0443<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0442\u043e\u0447\u043a\u0430 \u00ab\u0443\u0431\u0435\u0436\u0430\u043b\u0430\u00bb \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0440\u0430\u0434\u0438\u0443\u0441\u0430 <strong>2<\/strong>. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430 \u0440\u0430\u0434\u0438\u0443\u0441 \u0437\u0430 <strong><em>N<\/em><\/strong> \u0448\u0430\u0433\u043e\u0432 \u2014 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0435\u0439 \u0447\u0435\u0440\u043d\u044b\u0439 \u0446\u0432\u0435\u0442.<\/p>\n<p>\u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/www.sfml-dev.org\/\" rel=\"noopener noreferrer nofollow\">SFML<\/a> \u0432\u0435\u0440\u0441\u0438\u0438 2.6)<\/p>\n<pre><code class=\"cpp\">sf::Color get_color(int iteration, int maxIterations) {     if (iteration &gt;= maxIterations) {         return sf::Color::Black;     }       const float colorScale = 255.0f \/ maxIterations;     const float iterNormalized = iteration * colorScale;      const sf::Uint8 r = (sf::Uint8)(iterNormalized \/ 2 + 0);     const sf::Uint8 g = (sf::Uint8)(iterNormalized * 2 + 2);     const sf::Uint8 b = (sf::Uint8)(iterNormalized * 2 + 5);      return sf::Color(r, g, b, 255); }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2eb\/1da\/9d1\/2eb1da9d16b83a3ceb0c167c417dcef4.png\" width=\"1598\" height=\"1198\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2eb\/1da\/9d1\/2eb1da9d16b83a3ceb0c167c417dcef4.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5af\/dff\/abd\/5afdffabd08b5ebda57fba2190a2360e.png\" width=\"1331\" height=\"704\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5af\/dff\/abd\/5afdffabd08b5ebda57fba2190a2360e.png\"\/><\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c.<\/p>\n<h2>\u0413\u043b\u0430\u0432\u0430 1. \u041e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<h2>\u041d\u0430\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">for each (c_x, c_y) on complex plane:     z_x, z_y, iteration = 0.0     while (z_x\u00b2 + z_y\u00b2 \u2264 4 AND iteration &lt; 256):         xtemp = z_x\u00b2 - z_y\u00b2 + c_x  # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c z\u00b2 + c         z_y = 2*z_x*z_y + c_y      # \u041c\u043d\u0438\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c z\u00b2 + c         z_x = xtemp         iteration++     set_color_by_iteration(c_x, c_y, iteration)<\/code><\/pre>\n<ul>\n<li>\n<p><strong><em>z_x<\/em><\/strong> \u0438 <strong>z_<em>y<\/em><\/strong> \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u043c\u043d\u0438\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 <strong><em>z<\/em><\/strong><\/p>\n<\/li>\n<li>\n<p><strong><em>c_x<\/em><\/strong> \u0438 <strong><em>c_y<\/em><\/strong> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 <strong><em>c<\/em><\/strong> \u043d\u0430 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438 \u043c\u043d\u0438\u043c\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437: <strong><em>z\u00b2 = (x + iy)\u00b2 = x\u00b2 &#8212; y\u00b2 + 2xyi<\/em><\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u044f\u0437\u044b\u043a\u0435 C \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438: <\/p>\n<pre><code class=\"cpp\">void mandelbrot_naive()  {     for (int screen_y = 0; screen_y &lt; WINDOW_HEIGHT; screen_y++)     {         for (int screen_x = 0; screen_x &lt; WINDOW_WIDTH; screen_x++)         {             \/\/ [0, 1920] x [0, 1080] -&gt; [-1, 1] x [-1, 1]             float c_y = -1.0f + screen_y * (2.0f \/ WINDOW_HEIGHT);             float c_x = -1.0f + screen_x * (2.0f \/ WINDOW_WIDTH);              float z_x = 0.0f, z_x2 = 0.0f,                   z_y = 0.0f, z_y2 = 0.0f;              int iterations = 0;              while (z_x2 + z_y2 &lt; MAX_RADIUS_2 &amp;&amp;                    iterations &lt; MAX_ITERATION_DEPTH)              {                 z_y = 2 * z_x * z_y + c_y;                 z_x = z_x2 - z_y2 + c_x;                  z_x2 = z_x * z_x;                 z_y2 = z_y * z_y;                  iterations++;             }              sf::Color color = get_color(iterations, 256);                        draw_pixel(screen_x, screen_y, color); \/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0446\u0432\u0435\u0442\u043e\u043c,                                                     \/\/ \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u043c \u043e\u0442 \u043a-\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439         }     } }<\/code><\/pre>\n<h4>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0430<\/h4>\n<ul>\n<li>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f <strong>z_<em>x\u00b2 <\/em><\/strong>\u0438<strong><em> z_y\u00b2<\/em><\/strong>, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u0443\u0441\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0418\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0446\u0438\u043a\u043b\u0430,<\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0440\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <strong><em>xtemp.<\/em><\/strong><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041f\u0438\u043a\u0441\u0435\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 <strong><em>(screen_x, screen_y)<\/em><\/strong> \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c <strong><em>[-1, +1] \u00d7 [-1, +1]<\/em><\/strong> \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041e\u043d\u0438 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430, \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435. \u041f\u043e\u043b\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0444\u0438\u0447\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/nniikon\/Mandelbrot\" rel=\"noopener noreferrer nofollow\">\u0443 \u043c\u0435\u043d\u044f \u043d\u0430 GitHub<\/a>.<\/p>\n<\/blockquote>\n<p><em>\u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e, \u0432\u0430\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435.<\/em><\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a (\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b)<\/h3>\n<h4>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SFML \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0435\u0451 &#171;\u0433\u043b\u0430\u0437\u043a\u0430\u043c\u0438&#187; (\u043e\u0431\u044b\u0447\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u0438\u0434\u0451\u0442 \u043d\u0435 \u0442\u0430\u043a, \u044d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c). <\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0430 (\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438) \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (<em>N)<\/em> \u0440\u0430\u0437, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0442.\u043a. \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0430 \u043d\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438). \u042f \u0432\u044b\u0431\u0438\u0440\u0430\u043b <em>N <\/em>\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <a href=\"https:\/\/github.com\/sharkdp\/hyperfine\" rel=\"noopener noreferrer nofollow\">hyperfine<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/72d\/3f6\/1da\/72d3f61da4baad6c69199bb09911cc29.png\" alt=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b hyperfine\" title=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b hyperfine\" width=\"806\" height=\"83\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/72d\/3f6\/1da\/72d3f61da4baad6c69199bb09911cc29.png\"\/><\/p>\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b hyperfine<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f FPS<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>FPS   = 200 \u043a\u0430\u0434\u0440\u043e\u0432 \/ 4.272 \u0441\u0435\u043a\u0443\u043d\u0434 \u2248 46.8 fps (\u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443)<\/p>\n<\/li>\n<li>\n<p>dFPS = (0.019 \/ 4.272) * 46.8fps \u2248 0.2 fps<\/p>\n<p><strong>\u0418\u0442\u043e\u0433\u043e:<\/strong> (46.8 \u00b1 0.2) fps<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<details class=\"spoiler\">\n<summary>\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">CPU<\/p>\n<\/td>\n<td>\n<p align=\"left\">AMD Ryzen 5 5600H @ 3.3 GHz <br \/>(6 \u044f\u0434\u0435\u0440 \/ 12 \u043f\u043e\u0442\u043e\u043a\u043e\u0432)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">16 GB DDR4 @ 3200 MHz<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041e\u0421<\/p>\n<\/td>\n<td>\n<p align=\"left\">Arch Linux (\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0434\u0440\u0430 6.13.5-arch1-1)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">Clang 19.1.7, GCC 14.2.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">1920\u00d71080 (Full HD)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">256<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/details>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u043b\u0430\u0433\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC, -O2 \u0438 \u0432\u044b\u0448\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0 \u00b1 0.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, -O1 \u0438 \u0432\u044b\u0448\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0 \u00b1 0.1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 SIMD?<\/h4>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/SIMD\" rel=\"noopener noreferrer nofollow\"><strong>SIMD<\/strong><\/a> (Single Instruction, Multiple Data) \u2014 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 CPU \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/X86-64\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 x86-64<\/a> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/AVX\" rel=\"noopener noreferrer nofollow\"><strong>AVX\/AVX2<\/strong><\/a>) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 256-\u0431\u0438\u0442\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b (<strong>ymm0-ymm15<\/strong>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c 8 \u0447\u0438\u0441\u0435\u043b \u0442\u0438\u043f\u0430 float. <\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0437\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\/\u0438\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e, \u043e\u043d\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/MMX\" rel=\"noopener noreferrer nofollow\">MMX<\/a>), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u044b \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0445 \u0430\u0443\u0434\u0438\u043e- \u0438 \u0432\u0438\u0434\u0435\u043e\u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 <strong>ymm1<\/strong> \u0438 <strong>ymm2<\/strong> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a: <br \/><strong>ymm1<\/strong> = [a\u2080, a\u2081, a\u2082, a\u2083, a\u2084, a\u2085, a\u2086, a\u2087]<br \/><strong>ymm2<\/strong> = [b\u2080, b\u2081, b\u2082, b\u2083, b\u2084, b\u2085, b\u2086, b\u2087]<br \/><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/strong>: [a\u2080+b\u2080, a\u2081+b\u2081, &#8230;, a\u2087+b\u2087]<br \/>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0432\u043e\u0441\u0435\u043c\u044c. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0437\u0430 \u0440\u0430\u0437, \u0447\u0442\u043e, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a 8-\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044e.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 SIMD \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432<\/h4>\n<details class=\"spoiler\">\n<summary> \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435 (\u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">c_step_x = 2.0 \/ WIDTH c_step_y = 2.0 \/ HEIGHT  c_y  = -1.0 for screen_y in 0 to HEIGHT:     \/\/ \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0438\u0436\u043d\u0438\u043c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c     _c_x = [-1.0 + 0 * c_step_x,             -1.0 + 1 * c_step_x,             ...,             -1.0 + 7 * c_step_x]      for screen_x in 0 to WIDTH step 8:         _z_x        = [0.0, 0.0, .., 0.0]         _z_y        = [0.0, 0.0, .., 0.0]         _z_x2       = [0.0, 0.0, .., 0.0]         _z_y2       = [0.0, 0.0, .., 0.0]         _z_xy       = [0.0, 0.0, .., 0.0]          _iterations = [0, 0, .., 0]          for iteration in 0 to MAX_ITERATIONS:             _radius_sq = _z_x * _z_x + _z_y * _z_y              _cmp_mask = [0.0, 0.0, .., 0.0]             for i in 0..7:                 if radius_sq[i] &lt; MAX_RADIUS_SQ:                     _cmp_mask[i] = -1.0                 else:                     _cmp_mask[i] = 0.0              if _cmp_mask == [0.0, 0.0, .., 0.0]:                 break              for i in 0..7:                 _z_x[i] = _z_x2 - _z_y2 + _c_x                 _z_y[i] = 2 * _z_xy + _c_y              _iterations -= _cmp_mask              _z_x2 = _z_x * _z_x             _z_y2 = _z_y * _z_y             _z_xy = _z_x * _z_y          for i in 0..7:             set_color(screen_x + i, screen_y, iterations[i])          _c_x += [step_x, step_x, ..., step_x]      _c_y += step_y<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 C++ \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &lt;x86intrin.h&gt;<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;x86intrin.h&gt;  void mandelbrot_vectorized() {     const __m256 _01234567 = _mm256_set_ps(7.0f, 6.0f, 5.0f, 4.0f,                                             3.0f, 2.0f, 1.0f, 0.0f);      \/\/ \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c c_x \u0438 c_y,     \/\/  \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 c_step_x \u0438 c_step_y.     const float c_step_x = (2.0f \/ WINDOW_WIDTH);      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 8\u044e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438     const __m256 _c_step_x    = _mm256_set1_ps(c_step_x);      const __m256 _8_c_steps_x = _mm256_set1_ps(c_step_x * 8);      const float c_step_y = (2.0f \/ WINDOW_HEIGHT);     const __m256 _c_step_y = _mm256_set1_ps(c_step_y);      __m256 _max_radius2 = _mm256_set1_ps(MAX_RADIUS_2);      float c_y = -1.0f;     __m256 _c_y = _mm256_set1_ps(c_y);      for (int screenY = 0;           screenY &lt; WINDOW_HEIGHT;           screenY++, c_y += c_step_y)     {         float c_x = -1.0f;         __m256 _c_x = _mm256_set1_ps(c_x);          \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 X-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439:         \/\/ _c_x = [c_x + 0*step, c_x + 1*step, ..., c_x + 7*step]         _c_x = _mm256_add_ps(_c_x, _mm256_mul_ps(_c_step_x, _01234567));          \/\/ \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0437\u0430 \u0440\u0430\u0437          for (int screenX = 0; screenX &lt; WINDOW_WIDTH; screenX += 8)         {             \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0443\u043b\u044f\u043c\u0438             __m256 _z_x = _mm256_setzero_ps();             __m256 _z_y = _mm256_setzero_ps();             __m256 _z_x2 = _mm256_setzero_ps();             __m256 _z_y2 = _mm256_setzero_ps();             __m256 _z_xy = _mm256_setzero_ps();             __m256i _iterations = _mm256_setzero_si256();              for (int iteration = 0; iteration &lt; MAX_ITERATION_DEPTH; iteration++)             {                 __m256 _radius2 = _mm256_add_ps(_z_x2, _z_y2);                                  \/\/ \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0434\u0438\u0443\u0441\u00b2 \u0441 4.0, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443:                 \/\/ \u0414\u043b\u044f \u0432\u0441\u0435\u0445 8 float'\u043e\u0432:                  \/\/      -1 (0xFFFFFFFF) \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f,                 \/\/       0 (0x00000000) \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.                 \/\/ \u0423\u0441\u043b\u043e\u0432\u0438\u0435 - \u0432\u044b\u043b\u0435\u0442\u0435\u043b \u043b\u0438 z \u0437\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441                 __m256 _cmpMask = _mm256_cmp_ps(_radius2, _max_radius2, _CMP_LT_OQ);                                  \/\/ \u0418\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e int'\u0430 \u043c\u0430\u0441\u043a\u0438 \u0431\u0435\u0440\u0435\u043c \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442                  \/\/       1, \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u043e\u0441\u044c,                  \/\/       0, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.                 int mask = _mm256_movemask_ps(_cmpMask);                                  \/\/ \u0415\u0441\u043b\u0438 \u043d\u0438 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f (\u0432\u0441\u0435 \u0431\u0438\u0442\u044b 0),                 \/\/  \u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u043c \u0446\u0438\u043a\u043b                 if (mask == 0x00)                     break;                  _z_x = _mm256_add_ps(_c_x, _mm256_sub_ps(_z_x2, _z_y2));                 _z_y = _mm256_add_ps(_c_y, _mm256_mul_ps(_mm256_set1_ps(2.0f), _z_xy));                  \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439:                  \/\/ \u0412\u044b\u0447\u0442\u0435\u043c \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043c\u0430\u0441\u043a\u0438                 \/\/ \u0422\u043e\u0433\u0434\u0430 \u0435\u0441\u043b\u0438 \u043c\u0430\u0441\u043a\u0430 \u0440\u0430\u0432\u043d\u0430 0 (\u043c\u044b \u0432\u044b\u0448\u043b\u0438 \u0437\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441),                  \/\/    \u0442\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f                  \/\/ \u0415\u0441\u043b\u0438 \u043c\u0430\u0441\u043a\u0430 \u0440\u0430\u0432\u043d\u0430 -1 (\u043c\u044b \u043d\u0435 \u0432\u044b\u0448\u043b\u0438 \u0437\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441),                  \/\/    \u0442\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 1                 _iterations = _mm256_sub_epi32(_iterations, _mm256_castps_si256(_cmpMask));                  _z_x2 = _mm256_mul_ps(_z_x, _z_x);                 _z_y2 = _mm256_mul_ps(_z_y, _z_y);                 _z_xy = _mm256_mul_ps(_z_x, _z_y);             }              \/\/ ... \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442\u0430 (\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438)              \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c X-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439             _c_x = _mm256_add_ps(_c_x, _8_c_steps_x);         }                  \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c Y-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438         _c_y = _mm256_add_ps(_c_y, _c_step_y);     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/h3>\n<ol>\n<li>\n<p><strong>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c 8:1. <\/strong>\u0412\u0441\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 <code>float<\/code> \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>__m256<\/code> \u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 8 \u0447\u0438\u0441\u0435\u043b \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439. <\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0440\u044e\u043a \u0441 \u043c\u0430\u0441\u043a\u043e\u0439. <\/strong>\u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 <code>if (x\u00b2 + y\u00b2 &lt; 4)<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"cpp\">__m256 _cmpMask = _mm256_cmp_ps(_radius2, _max_radius2, _CMP_LT_OQ); ... int mask = _mm256_movemask_ps(_cmpMask); if (mask == 0x00)     break; ... _iterations = _mm256_sub_epi32(_iterations, _mm256_castps_si256(_cmpMask));<\/code><\/pre>\n<ul>\n<li>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 8 \u0442\u043e\u0447\u0435\u043a \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u043a\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f <code>_cmpMask<\/code> (\u0441\u043c. \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434)<\/p>\n<ul>\n<li>\n<p><code>-1<\/code> \u2014 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, <\/p>\n<\/li>\n<li>\n<p><code>0<\/code> \u2014 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. <\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0418\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043c\u044b \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u044d\u0442\u0443 \u043c\u0430\u0441\u043a\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437 \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0446\u0438\u043a\u043b\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>_mm256_movemask_ps<\/code>, \u043c\u044b \u043a\u043b\u0430\u0434\u0435\u043c \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0438\u0442\u044b 8\u043c\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432 8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0415\u0441\u043b\u0438 \u043e\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u043b\u044e, \u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u043b\u0435\u0442\u0435\u043b\u0438 \u0437\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0434\u0438\u0443\u0441, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u043e\u0441\u044c\u043c\u0451\u0440\u043a\u0435. <\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430<\/h3>\n<ol>\n<li>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. <\/strong>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u2014 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0435\u0437\u0442\u044c \u0432 <a href=\"https:\/\/www.intel.com\/content\/www\/us\/en\/docs\/intrinsics-guide\/index.html\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043e\u0442 Intel<\/a>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. <\/strong>\u041a\u043e\u0434 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 CPU \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f AVX, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0445. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 AVX-512 (\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 512), \u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b.<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e \u0438 \u043d\u0443\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0443\u0447\u043d\u043e\u0439 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u043b\u0430\u0433\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC, O1<\/p>\n<\/td>\n<td>\n<p align=\"left\">42.3 \u00b1 0.1 <strong>(\u04456.0)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC, O2<\/p>\n<\/td>\n<td>\n<p align=\"left\">46.4 \u00b1 0.1 (<strong>x6.6<\/strong>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><u>GCC, O3<\/u><\/p>\n<\/td>\n<td>\n<p align=\"left\"><u>47.0 \u00b1 0.1 (<\/u><strong><u>x6.7<\/u><\/strong><u>)<\/u><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, O1<\/p>\n<\/td>\n<td>\n<p align=\"left\">42.9 \u00b1 0.1 <strong>(\u04456.1)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, O2<\/p>\n<\/td>\n<td>\n<p align=\"left\">43.2 \u00b1 0.1 <strong>(\u04456.2)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, O3<\/p>\n<\/td>\n<td>\n<p align=\"left\">43.6 \u00b1 0.1 <strong>(\u04456.2)<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432 <strong>6.7<\/strong> \u0440\u0430\u0437. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c <strong>x8<\/strong>, \u043d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f 8\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e. \u041c\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0438\u0441\u044c \u043a \u0442\u0435\u043e\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0435\u043b\u0443.<\/p>\n<h2>\u0422\u0430\u043d\u0446\u044b \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c. \u0420\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u0433\u043b\u0443\u0445\u043e\u0433\u043e \u0438 \u043d\u0435\u043c\u043e\u0433\u043e<\/h2>\n<p>\u0412 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u0438\u0448\u0435\u0442 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u043a\u043e\u0434, \u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u043e\u043b\u0448\u0435\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434. \u0423\u0432\u044b, \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u2014 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b, \u0445\u043e\u0442\u044c \u0438 \u0443\u043c\u043d\u044b, \u0447\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u043c\u0451\u043a\u0430\u0445 \u043e\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432. \u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0437\u0430\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u0434 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <strong>\u0443\u0432\u0438\u0434\u0435\u043b<\/strong> \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0443\u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c. \u0412\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0430\u0437\u0436\u0443\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438. \u0422\u0430\u043a\u0436\u0435 \u0443\u0431\u0435\u0440\u0451\u043c \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0448\u043b\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0434\u0435\u044f\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430\u0441 \u043f\u043e\u043d\u044f\u043b.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438:<\/h4>\n<pre><code class=\"cpp\">const int VEC_SIZE = 8;  #define FOR_VEC for (int i = 0; i &lt; VEC_SIZE; ++i) #define ALIGN alignas(VEC_SIZE * 4)  void mandelbrot_arrayed() {     const float c_step_x = (2.0f \/ WINDOW_WIDTH);     const float c_step_y = (2.0f \/ WINDOW_HEIGHT);      const float vec_c_step_x = c_step_x * VEC_SIZE;      float c_y = -1.0f;      for (int screenY = 0; screenY &lt; WINDOW_HEIGHT; screenY++)      {         const float c_x = -1.0f;          ALIGN float _c_x[VEC_SIZE] = {};         FOR_VEC _c_x[i] = c_x + c_step_x * i;          for (int screenX = 0; screenX &lt; WINDOW_WIDTH; screenX += VEC_SIZE)          {             ALIGN float _z_x [VEC_SIZE] = {};             ALIGN float _z_y [VEC_SIZE] = {};             ALIGN float _z_xy[VEC_SIZE] = {};             ALIGN float _z_x2[VEC_SIZE] = {};             ALIGN float _z_y2[VEC_SIZE] = {};             ALIGN int _iterations[VEC_SIZE] = {};              for (int it = 0; it &lt; MAX_ITERATION_DEPTH; ++it)              {                 ALIGN float _radius2[VEC_SIZE] = {};                 FOR_VEC _radius2[i] = _z_x2[i] + _z_y2[i];                  ALIGN int _is_active[VEC_SIZE] = {};                 FOR_VEC _is_active[i] = _radius2[i] &lt; MAX_RADIUS_2;                  \/\/ \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440                 \/\/ \u041f\u043e \u0444\u0430\u043a\u0442\u0443: if (_is_active == 0x00) break;                 bool all_zero = true;                 FOR_VEC {                     if (is_active[i] != 0) {                         all_zero = false;                         break;                     }                 }                 if (all_zero) {                     break;                 }                  FOR_VEC _z_x[i] = _z_x2[i] - _z_y2[i] + _c_x[i];                 FOR_VEC _z_y[i] = 2 * _z_xy[i]        +  c_y;                  \/\/ \u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c                 FOR_VEC _iterations[i] += _is_active[i];                  FOR_VEC _z_x2[i] = _z_x[i] * _z_x[i];                 FOR_VEC _z_y2[i] = _z_y[i] * _z_y[i];                 FOR_VEC _z_xy[i] = _z_x[i] * _z_y[i];             }              \/\/ ... \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442\u0430 (\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438)              FOR_VEC _c_x[i] += vec_c_step_x;         }          c_y += c_step_y;     } }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043a\u043e\u0434, \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043d\u0430\u0448\u0443 \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0430. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043f\u043e\u043d\u044f\u043b \u043b\u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. <\/p>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0442\u0430\u0440\u0430\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430:<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u043b\u0430\u0433\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC, -O3<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.0 \u00b1 0.1 <strong>(x1.9)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, -O1<\/p>\n<\/td>\n<td>\n<p align=\"left\">  5.2 \u00b1 0.1 <strong>(x0.7)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, -O2<\/p>\n<\/td>\n<td>\n<p align=\"left\">45.8 \u00b1 0.1 <strong>(x6.5)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, -O3<\/p>\n<\/td>\n<td>\n<p align=\"left\">46.8 \u00b1 0.1 <strong>(x6.7)<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0441 GCC \u043e\u0431\u0449\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043d\u0430\u0439\u0442\u0438\u0441\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u0417\u0430\u0442\u043e Clang \u043c\u0435\u043d\u044f \u043f\u043e\u043d\u044f\u043b, \u0434\u0430 \u0435\u0449\u0451 \u043a\u0430\u043a, \u043e\u043d \u0434\u0430\u0436\u0435 \u0441\u0442\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0441 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438, \u0438 \u043f\u043e\u0447\u0442\u0438 \u0434\u043e\u0433\u043d\u0430\u043b GCC.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 \u0441 <em>AVX-512<\/em> (Intel i5-1135G7), \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <strong><em>VEC_SIZE <\/em><\/strong>\u043d\u0430 <strong><em>16. <\/em><\/strong>\u0418 \u0432\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0430\u0438\u0432\u043d\u0430\u044f,                Clang \u043f\u043e\u0434 -O3<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.3 \u00b1 0.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f, Clang \u043f\u043e\u0434 -O3<\/p>\n<\/td>\n<td>\n<p align=\"left\">66.2 \u00b1 0.5 <strong>(x12.5)<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>\u0418\u0442\u043e\u0433\u043e, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/h4>\n<ol>\n<li>\n<p><strong>\u0423\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c. <\/strong>\u041a\u043e\u0434 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c. <\/strong>\u0414\u043b\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <strong><em>VEC_SIZE<\/em><\/strong>, \u0430 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 &#8212; \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439, \u0442\u043e\u0433\u0434\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0440\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0438\u0432\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e\u0441\u0442\u044c. <\/strong>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u0447\u0435\u0441\u0442\u043d\u043e: \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u2014 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0438\u0441\u044c \u043a \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443 \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430, \u0445\u043e\u0440\u043e\u0448\u043e \u043a \u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0438\u0441\u044c.<\/p>\n<h2>\u0413\u043b\u0430\u0432\u0430 2. \u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<h3>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442<\/h3>\n<p>\u041d\u0430 \u043c\u043e\u0451\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435 6 \u044f\u0434\u0435\u0440 \u0438 12 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0417\u043d\u0430\u0447\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432 6 \u0440\u0430\u0437? \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432 12? \u0412\u0441\u0451 \u043d\u0435 \u0442\u0430\u043a \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e.<\/p>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0433\u0438\u043f\u0435\u0440\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 (Hyper-Threading \u0443 Intel \u0438\u043b\u0438 SMT \u0443 AMD), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u043e\u043c\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u044f\u0434\u0440\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0434\u0432\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430. <\/p>\n<p>\u0427\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442? \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0433\u0438\u043f\u0435\u0440\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432: \u043f\u043e\u043a\u0430 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0436\u0434\u0451\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u043b\u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0435\u0442, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u044f\u0434\u0440\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u043e\u043a\u0430 \u043f\u043e\u0442\u043e\u043a \u0410 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c (\u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f), \u043f\u043e\u0442\u043e\u043a \u0411 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b: \u0443\u043c\u043d\u043e\u0436\u0430\u0442\u044c, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0438 \u0442.\u0434.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043b\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0433\u0438\u043f\u0435\u0440\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 20\u201330% \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0434\u0435\u0440 (x7-8 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435). \u041d\u043e \u0441\u0442\u043e\u0438\u0442 \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043a \u0445\u0443\u0434\u0448\u0435\u043c\u0443 \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0438\u0436\u0435, \u0447\u0435\u043c \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u0433\u0434\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 OpenMP<\/h2>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/OpenMP\" rel=\"noopener noreferrer nofollow\"><strong>OpenMP<\/strong><\/a> (Open Multi-Processing)\u00a0\u2014 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u0414\u0430\u0451\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (#pragma &#8230;), \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441 \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. <\/p>\n<\/blockquote>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 OpenMP \u2014 \u044d\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0418 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443:<\/p>\n<pre><code class=\"cpp\">...     #pragma omp parallel for for (int screenY = 0; screenY &lt; WINDOW_HEIGHT; screenY++)  {     float c_y = -1.0f + c_step_y * screenY; ...<\/code><\/pre>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u0430 \u043e\u0442 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445: \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0432\u043d\u0451\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <strong><em>c_y<\/em><\/strong> \u0432\u043d\u0443\u0442\u0440\u044c \u0446\u0438\u043a\u043b\u0430. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0440\u0430\u043d\u0435\u0435 <strong><em>c_y <\/em><\/strong>\u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0446\u0438\u043a\u043b\u0430, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043b\u0430 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432\u0443 <code>#pragma omp parallel for<\/code> \u043f\u0435\u0440\u0435\u0434 \u0446\u0438\u043a\u043b\u043e\u043c. \u0422\u0430\u043a, \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u00ab\u0434\u0440\u0443\u0436\u0438\u0449\u0435, \u0440\u0430\u0437\u0434\u0435\u043b\u0438 \u044d\u0442\u043e\u0442 \u0446\u0438\u043a\u043b \u043d\u0430 12 \u0440\u0430\u0432\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0438 \u0434\u0430\u0439 \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 \u043f\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u0443\u00bb. \u0413\u043e\u0442\u043e\u0432\u043e, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c:<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <strong>182 FPS<\/strong> \u0438\u043b\u0438 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432 &#8230; <strong>4<\/strong> \u0440\u0430\u0437\u0430?<br \/>\u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443? \u0427\u0435\u043c \u0442\u0430\u043c \u044d\u0442\u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c?<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b54\/b40\/4e9\/b54b404e9acb7ba55ff908b09cdc6e59.png\" alt=\"\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 12 \u00ab\u0440\u0430\u0432\u043d\u044b\u0445\u00bb \u0447\u0430\u0441\u0442\u0435\u0439\" title=\"\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 12 \u00ab\u0440\u0430\u0432\u043d\u044b\u0445\u00bb \u0447\u0430\u0441\u0442\u0435\u0439\" width=\"1551\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b54\/b40\/4e9\/b54b404e9acb7ba55ff908b09cdc6e59.png\"\/><\/p>\n<div><figcaption>\u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 12 \u00ab\u0440\u0430\u0432\u043d\u044b\u0445\u00bb \u0447\u0430\u0441\u0442\u0435\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0440\u0430\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 (<code>schedule(static)<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) \u0446\u0438\u043a\u043b \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0432\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f 12 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043f\u043e <code>WINDOW_HEIGHT \/ 12<\/code> \u0441\u0442\u0440\u043e\u043a \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u0415\u0441\u043b\u0438 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0442\u044c.<\/p>\n<h4>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/h4>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>schedule(dynamic, N)<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 OpenMP \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u043f\u043e <code>N<\/code> \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 (\u0441\u0442\u0440\u043e\u043a \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439) \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0432\u043e\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u043e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439. \u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044b (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0432\u043d\u0430\u0447\u0430\u043b\u0435), \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ea0\/62e\/772\/ea062e772f5e2ac14e2223064fa58693.png\" alt=\"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0427\u0438\u0441\u043b\u0430 \u0441\u043b\u0435\u0432\u0430 \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430. \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0432\u0435\u043d 40.\" title=\"\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0427\u0438\u0441\u043b\u0430 \u0441\u043b\u0435\u0432\u0430 \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430. \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0432\u0435\u043d 40.\" width=\"1600\" height=\"900\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ea0\/62e\/772\/ea062e772f5e2ac14e2223064fa58693.png\"\/><\/p>\n<div><figcaption>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0427\u0438\u0441\u043b\u0430 \u0441\u043b\u0435\u0432\u0430 \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430. <br \/>\u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0440\u0430\u0432\u0435\u043d 40.<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443:<\/p>\n<pre><code class=\"cpp\">...     #pragma omp parallel for schedule(dynamic, 8) for (int screenY = 0; screenY &lt; WINDOW_HEIGHT; screenY++)  {     float c_y = -1.0f * invMagnifier + c_step_y * screenY; ...<\/code><\/pre>\n<h4>Guided \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h4>\n<p>\u041c\u0435\u0436\u0434\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 <strong>guided \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> (<code>schedule(guided, N)<\/code>). \u0412 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 OpenMP \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u043e\u0432, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0438\u0445 \u0434\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>N<\/code>. \u041f\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u0447\u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447. \u041f\u043e \u043c\u0435\u0440\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u043e\u0432 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0436\u0435 \u043f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u0432\u0441\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u043e \u043a\u0443\u0441\u043e\u0447\u043a\u0443 \u0438 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u043b.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90a\/ce0\/fb0\/90ace0fb0e4cf8bdaf13d3b649ad14bd.png\" alt=\"Guided \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0427\u0438\u0441\u043b\u0430 \u0441\u043b\u0435\u0432\u0430 \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430.\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0440\u0430\u0432\u0435\u043d 8.\" title=\"Guided \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0427\u0438\u0441\u043b\u0430 \u0441\u043b\u0435\u0432\u0430 \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430.\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0440\u0430\u0432\u0435\u043d 8.\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/90a\/ce0\/fb0\/90ace0fb0e4cf8bdaf13d3b649ad14bd.png\"\/><\/p>\n<div><figcaption>Guided \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0427\u0438\u0441\u043b\u0430 \u0441\u043b\u0435\u0432\u0430 \u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>\u0420\u0430\u0437\u043c\u0435\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0440\u0430\u0432\u0435\u043d 8.<\/figcaption><\/div>\n<\/figure>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438:<\/h4>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/882\/7bd\/6f9\/8827bd6f9ade8cd0a6eb8637d1fdd5ef.png\" alt=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f OpenMP. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c FPS(N)\" title=\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f OpenMP. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c FPS(N)\" width=\"1023\" height=\"529\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/882\/7bd\/6f9\/8827bd6f9ade8cd0a6eb8637d1fdd5ef.png\"\/><\/p>\n<div><figcaption>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f OpenMP. \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c FPS(N)<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u0432\u044b\u0448\u043b\u043e <em>guided-\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <\/em>(\u0445\u043e\u0442\u044f, \u0441\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043f\u043e\u0431\u0435\u0434\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438)<em>, <\/em>\u043d\u0435\u0441\u0438\u043b\u044c\u043d\u043e \u043e\u0431\u043e\u0433\u043d\u0430\u0432 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0438\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u043d\u043a\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">186 \u00b1 7 <strong>(x4.0)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435, 1, 2, 4<\/p>\n<\/td>\n<td>\n<p align=\"left\">385 \u00b1 6 <strong>(x8.2)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Guided, 1, 2, 4<\/p>\n<\/td>\n<td>\n<p align=\"left\">388 \u00b1 8 <strong>(x8.3)<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 <strong>8.3 \u0440\u0430\u0437\u0430<\/strong>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0433\u0438\u043f\u0435\u0440\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043b\u0430 \u043d\u0430\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 <strong>38%<\/strong> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438!<\/p>\n<h3>\u0418\u0442\u043e\u0433\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435<\/h3>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043e\u0441\u043e\u0437\u043d\u0430\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u043a\u043e\u0434 \u0432 <strong>6.7 \u0440\u0430\u0437<\/strong>. \u0417\u0430\u0442\u0435\u043c, \u0445\u0438\u0442\u0440\u043e \u0437\u0430\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0432 \u043a\u043e\u0434, \u043c\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u044c. \u0410 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f OpenMP, \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 6 \u044f\u0434\u0435\u0440 \u0438 12 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u0434 \u0432 <strong>55.4<\/strong> \u0440\u0430\u0437, \u0441 <strong>7<\/strong> \u0434\u043e <strong>388 FPS.<\/strong> <\/p>\n<h2>\u0413\u043b\u0430\u0432\u0430 3. \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. CUDA.<\/h2>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 CUDA?<\/h3>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/CUDA\" rel=\"noopener noreferrer nofollow\"><strong>CUDA<\/strong><\/a> (<em>Compute Unified Device Architecture<\/em>)\u00a0\u2014 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e-\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0444\u0438\u0440\u043c\u044b Nvidia.<\/p>\n<\/blockquote>\n<p>\u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c <strong><em>NVCC<\/em><\/strong><em>, <\/em>\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c C\/C++ \u043a\u043e\u0434 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 CUDA \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435. \u041e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 GPU \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445.<\/p>\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443, \u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c.<\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 CUDA<\/h3>\n<pre><code class=\"cpp\">__global__ void mandelbrot_kernel(sf::Uint8* pixels) {     \/\/ \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432     int screen_x = blockIdx.x * 16 + threadIdx.x;     int screen_y = blockIdx.y * 16 + threadIdx.y;      if (screen_x &gt;= WINDOW_WIDTH || screen_y &gt;= WINDOW_HEIGHT)          return;      \/\/ \u0414\u0430\u043b\u0435\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:     float \u0441_x = -1.0f + screen_x * (2.0f \/ WINDOW_WIDTH);     float c_y = -1.0f + screen_y * (2.0f \/ WINDOW_HEIGHT);      int iterations = 0;     float z_x  = 0.0f, z_y  = 0.0f,            z_x2 = 0.0f, z_y2 = 0.0f;      while (z_x2 + z_y2 &lt; MAX_RADIUS_2 &amp;&amp; iterations &lt; MAX_ITERATION_DEPTH) {         z_y = 2 * z_x * z_y + c_y;         z_x = z_x2 - z_y2   + c_x;         z_x2 = z_x * z_x;         z_y2 = z_y * z_y;         iterations++;     }      \/\/ ... \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0446\u0432\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044f (\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e) }  void mandelbrot_cuda(sf::Uint8* pixels) {     size_t size = WINDOW_WIDTH * WINDOW_HEIGHT * 4 * sizeof(sf::Uint8);      \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430 GPU     \/\/ (\u0420\u0430\u0434\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437)     sf::Uint8* d_pixels = nullptr;     cudaMalloc(&amp;d_pixels, size);      \/\/ \u0417\u0430\u0434\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0431\u043b\u043e\u043a\u0430 \u0438 \u0441\u0435\u0442\u043a\u0438     dim3 blockSize(16, 16);     dim3 gridSize((WINDOW_WIDTH  + 15) \/ 16,                   (WINDOW_HEIGHT + 15) \/ 16);      \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u0435\u0440\u043d\u0435\u043b \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u0431\u043b\u043e\u043a\u0430 \u0438 \u0441\u0435\u0442\u043a\u0438     mandelbrot_kernel&lt;&lt;&lt;gridSize, blockSize&gt;&gt;&gt;(d_pixels);      \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 GPU     cudaMemcpy(pixels, d_pixels, size, cudaMemcpyDeviceToHost);      \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c     cudaFree(d_pixels); }<\/code><\/pre>\n<h4>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/h4>\n<ul>\n<li>\n<p><strong>\u041a\u0435\u0440\u043d\u0435\u043b (kernel) <\/strong> \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u0430\u044f \u043d\u0430 GPU. \u0427\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0435\u0440\u043d\u0435\u043b, \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u043c \u043f\u0438\u0448\u0435\u0442\u0441\u044f <code>__global__<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0442\u043e\u043a<\/strong> <strong>(thread)<\/strong> \u2014 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0438\u043a\u0441\u0435\u043b\u044c, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u0435\u0440\u043d\u0435\u043b \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u043b\u043e\u043a (thread block) <\/strong>\u2014 \u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e \u0442\u0440\u0435\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d (16, 16) \u2014 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439. (<a href=\"https:\/\/stackoverflow.com\/questions\/9985912\/how-do-i-choose-grid-and-block-dimensions-for-cuda-kernels\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e 16?<\/a>)<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0435\u0442\u043a\u0430 (grid) <\/strong>\u2014 \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u043b\u043e\u043a\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e \u0442\u0440\u0435\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0431\u043b\u043e\u043a\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6c5\/3c7\/23a\/6c53c723a57d599fc586a2ef9212bd96.png\" alt=\"\u0412\u0437\u044f\u0442\u043e \u0438\u0437 CUDA C++ Programming Guide.\u0421\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a\" title=\"\u0412\u0437\u044f\u0442\u043e \u0438\u0437 CUDA C++ Programming Guide.\u0421\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a\" width=\"3620\" height=\"1720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6c5\/3c7\/23a\/6c53c723a57d599fc586a2ef9212bd96.png\"\/><\/p>\n<div><figcaption>\u0412\u0437\u044f\u0442\u043e \u0438\u0437 <a href=\"https:\/\/docs.nvidia.com\/cuda\/cuda-c-programming-guide\/index.html\" rel=\"noopener noreferrer nofollow\">CUDA C++ Programming Guide<\/a>.<br \/>\u0421\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a<\/figcaption><\/div>\n<\/figure>\n<ul>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u044d\u043a\u0440\u0430\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0440\u044e\u043a \u0441 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u0432\u0435\u0440\u0445:<\/p>\n<pre><code class=\"cpp\">dim3 gridSize((WINDOW_WIDTH  + 15) \/ 16,               (WINDOW_HEIGHT + 15) \/ 16);<\/code><\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li>\n<p>\u0424\u043e\u0440\u043c\u0443\u043b\u0430 <code>screen_x = blockIdx.x * 16 + threadIdx.x<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0437\u043d\u0430\u044f \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0432 \u0441\u0435\u0442\u043a\u0435 <code>blockIdx.x<\/code> \u0438 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0431\u043b\u043e\u043a\u0435 <code>threadIdx.x<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u0442\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0440\u043e\u0432\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u043f\u043e 16, \u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u044d\u043a\u0440\u0430\u043d\u0430. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u043d\u0443\u0436\u043d\u043e <strong>\u0432\u0441\u0435\u0433\u0434\u0430 <\/strong>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442:<\/p>\n<pre><code class=\"cpp\">if (screen_x &gt;= WINDOW_WIDTH || screen_y &gt;= WINDOW_HEIGHT)      return;<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u0435\u0440\u043d\u0435\u043b\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043f\u043e\u043c\u0438\u043c\u043e \u0430\u0433\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0438 \u0441\u0435\u0442\u043a\u0438.<\/p>\n<pre><code class=\"cpp\">mandelbrot_kernel&lt;&lt;&lt;gridSize, blockSize&gt;&gt;&gt;(d_pixels);<\/code><\/pre>\n<\/li>\n<\/ul>\n<h3>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 CUDA<\/h3>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u2014 \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0439 \u043a\u0443\u043b\u0435\u0440 \u0443\u0436\u0435 \u043d\u0435 \u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u0443\u043c\u0430.<br \/>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c: <strong>950 \u00b1 5 fps (x2.4)?<\/strong><\/p>\n<p>\u041c\u0430\u043b\u043e\u0432\u0430\u0442\u043e. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b. \u0412\u0441\u0451 \u0434\u0435\u043b\u043e \u0432 <code>cudaMemcpy<\/code> \u2014 \u043f\u043e\u0441\u043b\u0435 \u0435\u0451 \u0432\u044b\u0437\u043e\u0432\u0430 GPU \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u0435\u0442, \u043e\u0436\u0438\u0434\u0430\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u042d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043c\u0441\u044f \u043a \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0435\u043b\u0443 <strong>PCI-E 16x <\/strong>\u2014 \u0448\u0438\u043d\u044b, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 GPU. \u042d\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e <strong>16 \u0413\u0431\u0430\u0439\u0442\/\u0441 \/ (1920x1080x4 \u0431\u0430\u0439\u0442) \u2248 2000 fps<\/strong>.<\/p>\n<p>\u041d\u043e \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043f\u0440\u043e \u044d\u0442\u043e. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440 \u043c\u044b \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 GPU \u043d\u0430 CPU \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0414\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: 6100 \u00b1 50 FPS<br \/><\/strong>\u042d\u0442\u043e \u0432 <strong>15.7 \u0440\u0430\u0437 <\/strong>\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0432 <strong>870 \u0440\u0430\u0437 <\/strong>\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0439!<strong> <\/strong><\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430, \u0443\u0441\u043a\u043e\u0440\u0438\u0432 \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0447\u0442\u0438 3 \u043f\u043e\u0440\u044f\u0434\u043a\u0430!<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\"><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041d\u0430\u0438\u0432\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0 \u00b1 0.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">SIMD &#8212; \u0440\u0443\u0447\u043d\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">47.0 \u00b1 0.1<strong> (x6.7)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">SIMD &#8212; \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u0430\u044f \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">46.8 \u00b1 0.1 <strong>(x6.7)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f &#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f <\/p>\n<\/td>\n<td>\n<p align=\"left\">186 \u00b1 7 <strong>(x4.0)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f &#8212; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">385 \u00b1 6 <strong>(x8.2)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f &#8212; guided<\/p>\n<\/td>\n<td>\n<p align=\"left\">388 \u00b1 8 <strong>(x8.3)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">CUDA<\/p>\n<\/td>\n<td>\n<p align=\"left\">6100 \u00b1 50 <strong>(x15.7)<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439 \u0431\u044b\u043b, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043b\u0435\u0433\u043a\u043e-\u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/893336\/\"> https:\/\/habr.com\/ru\/articles\/893336\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430 \u2014 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 (<strong>embarrassingly <\/strong>parallel problem).<\/p>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043f\u043e\u0438\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438 (intrinsics) \u0438, \u043d\u0435 \u0442\u0435\u0440\u044f\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043c SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u0432 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0435\u0441\u0446\u0435\u043d\u0438\u043c \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u0441\u0442\u0430\u0440\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u043c\u0438 \u043d\u0430 CUDA.<\/p>\n<figure class=\"full-width\"><\/figure>\n<h2>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u043a\u0443\u0440\u0441\u0435 \u041c\u0424\u0422\u0418, \u043d\u0430 \u0424\u0430\u043a\u0443\u043b\u044c\u0442\u0435\u0442\u0435 \u0440\u0430\u0434\u0438\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0438 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043d\u0430\u0448 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e, <a href=\"https:\/\/wiki.mipt.tech\/index.php\/%D0%94%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D0%98%D0%BB%D1%8C%D1%8F_%D0%A0%D1%83%D0%B4%D0%BE%D0%BB%D1%8C%D1%84%D0%BE%D0%B2%D0%B8%D1%87\" rel=\"noopener noreferrer nofollow\">\u0418\u043b\u044c\u044f \u0414\u0435\u0434\u0438\u043d\u0441\u043a\u0438\u0439<\/a>, \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b \u043d\u0430\u0441 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 x86-64, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430 \u0438 \u0435\u0433\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u042d\u0442\u0430 \u0442\u0435\u043c\u0430 \u0441\u0440\u0430\u0437\u0443 \u043c\u0435\u043d\u044f \u0443\u0432\u043b\u0435\u043a\u043b\u0430, \u0438 \u044f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043c\u0435\u0441\u0442\u0440\u0430 \u043c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u043d\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0438 \u0437\u043d\u0430\u043d\u0438\u0439. \u0421\u043f\u0443\u0441\u0442\u044f \u0433\u043e\u0434 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u043e\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0431\u0435\u043b.<\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430?<\/h2>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%9C%D0%B0%D0%BD%D0%B4%D0%B5%D0%BB%D1%8C%D0%B1%D1%80%D0%BE%D1%82%D0%B0\" rel=\"noopener noreferrer nofollow\"><strong>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u041c\u0430\u043d\u0434\u0435\u043b\u044c\u0431\u0440\u043e\u0442\u0430<\/strong><\/a>\u00a0\u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u0447\u0435\u043a <strong><em>c<\/em><\/strong> \u043d\u0430 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u043a\u0443\u0440\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 <strong><em>z\u2099\u208a\u2081 = z\u2099\u00b2 + c<\/em><\/strong> \u0437\u0430\u0434\u0430\u0451\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 <strong>z\u2080 = 0<\/strong>.<\/p>\n<\/blockquote>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0442\u043e\u0447\u043a\u0443 <strong><em>c <\/em><\/strong>\u043d\u0430 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0451 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 <strong>z\u2099<\/strong>. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0437\u0430\u0434\u0430\u0447\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439\u200b. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0432\u0435\u0441\u0442\u0438 <strong>\u0440\u044f\u0434 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0439<\/strong>:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0448\u0430\u0433\u0435 <strong><em>z\u2099\u00b2 &gt; 4 <\/em><\/strong>(\u0438\u043b\u0438 <strong>|z\u2099| &gt; 2<\/strong>), \u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 <strong><em>N<\/em><\/strong>: \u0435\u0441\u043b\u0438 \u0437\u0430 <strong><em>N<\/em><\/strong> \u0448\u0430\u0433\u043e\u0432 <strong>|<em>z\u2099| <\/em><\/strong>\u0442\u0430\u043a \u0438 \u043d\u0435 \u0432\u044b\u0448\u0435\u043b \u0437\u0430 \u0440\u0430\u0434\u0438\u0443\u0441 <strong>2<\/strong>, \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0443\u0436\u0435 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u2014 \u0435\u0451 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f <strong>\u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0435\u043c\u043e\u0441\u0442\u044c.<\/strong> \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0441\u043e\u0441\u0435\u0434\u0435\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0425\u043e\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0441\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430, \u043d\u043e, &#171;\u0432\u043e \u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e&#187;, \u0430, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441 \u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438.<\/p>\n<p>\u0414\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0439 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c<strong> \u0446\u0432\u0435\u0442\u043e\u0432\u0443\u044e \u043f\u0430\u043b\u0438\u0442\u0440\u0443<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0442\u043e\u0447\u043a\u0430 \u00ab\u0443\u0431\u0435\u0436\u0430\u043b\u0430\u00bb \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0440\u0430\u0434\u0438\u0443\u0441\u0430 <strong>2<\/strong>. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u043e\u0447\u043a\u0430 \u043d\u0435 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430 \u0440\u0430\u0434\u0438\u0443\u0441 \u0437\u0430 <strong><em>N<\/em><\/strong> \u0448\u0430\u0433\u043e\u0432 \u2014 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043c \u0435\u0439 \u0447\u0435\u0440\u043d\u044b\u0439 \u0446\u0432\u0435\u0442.<\/p>\n<p>\u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/www.sfml-dev.org\/\" rel=\"noopener noreferrer nofollow\">SFML<\/a> \u0432\u0435\u0440\u0441\u0438\u0438 2.6)<\/p>\n<pre><code class=\"cpp\">sf::Color get_color(int iteration, int maxIterations) {     if (iteration &gt;= maxIterations) {         return sf::Color::Black;     }       const float colorScale = 255.0f \/ maxIterations;     const float iterNormalized = iteration * colorScale;      const sf::Uint8 r = (sf::Uint8)(iterNormalized \/ 2 + 0);     const sf::Uint8 g = (sf::Uint8)(iterNormalized * 2 + 2);     const sf::Uint8 b = (sf::Uint8)(iterNormalized * 2 + 5);      return sf::Color(r, g, b, 255); }<\/code><\/pre>\n<p>\u0420\u0430\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0430\u043b\u0438\u0442\u0440\u044b, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443:<\/p>\n<figure class=\"full-width\"><\/figure>\n<figure class=\"full-width\"><\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c.<\/p>\n<h2>\u0413\u043b\u0430\u0432\u0430 1. \u041e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<h2>\u041d\u0430\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435:<\/p>\n<pre><code class=\"python\">for each (c_x, c_y) on complex plane:     z_x, z_y, iteration = 0.0     while (z_x\u00b2 + z_y\u00b2 \u2264 4 AND iteration &lt; 256):         xtemp = z_x\u00b2 - z_y\u00b2 + c_x  # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c z\u00b2 + c         z_y = 2*z_x*z_y + c_y      # \u041c\u043d\u0438\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u044c z\u00b2 + c         z_x = xtemp         iteration++     set_color_by_iteration(c_x, c_y, iteration)<\/code><\/pre>\n<ul>\n<li>\n<p><strong><em>z_x<\/em><\/strong> \u0438 <strong>z_<em>y<\/em><\/strong> \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438 \u043c\u043d\u0438\u043c\u0430\u044f \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 <strong><em>z<\/em><\/strong><\/p>\n<\/li>\n<li>\n<p><strong><em>c_x<\/em><\/strong> \u0438 <strong><em>c_y<\/em><\/strong> \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0442\u043e\u0447\u043a\u0438 <strong><em>c<\/em><\/strong> \u043d\u0430 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 <\/p>\n<\/li>\n<li>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438 \u043c\u043d\u0438\u043c\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437: <strong><em>z\u00b2 = (x + iy)\u00b2 = x\u00b2 &#8212; y\u00b2 + 2xyi<\/em><\/strong><\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u044f\u0437\u044b\u043a\u0435 C \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438: <\/p>\n<pre><code class=\"cpp\">void mandelbrot_naive()  {     for (int screen_y = 0; screen_y &lt; WINDOW_HEIGHT; screen_y++)     {         for (int screen_x = 0; screen_x &lt; WINDOW_WIDTH; screen_x++)         {             \/\/ [0, 1920] x [0, 1080] -&gt; [-1, 1] x [-1, 1]             float c_y = -1.0f + screen_y * (2.0f \/ WINDOW_HEIGHT);             float c_x = -1.0f + screen_x * (2.0f \/ WINDOW_WIDTH);              float z_x = 0.0f, z_x2 = 0.0f,                   z_y = 0.0f, z_y2 = 0.0f;              int iterations = 0;              while (z_x2 + z_y2 &lt; MAX_RADIUS_2 &amp;&amp;                    iterations &lt; MAX_ITERATION_DEPTH)              {                 z_y = 2 * z_x * z_y + c_y;                 z_x = z_x2 - z_y2 + c_x;                  z_x2 = z_x * z_x;                 z_y2 = z_y * z_y;                  iterations++;             }              sf::Color color = get_color(iterations, 256);                        draw_pixel(screen_x, screen_y, color); \/\/ \u0420\u0438\u0441\u0443\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0446\u0432\u0435\u0442\u043e\u043c,                                                     \/\/ \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u043c \u043e\u0442 \u043a-\u0432\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439         }     } }<\/code><\/pre>\n<h4>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f \u043e\u0442 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0430<\/h4>\n<ul>\n<li>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f <strong>z_<em>x\u00b2 <\/em><\/strong>\u0438<strong><em> z_y\u00b2<\/em><\/strong>, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0434\u0438\u0443\u0441\u0430, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0418\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u0438 \u0446\u0438\u043a\u043b\u0430,<\/p>\n<\/li>\n<li>\n<p>\u0423\u0431\u0440\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <strong><em>xtemp.<\/em><\/strong><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041f\u0438\u043a\u0441\u0435\u043b\u0438 \u044d\u043a\u0440\u0430\u043d\u0430 <strong><em>(screen_x, screen_y)<\/em><\/strong> \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c <strong><em>[-1, +1] \u00d7 [-1, +1]<\/em><\/strong> \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f\u043c\u0438. \u041e\u043d\u0438 \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0430, \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435. \u041f\u043e\u043b\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0444\u0438\u0447\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/nniikon\/Mandelbrot\" rel=\"noopener noreferrer nofollow\">\u0443 \u043c\u0435\u043d\u044f \u043d\u0430 GitHub<\/a>.<\/p>\n<\/blockquote>\n<p><em>\u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e, \u0432\u0430\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435.<\/em><\/p>\n<h3>\u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a (\u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b)<\/h3>\n<h4>\u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e SFML \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0435\u0451 &#171;\u0433\u043b\u0430\u0437\u043a\u0430\u043c\u0438&#187; (\u043e\u0431\u044b\u0447\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0447\u0442\u043e-\u0442\u043e \u0438\u0434\u0451\u0442 \u043d\u0435 \u0442\u0430\u043a, \u044d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c). <\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0430 (\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438) \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e (<em>N)<\/em> \u0440\u0430\u0437, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d, \u0442.\u043a. \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u043c\u044b \u0436\u0435 \u0445\u043e\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0430 \u043d\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438). \u042f \u0432\u044b\u0431\u0438\u0440\u0430\u043b <em>N <\/em>\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 5 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>\u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <a href=\"https:\/\/github.com\/sharkdp\/hyperfine\" rel=\"noopener noreferrer nofollow\">hyperfine<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b hyperfine<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f FPS<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>FPS   = 200 \u043a\u0430\u0434\u0440\u043e\u0432 \/ 4.272 \u0441\u0435\u043a\u0443\u043d\u0434 \u2248 46.8 fps (\u043a\u0430\u0434\u0440\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443)<\/p>\n<\/li>\n<li>\n<p>dFPS = (0.019 \/ 4.272) * 46.8fps \u2248 0.2 fps<\/p>\n<p><strong>\u0418\u0442\u043e\u0433\u043e:<\/strong> (46.8 \u00b1 0.2) fps<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h4>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<details class=\"spoiler\">\n<summary>\u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/summary>\n<div class=\"spoiler__content\">\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">CPU<\/p>\n<\/td>\n<td>\n<p align=\"left\">AMD Ryzen 5 5600H @ 3.3 GHz <br \/>(6 \u044f\u0434\u0435\u0440 \/ 12 \u043f\u043e\u0442\u043e\u043a\u043e\u0432)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">16 GB DDR4 @ 3200 MHz<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041e\u0421<\/p>\n<\/td>\n<td>\n<p align=\"left\">Arch Linux (\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0434\u0440\u0430 6.13.5-arch1-1)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">Clang 19.1.7, GCC 14.2.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">1920\u00d71080 (Full HD)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"351\" width=\"351\">\n<p align=\"left\">\u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">256<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/details>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><strong>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0444\u043b\u0430\u0433\u0438<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, FPS<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC, -O2 \u0438 \u0432\u044b\u0448\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0 \u00b1 0.1<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang, -O1 \u0438 \u0432\u044b\u0448\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.0 \u00b1 0.1<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<h4>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 SIMD?<\/h4>\n<blockquote>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/SIMD\" rel=\"noopener noreferrer nofollow\"><strong>SIMD<\/strong><\/a> (Single Instruction, Multiple Data) \u2014 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/blockquote>\n<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 CPU \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/X86-64\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 x86-64<\/a> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/AVX\" rel=\"noopener noreferrer nofollow\"><strong>AVX\/AVX2<\/strong><\/a>) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 256-\u0431\u0438\u0442\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b (<strong>ymm0-ymm15<\/strong>), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c 8 \u0447\u0438\u0441\u0435\u043b \u0442\u0438\u043f\u0430 float. <\/p>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0437\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\/\u0438\u043b\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432. \u041e\u0431\u044b\u0447\u043d\u043e, \u043e\u043d\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u044e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/MMX\" rel=\"noopener noreferrer nofollow\">MMX<\/a>), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u044b \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\/\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\u044b\u0445 \u0430\u0443\u0434\u0438\u043e- \u0438 \u0432\u0438\u0434\u0435\u043e\u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 <strong>ymm1<\/strong> \u0438 <strong>ymm2<\/strong> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a: <br \/><strong>ymm1<\/strong> = [a\u2080, a\u2081, a\u2082, a\u2083, a\u2084, a\u2085, a\u2086, a\u2087]<br \/><strong>ymm2<\/strong> = [b\u2080, b\u2081, b\u2082, b\u2083, b\u2084, b\u2085, b\u2086, b\u2087]<br \/><strong>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/strong>: [a\u2080+b\u2080, a\u2081+b\u2081, &#8230;, a\u2087+b\u2087]<br \/>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0432\u043e\u0441\u0435\u043c\u044c. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0437\u0430 \u0440\u0430\u0437, \u0447\u0442\u043e, \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a 8-\u043a\u0440\u0430\u0442\u043d\u043e\u043c\u0443 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044e.<\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 SIMD \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u043e\u0432<\/h4>\n<details class=\"spoiler\">\n<summary> \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434\u0435 (\u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">c_step_x = 2.0 \/ WIDTH c_step_y = 2.0 \/ HEIGHT  c_y  = -1.0 for screen_y in 0 to HEIGHT:     \/\/ \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u043d\u0438\u0436\u043d\u0438\u043c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c     _c_x = [-1.0 + 0 * c_step_x,             -1.0 + 1 * c_step_x,             ...,             -1.0 + 7 * c_step_x]      for screen_x in 0 to WIDTH step 8:         _z_x        = [0.0, 0.0, .., 0.0]         _z_y        = [0.0, 0.0, .., 0.0]         _z_x2       = [0.0, 0.0, .., 0.0]         _z_y2       = [0.0, 0.0, .., 0.0]         _z_xy       = [0.0, 0.0, .., 0.0]          _iterations = [0, 0, .., 0]          for iteration in 0 to MAX_ITERATIONS:             _radius_sq = _z_x * _z_x + _z_y * _z_y              _cmp_mask = [0.0, 0.0, .., 0.0]             for i in 0..7:                 if radius_sq[i] &lt; MAX_RADIUS_SQ:                     _cmp_mask[i] = -1.0                 else:                     _cmp_mask[i] = 0.0              if _cmp_mask == [0.0, 0.0, .., 0.0]:                 break              for i in 0..7:                 _z_x[i] = _z_x2 - _z_y2 + _c_x                 _z_y[i] = 2 * _z_xy + _c_y              _iterations -= _cmp_mask              _z_x2 = _z_x * _z_x             _z_y2 = _z_y * _z_y             _z_xy = _z_x * _z_y          for i in 0..7:             set_color(screen_x + i, screen_y, iterations[i])          _c_x += [step_x, step_x, ..., step_x]      _c_y += step_y<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 C++ \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &lt;x86intrin.h&gt;<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;x86intrin.h&gt;  void mandelbrot_vectorized() {     const __m256 _01234567 = _mm256_set_ps(7.0f, 6.0f, 5.0f, 4.0f,                                             3.0f, 2.0f, 1.0f, 0.0f);      \/\/ \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u043d\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c c_x \u0438 c_y,     \/\/  \u0431\u0443\u0434\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 c_step_x \u0438 c_step_y.     const float c_step_x = (2.0f \/ WINDOW_WIDTH);      \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440 8\u044e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438     const __m256 _c_step_x    = _mm256_set1_ps(c_step_x);      const __m256 _8_c_steps_x = _mm256_set1_ps(c_step_x * 8);      const float c_step_y = (2.0f \/ WINDOW_HEIGHT);     const __m256 _c_step_y = _mm256_set1_ps(c_step_y);      __m256 _max_radius2 = _mm256_set1_ps(MAX_RADIUS_2);      float c_y = -1.0f;     __m256 _c_y = _mm256_set1_ps(c_y);      for (int screenY = 0;           screenY &lt; WINDOW_HEIGHT;           screenY++, c_y += c_step_y)     {         float c_x = -1.0f;         __m256 _c_x = _mm256_set1_ps(c_x);          \/\/ \u0421\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 X-\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0434\u043b\u044f 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439:         \/\/ <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-452745","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/452745","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=452745"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/452745\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=452745"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=452745"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=452745"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}