{"id":360170,"date":"2024-05-21T00:47:50","date_gmt":"2024-05-21T00:47:50","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=360170"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=360170","title":{"rendered":"<span>\u041e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c<\/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>\u0412 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430\u0445 \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0441\u0442\u0430\u043c \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0430\u0445 \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u0440\u043e\u0439 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 64-x \u0431\u0430\u0439\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0442\u0438\u043f\u0430 \u00ab\u0434\u043b\u0438\u043d\u0430 \u0438\u043b\u0438 \u0448\u0430\u0433 \u0441\u0442\u0440\u043e\u043a\u0438 (LineWidth\/StepWidth, Stride)\u00bb, \u00ab\u0437\u0430\u0437\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f (Alignment Gaps)\u00bb, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0432 \u043a\u0443\u0440\u0441\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043b\u0438\u043d\u0438\u0439 \u043a\u044d\u0448\u0430 \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0442\u043e \u0432\u0430\u043c, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0442\u0435, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u2014 \u043c\u043e\u0433\u0443\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c, \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0434\u0443\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0421\u0438 \u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435, \u043f\u0430\u0440\u0430 LabVIEW \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f OpenCV. \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441 \u043a\u0430\u043c\u0443\u0448\u043a\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c AVX2, \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0434 Windows 11 x64.<\/p>\n<hr\/>\n<p>\u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u2014 \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u043d\u0438 \u0441 \u043e\u0434\u043d\u0438\u043c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043d\u0438\u0436\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044d\u0442\u043e\u0442 \u0447\u0438\u0441\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0441\u0442 \u043d\u0435 \u043d\u0435\u0441\u0451\u0442.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 OpenCV \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0441 \u043a\u043e\u0434\u0430 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">#include \"OpenCV\/opencv.hpp\" using namespace cv; \/\/... Mat Src = imread(\"Building.jpg\"); imshow(\"Building\", Src); waitKey(0); <\/code><\/pre>\n<p>\u00abBuilding.jpg\u00bb \u2014 \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 OpenCV (\u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0439 \u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0425\u0430\u0444\u0430). \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e (\u043d\u0443, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 Dst, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0430\u043c \u0438 \u044f \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c<\/p>\n<pre><code class=\"cpp\">Mat Dst = 255 - Src; <\/code><\/pre>\n<p>\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u043d\u0438\u0436\u0435 \u043f\u043e\u0439\u043c\u0451\u0442\u0435, \u0437\u0430\u0447\u0435\u043c \u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">Mat Src = imread(\"Building.jpg\", CV_8U); \/\/load as grayscale  int Width = Src.cols; int Height = Src.rows;  Mat Dst(Height, Width, CV_8U);  for (int i = 0; i &lt; Width * Height; i++) Dst.data[i] = 255 - Src.data[i];  imshow(\"Building Dst\", Dst); println(\"Hit Enter to continue\"); waitKey(0); <\/code><\/pre>\n<p>\u0412\u044b\u0448\u0435 \u044f \u0447\u0438\u0442\u0430\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043a\u0430\u043a \u0441\u0435\u0440\u0443\u044e \u043e\u0434\u043d\u043e\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u0432\u043e\u0441\u044c\u043c\u0438\u0431\u0438\u0442\u043d\u0443\u044e. \u041f\u043e\u043a\u0430 \u0432\u0441\u0451 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u043d\u0435\u0433\u0430\u0442\u0438\u0432, \u043a\u0430\u043a \u0435\u0441\u0442\u044c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/af\/bg\/p8\/afbgp8lxydroqhnxothsum630d8.jpeg\" alt=\"\u043d\u0435\u0433\u0430\u0442\u0438\u0432\" data-src=\"https:\/\/habrastorage.org\/webt\/af\/bg\/p8\/afbgp8lxydroqhnxothsum630d8.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u043d\u0435\u0433\u0430\u0442\u0438\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u00ab\u043d\u0443\u043b\u0435\u0432\u044b\u0445\u00bb \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 Src.data \u0438 Dst.data \u0432 \u043e\u0431\u043e\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u0442\u043e \u0432\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0448\u0435\u0441\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0431\u0430\u0439\u0442 (\u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 64 \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u0442\u043a\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0448\u0435\u0441\u0442\u044c \u0431\u0438\u0442\u043e\u0432 \u0443 \u044d\u0442\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b, \u0441\u0442\u0430\u043b\u043e \u0431\u044b\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0435 \u0446\u0438\u0444\u0440\u044b \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 00, 40, 80 \u0438\u043b\u0438 \u04210, \u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 64):<\/p>\n<pre><code class=\"cpp\">    printf(\"Src ptr = 0x%p, Dst ptr = 0x%p\\n\", Src.data, Dst.data);          Src ptr = 0x000001B98E6C00C0, Dst ptr = 0x000001B98FC900C0 <\/code><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u2014 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0432 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 OpenCV:  <a href=\"https:\/\/github.com\/opencv\/opencv\/blob\/4.x\/modules\/core\/src\/alloc.cpp#L154\" rel=\"noopener noreferrer nofollow\">alloc.cpp<\/a> \u0438 <a href=\"https:\/\/github.com\/opencv\/opencv\/blob\/4.x\/modules\/core\/include\/opencv2\/core\/private.hpp#L119\" rel=\"noopener noreferrer nofollow\">private.hpp<\/a>, \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/aligned-malloc?view=msvc-170\" rel=\"noopener noreferrer nofollow\">_aligned_malloc<\/a>, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\/* the alignment of all the allocated buffers *\/ #define  CV_MALLOC_ALIGN    64 \/\/... void* ptr = _aligned_malloc(size, CV_MALLOC_ALIGN); <\/code><\/pre>\n<p>\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435? \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 (\u044f \u043e\u0447\u0435\u043d\u044c \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0436\u0443 \u00ab\u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435\u00bb) \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 64 \u0431\u0430\u0439\u0442\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0431\u0430\u0439\u0442 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u0432\u0441\u0435 \u0435\u0433\u043e \u0448\u0435\u0441\u0442\u044c\u0434\u0435\u0441\u044f\u0442 \u0442\u0440\u0438 \u0441\u043e\u0441\u0435\u0434\u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u044d\u0448. \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0441\u043e\u0441\u0435\u0434\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0432 \u043a\u044d\u0448\u0435, \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0430 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439, \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438, \u0442\u043e \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 64 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u2014 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0439\u0442\u0435, \u0441\u043a\u0430\u0436\u0435\u043c, \u0433\u0438\u0431\u0438\u0431\u0430\u0439\u0442 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043b\u0438\u0431\u043e \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u043f\u043e 64 \u0431\u0430\u0439\u0442\u0430, \u0437\u0430\u043c\u0435\u0440\u044c\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u0432\u044b \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0443, \u0445\u043e\u0442\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0442\u0430\u043c \u0438 \u0441\u044f\u043c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e:<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; N\/64; i++) dst[i] = src[i];  for (int i = 0; i &lt; N; i+=64) dst[i] = src[i]; <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043f\u043e \u00ab\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u00bb \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a 32-\u0445 \u0431\u0430\u0439\u0442\u0430\u043c (\u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 32 \u0431\u0430\u0439\u0442\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439) \u043f\u0440\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c 16-\u0442\u0438 \u0431\u0430\u0439\u0442\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 malloc(), \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043b\u0438\u043d\u0438\u0439 \u043a\u044d\u0448\u0430, \u0447\u0442\u043e \u0438 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u043c\u0430\u0445\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0439. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 SIMD \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, AVX-512 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 64-\u0445 \u0431\u0430\u0439\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u044f\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u00ab\u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443\u00bb, \u043c\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0432\u0441\u0435\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 AVX \u043a\u043e\u043c\u0430\u043d\u0434 (\u0442\u0430\u043a \u043a\u0430\u043a AVX \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 16, \u0430 AVX2 \u2014 \u043d\u0430 32 \u0431\u0430\u0439\u0442\u0430). \u042d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0438 \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 AVX \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0430\u0440\u044b MOVDQU \u0438 MOVDQA \u043b\u0438\u0431\u043e MOVAPS \u0438 MOVUPS, \u0438 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0443\u0445\u043d\u0435\u0442 \u0432\u0430\u043c \u0432 \u0440\u0443\u043a\u0438 (\u0438\u043b\u0438 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a).<\/p>\n<h4>\u041f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435<\/h4>\n<p>\u041d\u043e \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Mat, \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u0448\u0430\u0433\u0430:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ui\/bn\/hu\/uibnhutjdyyjhth3j-xs4zk72uc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ui\/bn\/hu\/uibnhutjdyyjhth3j-xs4zk72uc.png\"\/><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0439 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 (\u043d\u0443 \u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u043a\u0442\u043e \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442) \u043f\u0438\u043a\u0441\u0435\u043b\u044c, \u043d\u043e \u0438 <strong>\u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430<\/strong> \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0431\u044b \u0441 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e 64. \u042d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0448\u0438\u0440\u0438\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 64, 128, 192, 256 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 868&#215;600 (\u044f \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u0437\u044f\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451) \u0438 868 \u043d\u0430\u0446\u0435\u043b\u043e \u043d\u0430 64 \u043d\u0443 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u043d\u0430 28 \u0431\u0430\u0439\u0442\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u2014 896. \u0427\u0442\u043e\u0431\u044b \u043e\u043a\u0440\u0443\u0433\u043b\u0438\u0442\u044c, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0441\u0442\u0430\u0449\u0438\u043b \u043e\u0442\u043a\u0443\u0434\u0430-\u0442\u043e \u0438\u0437 \u043d\u0435\u0434\u0440 StackOverflow:<\/p>\n<pre><code class=\"cpp\">#define ALIGN(__intptr, __align) ((__intptr) - 1u + (__align)) &amp; -(__align) <\/code><\/pre>\n<p>\u041d\u0443 \u0430 \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0442\u0435\u043c \u0436\u0435 _aligned_malloc, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">int LineWidth = ALIGN(Width, 64); uint8_t* pDst; pDst = (uint8_t*)_aligned_malloc(Height * LineWidth * sizeof(uint8_t), 64); Mat DstAligned(Height, Width, CV_8U, pDst, LineWidth); println(\"Alignment: Width = {}, aligned line width = {}\", Width, LineWidth); <\/code><\/pre>\n<p>\u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Mat \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0438\u0437\u0432\u043d\u0435. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 OpenCV \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c _aligned_free(pDst) \u0438 \u0438\u043c\u0435\u043d\u043d\u043e _aligned_free(), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e free().<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043c\u0435\u0441\u0442\u043e 868\u0445600 \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c 896\u0445600. \u0412 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u0448\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/td\/vc\/sa\/tdvcsakkwu4r_nqrnzs0nq53tca.png\" data-src=\"https:\/\/habrastorage.org\/webt\/td\/vc\/sa\/tdvcsakkwu4r_nqrnzs0nq53tca.png\"\/><\/figure>\n<p>\u0418 \u0432\u043e\u0442 \u044d\u0442\u0438 \u00ab\u0434\u044b\u0440\u043a\u0438\u00bb (\u0437\u0430\u0437\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 28 \u0431\u0430\u0439\u0442) \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Alignment Gaps (\u044f \u043f\u0440\u0438\u043d\u043e\u0448\u0443 \u043c\u043e\u0438 \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438 \u0437\u0430 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u043d\u043e \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0445\u043e\u0447\u0443 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u00ab\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00bb \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u0433, \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u044e\u0449\u0438\u0445 \u0440\u0443\u0441\u0441\u043a\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c).<\/p>\n<p>\u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u043a, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; Width * Height; i++)     DstAligned.data[i] = 255 - Src.data[i]; <\/code><\/pre>\n<p>\u0438\u0431\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u0432\u043e\u0442 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ug\/6l\/ct\/ug6lctkay5_hinvgpkfitlpnkde.jpeg\" alt=\"\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\" data-src=\"https:\/\/habrastorage.org\/webt\/ug\/6l\/ct\/ug6lctkay5_hinvgpkfitlpnkde.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u0435\u0439\u0448\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0435\u0433\u043e \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0443\u0447\u043b\u0438, \u043b\u0438\u0431\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u043b\u0438. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0438 \u00ab\u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c\u00bb \u0446\u0438\u043a\u043b\u043e\u043c, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044f \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 (\u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0448\u0438\u0440\u0438\u043d\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c, \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f, \u043d\u0435 \u0434\u043e\u0439\u0434\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f), \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0432 \u0441\u0438\u043b\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0410 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a (\u0432 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0447\u0442\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a):<\/p>\n<pre><code class=\"cpp\">for (int y = 0; y &lt; Height; y++) {     for (int x = 0; x &lt; Width; x++) {         DstAligned.data[y * AlignedWidth + x] = 255 - Src.data[y * Width + x];     } } <\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0435\u0442:<\/p>\n<pre><code class=\"cpp\">    uint8_t *pSrc, *pDst;     pSrc = Src.data;     pDst = DstAligned.data;      for (int y = 0; y &lt; Height; y++) {         for (int x = 0; x &lt; Width; x++) {             *pDst++ = 255 - *pSrc++;         }         pDst += AlignedWidth - Width;     } <\/code><\/pre>\n<p>(\u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438; \u043f\u043e \u043c\u043e\u0438\u043c \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c Visul Studio \u0431\u043e\u043b\u0435\u0435 \u00ab\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u00bb, \u0430 \u0432\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u043b\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u044b\u043d\u0447\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430)<\/p>\n<p>\u0418\u043b\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430\u0434\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043e\u0431\u043e\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u00ab\u043f\u0435\u0440\u0435\u0441\u043a\u043e\u0447\u0438\u0442\u044c\u00bb \u0447\u0435\u0440\u0435\u0437 \u0434\u044b\u0440\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">    for (int y = 0; y &lt; Height; y++) {         for (int x = 0; x &lt; Width; x++) {             *pDst++ = 255 - *pSrc++;         }         pSrc += AlignedWidthSrc - Width;         pDst += AlignedWidthDst - Width;     } <\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f? \u0420\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0446\u0432\u0435\u0442\u0430, \u0441\u043a\u0430\u0436\u0435\u043c \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 8 \u0438 16 \u0431\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043b\u0438\u0431\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u043a\u0430\u043d\u0442\u043e\u0432\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u0440\u0434\u044e\u0440\u0430 (\u043e \u043d\u0451\u043c \u0440\u0435\u0447\u044c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435)<\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043a\u0440\u043e\u043c\u0435 \u043b\u0451\u0433\u043a\u0438\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432 \u0432 \u0446\u0438\u043a\u043b\u0430\u0445 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u043f\u0430\u043c\u044f\u0442\u0438? \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e, \u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c, \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 \u0438 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>\u0412 OpenCV, \u043a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 isContinuous(), \u043e\u043d \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">    if (Src.isContinuous()) println(\"Src is continuous\");     if (!DstAligned.isContinuous()) println(\"Dst is not continuous\"); <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043d\u0430\u0434\u043e \u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f \u0438\u043b\u0438 \u043d\u0435\u0442)<\/p>\n<pre><code class=\"cpp\">Src.copyTo(DstAligned); Src.convertTo(DstAligned, CV_8U); <\/code><\/pre>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 OpenCV \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0422\u0430\u043a, \u0435\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Intel IPP, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u043f\u0430\u043c\u044f\u0442\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u044f <a href=\"https:\/\/www.intel.com\/content\/www\/us\/en\/docs\/ipp\/developer-reference\/2021-9\/malloc-001.html\" rel=\"noopener noreferrer nofollow\">ippiMalloc_<\/a>,  \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0435\u0440\u043e\u0439 \u0432\u043e\u0441\u044c\u043c\u0438\u0431\u0438\u0442\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">ippiMalloc_8u_C1(int widthPixels, int heightPixels, int* pStepBytes); <\/code><\/pre>\n<p>\u0418 \u0432\u043e\u0442 pStepBytes \u2014 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430\u0448\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 (\u0448\u0430\u0433) \u0441\u0442\u0440\u043e\u043a. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 Mat, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438 \u0434\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 OpenCV \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0438\u0437 Intel IPP, \u0441\u043a\u0430\u0436\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 imread(), \u043b\u0438\u0431\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0447\u0435\u0440\u0435\u0437 imshow().<\/p>\n<p>\u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439, \u00ab\u0440\u0430\u0441\u0448\u0430\u0440\u0438\u0432\u0430\u044f\u00bb \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438, \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b\u043c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<h4>\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/h4>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e OpenCV \u0438 Intel IPP \u044f \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 NI Vision Development Toolkit (\u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f). \u042d\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0435 \u0442\u0430\u043a \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430, \u043d\u043e \u043e\u0431\u0449\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 OpenCV \u0438\u043b\u0438 Intel IPP (\u0442\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e DLL, \u0438 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u043f\u0440\u0438\u0435\u0442\u0430\u0440\u043d\u044b\u0439 \u0442\u0438\u043f), \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441\u044b. \u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0442\u0430\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/documentation.help\/NI-Vision-LabWindows.CVI-Function\/imaqCreateImage.htm\" rel=\"noopener noreferrer nofollow\">imaqCreateImage()<\/a>, \u0442\u043e \u0432 \u043d\u0435\u0439 \u0442\u043e\u0436\u0435 \u0438\u0434\u0451\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 64 \u0431\u0430\u0439\u0442\u0430, \u043a\u0430\u043a \u0438 \u0432 Intel IPP, \u0430 \u0432\u043e\u0442 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u0430\u0436 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 4096 \u0431\u0430\u0439\u0442. \u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e? \u041a\u0430\u043a \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 (\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0442\u043e \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0438\u0434\u0451\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0422\u0430\u043d\u0435\u043d\u0431\u0430\u0443\u043c\u0430 \u0438\u043b\u0438 \u0420\u0443\u0441\u0441\u0438\u043d\u043e\u0432\u0438\u0447\u0430), \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u0443\u044e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e, \u0438 \u0432\u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043a\u0430\u043a \u0440\u0430\u0437 <a href=\"https:\/\/devblogs.microsoft.com\/oldnewthing\/20210510-00\/?p=105200\" rel=\"noopener noreferrer nofollow\">\u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430<\/a> (\u0432 \u043d\u0430\u0448\u0435\u043c \u0447\u0430\u0441\u0442\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 Windows \u043d\u0430 x86-64). \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0437 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043d\u044f\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e (\u0441\u043a\u0430\u0436\u0435\u043c, \u0434\u0435\u0441\u044f\u0442\u0438\u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445, \u0445\u043e\u0442\u044f \u043c\u043e\u0433 \u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u0440\u0438), \u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 64 \u0431\u0430\u0439\u0442\u0430 \u043d\u0430\u0441 \u043d\u0435 \u0441\u043f\u0430\u0441\u0430\u0435\u0442, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0440\u0430\u0432\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 4096 \u0431\u0430\u0439\u0442:<\/p>\n<pre><code class=\"cpp\">uint8_t *Dst; Dst = (uint8_t*)_aligned_malloc(LineWidth * Height * sizeof(uint8_t), 4096); <\/code><\/pre>\n<p>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u0430\u043a \u0436\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043a\u0430\u043a \u0438 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043b\u0438\u043d\u0438\u0439, \u0432 \u044d\u0442\u043e\u043c \u043e\u0431\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0447\u0451\u043c-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0438, \u0445\u043e\u0442\u044f \u043f\u0440\u0438\u0440\u043e\u0434\u0430 \u0443 \u043d\u0438\u0445 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u0430\u044f.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u0431\u043e\u0440\u0434\u044e\u0440\u043e\u043c (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 \u0442\u0440\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0430), \u0438 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 (\u0441\u043a\u0430\u0436\u0435\u043c, \u0441\u0432\u0451\u0440\u0442\u043a\u043e\u0439 \u0438\u043b\u0438 \u043c\u0435\u0434\u0438\u0430\u043d\u043e\u0439), \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043c\u0435\u043b\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u00ab\u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438\u00bb \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043b\u0435\u0432\u0435\u0435 \u043a\u0440\u0430\u0439\u043d\u0438\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u043e\u0432, \u0438 \u044d\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u044c \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/og\/ib\/9a\/ogib9adrb8az7uol-eiqppjyiag.png\" data-src=\"https:\/\/habrastorage.org\/webt\/og\/ib\/9a\/ogib9adrb8az7uol-eiqppjyiag.png\"\/><\/figure>\n<p>\u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u0431\u043e\u0440\u0434\u044e\u0440\u0430, \u043d\u0430\u0434\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u043d\u0435\u0433\u043e (\u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c). \u0411\u043e\u0440\u0434\u044e\u0440\u0430 \u0432 \u0442\u0440\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441 \u044f\u0434\u0440\u043e\u043c 7&#215;7 (\u043f\u0440\u0438\u0447\u0451\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f). \u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043e\u043a\u0430\u043d\u0442\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u2014 \u0432 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0437\u0430\u043b\u0438\u0432\u0430\u044e\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439, \u0430 \u0447\u0430\u0449\u0435 \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442 \u0442\u0443\u0434\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0431\u043e\u0440\u0434\u044e\u0440 \u044d\u0442\u043e\u0442 \u00ab\u0432\u044b\u0434\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u00bb \u043d\u0430\u0441 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u0440\u0430\u0442\u043d\u043e\u0435 64. \u041d\u0443 \u0442\u043e \u0435\u0441\u0442\u044c \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 256 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0442\u0440\u0451\u0445\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u043c \u0431\u043e\u0440\u0434\u044e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 320 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 (320 \u0431\u0430\u0439\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0441\u044c\u043c\u0438\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f). \u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0438\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0448\u0438\u0440\u0438\u043d\u043e\u0439 256 \u043f\u0438\u043a\u0441\u0435\u043b\u043e\u0432 \u0441 \u0442\u0440\u0451\u0445\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u043c \u0431\u043e\u0440\u0434\u044e\u0440\u043e\u043c \u0448\u0438\u0440\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 288 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 (\u0438\u043b\u0438 576 \u0431\u0430\u0439\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c). \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0432 LabVIEW, \u043d\u0435 \u043c\u043e\u0433\u0443 \u043d\u0435 \u043f\u0440\u043e\u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/7t\/h6\/kt\/7th6ktrcqagpwjnn_ppt2rjsrqs.png\" data-src=\"https:\/\/habrastorage.org\/webt\/7t\/h6\/kt\/7th6ktrcqagpwjnn_ppt2rjsrqs.png\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c U16 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 256\u0445256 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u044e. \u0412\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u0438 \u043a LabVIEW \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 <a href=\"https:\/\/www.ni.com\/en\/shop\/data-acquisition-and-control\/add-ons-for-data-acquisition-and-control\/what-is-vision-development-module.html\" rel=\"noopener noreferrer nofollow\">NI Vision Development Toolkit<\/a> \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u044d\u0445 \u0435\u0441\u043b\u0438 \u0431 \u043d\u0435 \u0441\u0442\u043e\u0438\u043b\u0430 \u0442\u0430\u043a\u0438\u0445 \u043d\u0435\u0432\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u0434\u0435\u043d\u0435\u0433, \u043f\u0440\u0438\u0447\u0451\u043c \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430, \u043d\u043e \u0438 \u0437\u0430 \u0440\u0430\u043d\u0442\u0430\u0439\u043c.<\/p>\n<h3>\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b<\/h3>\n<p>\u041d\u0443 \u0432\u043e\u0442, \u0442\u0435\u043f\u0435\u0440\u044c, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430, \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u041a\u043e\u043b\u044c \u0441\u043a\u043e\u0440\u043e \u043c\u044b \u0432\u044b\u0448\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u0443\u044e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u0441\u043d\u0443\u0442\u044c\u0441\u044f \u0442\u0435\u043c\u044b \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 Page Faults). \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u0432\u044b\u0434\u0435\u043b\u0438\u0432 \u0441\u0435\u0431\u0435 \u043f\u043e \u0433\u0438\u0431\u0438\u0431\u0430\u0439\u0442\u0443 \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">#define HEIGHT 32768 #define WIDTH 32768 #define LINE_WIDTH WIDTH #define LARGE (HEIGHT*WIDTH)  uint8_t* LargeSrc = (uint8_t*)_aligned_malloc(LARGE * sizeof(uint8_t), 4096); uint8_t* LargeDst = (uint8_t*)_aligned_malloc(LARGE * sizeof(uint8_t), 4096); <\/code><\/pre>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441 \u043d\u0430 \u0437\u0430\u0441\u044b\u043f\u043a\u0443: \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u044f \u0438\u043c\u0435\u044e \u0432 \u0432\u0438\u0434\u0443 Working Set) \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u0438\u0445 \u0434\u0432\u0443\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432? \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0430\u043c\u044f\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 (\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442 \u043d\u0443\u043b\u0435\u0439), \u043d\u043e \u043a\u0430\u043a \u0431\u044b \u0435\u0449\u0451 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0435\u043d\u0430 (\u00ab\u043a\u0430\u043a \u0431\u044b\u00bb \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0447\u0442\u0435\u043d\u0438\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0437\u0434\u0435\u0441\u044c \u0446\u0438\u0442\u0430\u0442\u0443 \u0438\u0437 \u00abWindows Internals\u00bb:<\/p>\n<blockquote>\n<p>The Windows memory manager uses a demand-paging algorithm to load pages into memory. In demand paging, a page is brought into memory only when a request for it occurs, not in advance. When a reference is made to an address on a page not present in main memory, it is called a page fault. When an application receives a page fault, the memory manager loads into memory the faulted page. The set of pages that a program is actively using, called the Working Set. The amount of pages-backed virtual address space in use, called Commit Size.<\/p>\n<\/blockquote>\n<p>\u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0443\u0442\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438, \u043d\u0435\u0432\u0430\u0436\u043d\u043e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c Page Fault, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0430 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0438 \u043b\u0438\u0448\u044c \u0437\u0430\u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 4095 \u0431\u0430\u0439\u0442\u043e\u0432 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0443\u0442, \u0430 \u0432\u043e\u0442 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 4097-\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u043d\u0430\u043c \u0441\u043d\u043e\u0432\u0430 \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 TaskManager, \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e, \u0435\u0441\u043b\u0438 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 memcpy() \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">  PROCESS_MEMORY_COUNTERS memCounter;   GetProcessMemoryInfo(GetCurrentProcess(), &amp;memCounter, sizeof(memCounter));   println(\"Page Faults before 1st memcpy - {}\", memCounter.PageFaultCount);   println(\"Working Set Size before 1st memcpy - {}\", memCounter.WorkingSetSize);    auto start = system_clock::now();   memcpy(LargeDst, LargeSrc, LARGE * sizeof(uint8_t));   auto end = system_clock::now();   println(\"memcpy 1st call - {} ms\", MS(end - start).count());    GetProcessMemoryInfo(GetCurrentProcess(), &amp;memCounter, sizeof(memCounter));   println(\"Page Faults after 1st memcpy - {}\", memCounter.PageFaultCount);   println(\"Working Set Size after 1st memcpy - {}\", memCounter.WorkingSetSize);    start = system_clock::now();   memcpy(LargeDst, LargeSrc, LARGE * sizeof(uint8_t));   end = system_clock::now();   println(\"memcpy 2nd call - {} ms\", MS(end - start).count()); <\/code><\/pre>\n<p>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 system_clock::now() \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u00abMS\u00bb \u2014 \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u044b:<\/p>\n<pre><code class=\"cpp\">#define MS duration_cast&lt;milliseconds> <\/code><\/pre>\n<p>\u0412\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 malloc() \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/learn.microsoft.com\/en-us\/sysinternals\/downloads\/vmmap\" rel=\"noopener noreferrer nofollow\">vmmap<\/a> \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0437\u043e\u0432\u0430\u043c\u0438 _aligned_malloc:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/nr\/lv\/rr\/nrlvrrdbbhmazqfkdqxucznghpq.png\" data-src=\"https:\/\/habrastorage.org\/webt\/nr\/lv\/rr\/nrlvrrdbbhmazqfkdqxucznghpq.png\"\/><\/figure>\n<p>\u0410 \u0432\u043e\u0442 \u0447\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435, \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u0432 \u043a\u0443\u0447\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u0434\u0432\u0430 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u0430, \u043d\u043e Working Set \u043f\u043e\u043a\u0430 \u043f\u0443\u0441\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/nl\/cc\/ka\/nlcckasqok-wwlpsyjx1q5gjrf8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/nl\/cc\/ka\/nlcckasqok-wwlpsyjx1q5gjrf8.png\"\/><\/figure>\n<p>\u041d\u0443 \u0430 \u0432\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 memcpy(), Working Set \u043f\u0440\u0438\u043d\u044f\u043b \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4h\/lm\/ka\/4hlmkadecagyxyxjsflcxacgbv4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/4h\/lm\/ka\/4hlmkadecagyxyxjsflcxacgbv4.png\"\/><\/figure>\n<p>\u0412\u043e\u0442 \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0447\u0442\u043e\u0431\u044b \u0447\u0435\u0440\u0435\u0441\u0447\u0443\u0440 \u0443\u043c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0432\u044b\u043a\u0438\u043d\u0443\u043b \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 memcpy, \u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 #pragma optimize( &#171;&#187;, off )):<\/p>\n<pre><code>Page Faults before 1st memcpy - 23647 Working Set Size before 1st memcpy - 91373568 memcpy 1st call - 387 ms Page Faults after 1st memcpy - 524621 Working Set Size after 1st memcpy - 2139373568 memcpy 2nd call - 100 ms <\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0437\u0430\u043d\u044f\u043b \u043f\u043e\u0447\u0442\u0438 \u0432 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043d\u0430\u043c \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 (\u043d\u0443 \u0434\u0430, \u00ab\u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430\u0442\u044c\u00bb \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b, \u044d\u0442\u043e \u0432\u0430\u043c \u043d\u0435 \u0430\u0443\u0434\u0438\u043e\u043a\u0430\u0431\u0435\u043b\u0438). \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u0435\u043c\u0443\u0434\u0440\u043e\u0441\u0442\u0438 TLB (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 Translation Lookaside Buffer\/\u0411\u0443\u0444\u0435\u0440 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438), \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u0432 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0443\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 Page Faults, \u0438\u0441\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430\u043c\u0438.<\/p>\n<h4>\u042d\u0444\u0444\u0435\u043a\u0442 \u043b\u0438\u043d\u0438\u0439 \u043a\u044d\u0448\u0430<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f \u043f\u043e \u043d\u0430\u0448\u0438\u043c \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u043b\u0438\u0431\u043e \u0441 \u0448\u0430\u0433\u043e\u043c \u0432 64 \u0431\u0430\u0439\u0442\u0430 (\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0430 \u0446\u0438\u043a\u043b\u0430 \u0432 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0432\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043d\u0430 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e inc \u043d\u0430 \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u0435\u0441\u043b\u0438 inc \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0447\u0435\u043c add, \u0445\u043e\u0442\u044f \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u0445 \u043e\u043d\u0438 \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b):<\/p>\n<pre><code class=\"cpp\">\/\/============================================================================ \/\/ Cache line miss illustration \/\/      start = system_clock::now();     for (int i = 0; i &lt; LARGE \/ 32; i+= 2) LargeDst[i] = LargeSrc[i];     end = system_clock::now();     println(\"\\nCopy every 2nd elementh - {} ms\", MS(end - start).count());      start = system_clock::now();     for (int i = 0; i &lt; LARGE; i += 64) LargeDst[i] = LargeSrc[i];     end = system_clock::now();     println(\"Copy every 64th elementh - {} ms\", MS(end - start).count()); <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>Copy every 2nd elementh - 31 ms Copy every 64th elementh - 158 ms <\/code><\/pre>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0443 \u043d\u0430\u0441 16777216 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u0435\u0440\u0432\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u043e\u043c\u0430\u0445\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043c\u0438\u043c\u043e \u043a\u044d\u0448\u0430 \u043b\u0438\u0448\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 32-\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a SIMD \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0434\u0430\u044e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e. \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u0432\u044b\u0448\u0435, \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b, \u0442\u043e \u044d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0445 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043c \u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>\u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c.<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435<\/h4>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u0432\u0437\u044f\u043b \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438? \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u044f \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0432\u044b \u0441 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c \u00ab\u043e\u0434\u0438\u043d-\u043d\u0430-\u043e\u0434\u0438\u043d\u00bb, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0438 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0438\u0445 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438, \u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0435 \u043b\u0438\u0448\u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0432\u043e \u0447\u0442\u043e \u0436\u0435 \u043e\u043d\u0438 \u0442\u0430\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u044e\u0442\u0441\u044f, \u0438 \u0434\u0430, \u0442\u0430\u043c <a href=\"https:\/\/stackoverflow.com\/questions\/31089502\/aligned-and-unaligned-memory-access-with-avx-avx2-intrinsics\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0451 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e<\/a>.<\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435. \u041c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 DLL, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437 \u0421\u0438-\u043a\u043e\u0434\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u2014 \u044d\u0442\u043e <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/build\/x64-calling-convention?view=msvc-170\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445<\/a>, \u043e\u043d\u043e \u0434\u043b\u044f \u044564 \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0435. \u041f\u0435\u0440\u0432\u044b\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b RCX, RDX, R8 \u0438 R9, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0435\u043a. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0435 \u2014 \u0447\u0435\u0440\u0435\u0437 RAX. \u0415\u0441\u043b\u0438 \u0432\u044b \u0442\u0440\u043e\u0433\u0430\u0435\u0442\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b RBX, RBP, RDI, RSI, RSP, R12-R15, \u0438 XMM6-XMM15, \u0442\u043e \u0438\u0445 \u043d\u0430\u0434\u043e \u0437\u0430\u0442\u043e\u043b\u043a\u0430\u0442\u044c \u0432 \u0441\u0442\u0435\u043a, \u0430 \u043f\u043e\u0442\u043e\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c. \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451. \u0427\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442, \u043c\u044b \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0435\u043c \u0433\u0438\u0431\u0438\u0431\u0430\u0439\u0442 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043a\u0430\u043a \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 32768\u044532768 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0447\u0442\u043e \u0434\u0430\u0441\u0442 \u043d\u0430\u043c 1024\u00b3 \u0431\u0430\u0439\u0442. \u0428\u0438\u0440\u0438\u043d\u0430 \u043b\u0438\u043d\u0438\u0438 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c 32768, \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b., \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u0442\u0440\u0435\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u2014 \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u0434\u0430 \u043e\u0431\u0449\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0438 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u044b, \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0430 \u0442\u0440\u0438 \u2014 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043f\u043e \u043e\u0431\u043e\u0438\u043c \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f\u043c \u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f (\u0442\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 Intel IPP). \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 32-\u0445 \u0431\u0438\u0442 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435, \u0447\u0442\u043e \u0441\u043e\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u043e \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u0438 \u0443\u0447\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c stdcall \u0438 cdecl.<\/p>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435, \u0441\u043b\u0435\u043f\u0438\u043c \u043f\u0430\u0440\u0443 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"cpp\">extern \"C\" uint64_t fnProcessU(void* dst, void* src, size_t Bytes); extern \"C\" uint64_t fnProcessA(void* dst, void* src, size_t Bytes); <\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u00abfnProcessU\u00bb \u2014 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <a href=\"https:\/\/www.felixcloutier.com\/x86\/movdqu:vmovdqu8:vmovdqu16:vmovdqu32:vmovdqu64\" rel=\"noopener noreferrer nofollow\">vmovdqu<\/a> \u0434\u043b\u044f \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"assembly\">U255 DY 32*BYTE 255  fnProcessU PROC shr r8, 5;     ;divide by 32 vmovdqu ymm5, [U255] LU:     vmovdqu  ymm1, [rdx] vpsubb ymm1, ymm5, ymm1     vmovdqu [rcx], ymm1     add rdx, 32     add rcx, 32     dec r8     jnz LU  RET ENDP fnProcessU <\/code><\/pre>\n<p>\u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u0442\u043e \u0442\u0443\u0442 \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e: shr \u044d\u0442\u043e \u0441\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0434\u0432\u043e\u0439\u043a\u0438, add \u0438 dec \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0441\u0430\u043c\u0438 \u0437\u0430 \u0441\u0435\u0431\u044f, \u0430 jnz \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434 (Jump if Not Zero). \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u0442\u044c \u043a\u043d\u0438\u0436\u043a\u0443 \u0414\u0430\u043d\u0438\u044d\u043b\u044f \u041a\u0443\u0441\u0441\u0432\u044e\u0440\u043c\u0430 (\u0441\u043c. \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0432 \u043a\u043e\u043d\u0446\u0435). \u041a\u0441\u0442\u0430\u0442\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 vpsubb \u0442\u0440\u0435\u0431\u0443\u0435\u0442 AVX2, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 \u043d\u0435\u0442 (\u0442\u043e \u0435\u0441\u0442\u044c ymm* \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438 \u043d\u0430 AVX). \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 AVX2, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b xmm, \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438, \u0430 \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c AVX 512, \u0442\u043e \u043d\u0430 zmm, \u0432\u043f\u0440\u043e\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0435 \u0434\u0430\u0441\u0442 \u0441\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0443\u043f\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041d\u0443 \u0430 \u0434\u043b\u044f \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043f\u0430\u0440\u043e\u0439 <a href=\"https:\/\/www.felixcloutier.com\/x86\/movdqa:vmovdqa32:vmovdqa64\" rel=\"noopener noreferrer nofollow\">vmovdqa<\/a>\/<a href=\"https:\/\/www.felixcloutier.com\/x86\/movntdq\" rel=\"noopener noreferrer nofollow\">vmovntdq<\/a>:<\/p>\n<pre><code class=\"assembly\">LA:     vmovdqa  ymm1, [rdx] vpsubb ymm1, ymm5, ymm1     vmovntdq [rcx], ymm1          add rdx, 32     add rcx, 32     dec r8     jnz LA <\/code><\/pre>\n<p>vmovntdq \u0442\u0430\u043a\u0436\u0435 \u043f\u0438\u0448\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u00ab\u043c\u0438\u043c\u043e \u043a\u044d\u0448\u0430\u00bb, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 (\u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430). \u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0437\u0430\u0431\u0430\u0432\u043d\u043e, \u043d\u043e \u0442\u0430\u043a \u0434\u0430\u0436\u0435 \u0432\u0435\u0441\u0435\u043b\u0435\u0435.<\/p>\n<p>\u0415\u0449\u0451 \u043f\u0430\u0440\u0430 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u2014 \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0432\u043e\u0440\u043e\u0442 (unroll) \u0446\u0438\u043a\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u043e\u0432\u0435\u0440\u0445\u0435\u0434 \u043e\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0438 \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u0443\u0436 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/habr.com\/ru\/articles\/147852\/\" rel=\"noopener noreferrer nofollow\">cpuid\/rdtsc<\/a>, \u0431\u043b\u0430\u0433\u043e \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u044d\u0442\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e, \u0438 \u0432\u0435\u0440\u043d\u0451\u043c \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 RAX.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"assembly\">EXPORT fnProcessA ;aligned processing fnProcessA PROC push rsi push rdi push rbx      shr r8, 6 vmovdqu ymm5, [U255] mov rsi, rdx mov rdi, rcx  cpuid ; force all previous instructions to complete and reset rax...rdx registerss! rdtsc ; read time stamp counter mov r10d, eax ; save EAX for later mov r11d, edx ; save EDX for later LA:     vmovdqa  ymm1, [rsi]     vmovdqa  ymm2, [rsi+32]     vmovdqa  ymm3, [rsi+32*2]     vmovdqa  ymm4, [rsi+32*3] vpsubb ymm1, ymm5, ymm1 vpsubb ymm2, ymm5, ymm2 vpsubb ymm3, ymm5, ymm3 vpsubb ymm4, ymm5, ymm4     movntdq [rdi], ymm1          movntdq [rdi+32*1], ymm2     movntdq [rdi+32*2], ymm3     movntdq [rdi+32*3], ymm4     add rdi, 128     add rsi, 128     dec r8     jnz LA  ;vzeroupper  cpuid ; wait for FDIV to complete before RDTSC rdtsc ; read time stamp counter sub eax, r10d ; subtract the most recent CPU ticks from the original CPU ticks sbb edx, r11d ; now, subtract with borrow     shl rax, 32 shrd rax, rdx, 32  pop rbx pop rdi pop rsi      RET ENDP fnProcessA <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0448\u0438\u0440\u0438\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u0440\u0430\u0442\u043d\u0430 128 \u0431\u0430\u0439\u0442\u0430\u043c, \u0435\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u0442, \u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u00ab\u043b\u0438\u0448\u043d\u0438\u0435\u00bb \u043f\u0438\u043a\u0441\u0435\u043b\u044b \u0438\u0437 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u043e\u0432. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0433\u043e \u0432 \u044d\u0442\u043e\u043c \u043d\u0435\u0442, \u0435\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u00ab\u0445\u0432\u043e\u0441\u0442\u0430\u00bb, \u0438 \u0437\u0434\u0435\u0441\u044c, \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c, \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c AVX-512 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0433\u0434\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/intel\/articles\/266055\/\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u043e\u0447\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<p>\u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u044b\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u044564 (FASM, NASM, MASM, YASM, \u0438 \u0442.\u0434.), \u043d\u043e \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c <a href=\"https:\/\/euroassembler.eu\" rel=\"noopener noreferrer nofollow\">EuroAsssembler<\/a>. \u042d\u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 (\u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u0432\u0441\u0435\u0433\u043e-\u0442\u043e \u043e\u043a\u043e\u043b\u043e 400 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442), \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0435\u0431\u0435 \u0441\u0430\u043c\u043e\u043c, \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u0435\u043d \u0434\u043b\u044f \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434. \u0410\u0432\u0442\u043e\u0440 \u2014 Pavel \u0160ruba\u0159 \u0438\u0437 \u0427\u0435\u0445\u0438\u0438. \u041f\u0440\u0438\u0447\u0451\u043c \u044d\u0442\u043e \u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0438 \u043b\u0438\u043d\u043a\u043e\u0432\u0449\u0438\u0445 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u043b\u0430\u043a\u043e\u043d\u0435, \u0435\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u0438\u043d\u043a\u0435\u0440, \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u0432. \u0412\u0441\u0435 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u043e \u0432 asm \u0444\u0430\u0439\u043b\u0435, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044f \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439<\/p>\n<pre><code>>euroasm.exe AVX2Process.asm  <\/code><\/pre>\n<p>lib \u0438\u0437 dll, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e \u043f\u0430\u0440\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434 (\u0438\u0437 \u043f\u043e\u0434 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 Visual Studio)<\/p>\n<pre><code>DUMPBIN AVX2Process.dll \/EXPORTS \/OUT:AVX2Process.def. \/\/Modify def file for LIB. LIB \/DEF:AVX2Process.def \/machine:X64 \/OUT:AVX2Process.lib. <\/code><\/pre>\n<p>\u041b\u0438\u043d\u043a\u043e\u0432\u043a\u0430 \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f, \u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u044e \u0432\u043e\u0442 \u0442\u0430\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043b\u0435\u043d\u044c \u043b\u0430\u0437\u0430\u0442\u044c \u0432 \u043e\u043f\u0446\u0438\u0438<\/p>\n<pre><code>#pragma comment( lib, \"Assembler\/AVX2Process\" ) <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">\/\/============================================================================ \/\/ Processing with unaligned commands \/\/ start = system_clock::now(); uint64_t ticksU = fnProcessU(LargeDst, LargeSrc, LARGE * sizeof(uint8_t)); end = system_clock::now(); println(\"\\nProcessing unalign -  {} ms ({} ticks)\", MS(end - start).count(), ticksU);  \/\/============================================================================ \/\/ Processing with aligned commands \/\/ start = system_clock::now(); uint64_t ticksA = fnProcessA(LargeDst, LargeSrc, LARGE * sizeof(uint8_t)); \/\/!Aligned end = system_clock::now(); println(\"Processing (aligned) - {} ms ({} ticks)\", MS(end - start).count(), ticksA); println(\"difference - {} ticks\", ticksU - ticksA); <\/code><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0430\u043b\u0438\u0446\u043e (\u043f\u0440\u043e\u0433\u043e\u043d \u0431\u044b\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u043d\u0430 i7-7700):<\/p>\n<pre><code>Processing - unaligned call -  154 ms (604931386 ticks) Processing - aligned call - 114 ms (448352055 ticks) difference - 156579331 ticks <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u043e \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0434\u0430\u043d\u043d\u044b\u043c, \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0441\u043b\u0435\u0433\u043a\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u00ab\u0447\u0438\u0441\u0442\u043e\u0439\u00bb memcpy (\u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043e\u0442\u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 memcpy() \u0438\u0434\u0435\u0442 \u0432\u043e\u0441\u044c\u043c\u0438\u043a\u0440\u0430\u0442\u043d\u0430\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0430, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u044f), \u0437\u0430\u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0434\u0430\u0436\u0435 \u0441\u043b\u0435\u0433\u043a\u0430 \u043e\u0431\u0433\u043e\u043d\u044f\u0435\u043c \u0435\u0451, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a memcpy.asm \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0435\u0440\u0441\u0438\u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 (\u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e) &#171;%ProgramFiles%\\Microsoft Visual Studio\\2022\\Professional\\VC\\Tools\\MSVC\\14.38.33130\\crt\\src\\x64&#187;, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044e\u0431\u043e\u043f\u044b\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0448\u0438\u0440\u043e\u0447\u0430\u0439\u0448\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432.  \u0412\u043e\u0442 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0443 vmovdqa\/vpsubb \u0438\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 vpsubsb \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0447\u0435\u0440\u0435\u0434\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u0432\u044b\u0436\u0430\u0442\u044c \u0435\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u0438\u0437 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438? \u0418 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u043d\u043e \u044d\u0442\u0430 \u00ab\u0442\u043e\u043d\u043a\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u00bb \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u043b\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<p>DLL \u044d\u0442\u0443, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u044f \u043c\u043e\u0433\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0436\u0435 \u0438 \u0438\u0437 LabVIEW (\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u043a\u0443\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e \u0433\u0434\u0435 \u044f \u043c\u043e\u0433\u0443 \u0432\u044b\u0437\u0432\u0430\u0442\u044c DLL), \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/xm\/g7\/km\/xmg7km2ckbnyxaxprrjtw6cevau.png\" data-src=\"https:\/\/habrastorage.org\/webt\/xm\/g7\/km\/xmg7km2ckbnyxaxprrjtw6cevau.png\"\/><\/figure>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0445\u0438\u0442\u0440\u0438\u043b, \u0432\u0437\u044f\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u00abbaboon.jpg\u00bb (\u043a\u043e\u0442\u043e\u0440\u043e\u0435 512\u0445512) \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0432 \u0431\u043e\u0440\u0434\u044e\u0440 \u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0431\u0430\u0432\u0438\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u043e\u0432, \u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u00ab\u0441\u043f\u0430\u0433\u0435\u0442\u0442\u0438\u00bb \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e.<\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0432\u0441\u0451 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d-\u0432-\u043e\u0434\u0438\u043d \u0438 \u043d\u0430 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438.<\/p>\n<h4>\u0418\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">#include &lt;immintrin.h> \/\/... for (size_t i = 0; i &lt; Blocks; i++) {         \/\/ There is no penalty to using vmovdqu when the address is aligned.         __m256i b0 = _mm256_load_si256((__m256i*)Src); \/\/32 Source pixels         __m256i b1 = _mm256_load_si256((__m256i*)(Src + 32)); \/\/next 32 pixels         __m256i b2 = _mm256_load_si256((__m256i*)(Src + 64)); \/\/and so on         __m256i b3 = _mm256_load_si256((__m256i*)(Src + 96)); \/\/4x unroll          b0 = _mm256_subs_epi8(u255, b0);         b1 = _mm256_subs_epi8(u255, b1);         b2 = _mm256_subs_epi8(u255, b2);         b3 = _mm256_subs_epi8(u255, b3);          _mm256_store_si256((__m256i*)Dst, b0); \/\/\u0438\u043b\u0438 vmovntdq -> _mm256_stream_si256()         _mm256_store_si256((__m256i*)(Dst + 32), b1);         _mm256_store_si256((__m256i*)(Dst + 64), b2);         _mm256_store_si256((__m256i*)(Dst + 96), b3);         Src += 128; Dst += 128;     } <\/code><\/pre>\n<p>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435 \u0441 \u0437\u0430\u043c\u0435\u043d\u043e\u0439 _mm256_store_si256 \u043d\u0430 _mm256_stream_si256 \u044f, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e.<\/p>\n<p>\u041a\u0430\u043a \u043e\u0442\u043c\u0435\u0447\u0430\u043b\u043e\u0441\u044c \u0432\u044b\u0448\u0435, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433, \u0432 Visual Studio \u043e\u043d \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u0435\u0439 Assembly, Machine Code and Source (\/FAcs).<\/p>\n<p>\u0422\u0430\u043c \u0432\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0447\u0442\u043e \u043f\u0430\u0440\u0430 _mm256_load_si256 \/ _mm256_subs_epi8 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <a href=\"https:\/\/www.felixcloutier.com\/x86\/psubsb:psubsw\" rel=\"noopener noreferrer nofollow\">vpsubsb<\/a> ymm0, ymm4, YMMWORD PTR [rcx], \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0432\u0441\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u0432 OpenCV \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c <a href=\"https:\/\/docs.opencv.org\/3.4\/df\/d91\/group__core__hal__intrin.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0432\u043e\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/a>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f _aligned \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0430  \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f AVX2 \u0438 \u0442\u0438\u043f\u043e\u043c v_uint8x32, \u043d\u0430\u0434\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c CV_AVX2:<\/p>\n<pre><code class=\"cpp\">#define CV_AVX2 1 #include \"OpenCV\/opencv.hpp\" #include \"OpenCV\/core\/hal\/intrin.hpp\" \/\/... void OpenCVIntrinsics(uchar *Dst, uchar *Src, size_t Bytes) {     size_t Blocks = Bytes >> 7;     __declspec(align(32)) uint8_t U255[32];     fill_n(U255, sizeof(U255) \/ sizeof(*U255), 255); \/\/ fill with 255     v_uint8x32 u255 = v256_load_aligned((uchar*)U255);      for (size_t i = 0; i &lt; Blocks; i++) {         v_uint8x32 pix0 = v256_load_aligned(Src);         v_uint8x32 pix1 = v256_load_aligned(Src + 32);         v_uint8x32 pix2 = v256_load_aligned(Src + 64);         v_uint8x32 pix3 = v256_load_aligned(Src + 96);         v_uint8x32 neg0 = u255 - pix0;         v_uint8x32 neg1 = u255 - pix1;         v_uint8x32 neg2 = u255 - pix2;         v_uint8x32 neg3 = u255 - pix3;         v_store_aligned(Dst, neg0);         v_store_aligned(Dst + 32, neg1);         v_store_aligned(Dst + 64, neg2);         v_store_aligned(Dst + 96, neg3);         Src += 128; Dst += 128;     } } <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>Processing Intrinsics - 147 ms (576243042 ticks) Processing OpenCV Intrinsics - 152 ms (596949208 ticks) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0442\u0430\u043a\u0438 \u0432 \u043b\u0438\u0441\u0442\u0438\u043d\u0433, \u0442\u043e \u043c\u044b \u0442\u0430\u043c \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e v256_load_aligned \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 vmovdqu, \u0445\u043e\u0442\u044f \u044f \u0431\u044b, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u0436\u0438\u0434\u0430\u043b vmovdq\u0430:<\/p>\n<pre><code>?v256_load_aligned ... v_uint8x32@12@PEBE@Z PROC ; cv::hal_baseline::v256_load_aligned, COMDAT  ; 393  : OPENCV_HAL_IMPL_AVX_LOADSTORE(v_uint8x32,  uchar)  00000c5 fe 6f 02 vmovdqu ymm0, YMMWORD PTR [rdx] <\/code><\/pre>\n<p>\u0413\u0434\u0435-\u0442\u043e \u043f\u0440\u043e\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 vmovdqu \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438 \u0435\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u0435\u043d VMOVDQA, \u043d\u043e \u043c\u043e\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u0442\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u2014 VMOVDQA \u0441\u043b\u0435\u0433\u043a\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0443\u0447\u0435\u0431\u043d\u0438\u043a \u0443\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 VMOVDQA \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b:<\/p>\n<pre><code class=\"cpp\">    assume_aligned&lt;64>(Src);     assume_aligned&lt;64>(Dst); <\/code><\/pre>\n<p>\u041d\u043e \u0434\u0430\u0436\u0435 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e VMOVDQA. \u0422\u0430\u043a \u0447\u0442\u043e \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043f\u0440\u043e\u0449\u0435 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0430\u0434\u043e (\u043b\u0438\u0431\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438 \u00ab\u0434\u043b\u044f \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0438\u00bb), \u0438 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0412\u043f\u0440\u043e\u0447\u0435\u043c \u044f \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u0432 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u0445, \u0438 \u0443\u0432\u0435\u0440\u0435\u043d, \u0441\u0440\u0435\u0434\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430\u0439\u0434\u0443\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a, \u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u0430\u0440\u0443 \u0441\u0442\u0440\u043e\u043a \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445 \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u0441\u0435\u043c. \u041d\u0435 \u043b\u0438\u0448\u043d\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u0433\u043e\u0440\u044f\u0447\u0438\u0435\u00bb \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/www.intel.com\/content\/www\/us\/en\/developer\/tools\/oneapi\/vtune-profiler.html#gs.0xthlx\" rel=\"noopener noreferrer nofollow\">Intel VTune<\/a>, \u043d\u043e \u044d\u0442\u043e\u0442 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u0410\u0445 \u0434\u0430, \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 OpenCV \u0441\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435:<\/p>\n<pre><code class=\"cpp\">\/\/============================================================================ \/\/ Processing with OpenCV \/\/    start = system_clock::now();    LargeDstOCV = 255 - LargeSrcOCV;     end = system_clock::now();    println(\"Processing OpenCV - {} ms\", MS(end - start).count()); <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0441 \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0430\u043c\u0438, OpenCV \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430:<\/p>\n<pre><code>Processing OpenCV - 158 ms <\/code><\/pre>\n<h4>\u041c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u0442\u043e\u0447\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/h4>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e \u0432\u044b\u0448\u0435, \u0442\u043e\u0442 \u0444\u0430\u043a\u0442,\u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u2014 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f Op\u0435nMP (\u0432\u043a\u043b\u044e\u0447\u0438\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043e\u043f\u0446\u0438\u044e \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430), \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435:<\/p>\n<pre><code class=\"cpp\">    uint8_t* srcTmp = LargeSrc;     uint8_t* dstTmp = LargeDst;     start = system_clock::now(); #pragma omp parallel for num_threads(4)     for (int x = 0; x &lt; HEIGHT; x++) {         fnProcessA(dstTmp, srcTmp, WIDTH * sizeof(uint8_t));         dstTmp += WIDTH;         srcTmp += WIDTH;     }     end = system_clock::now();     println(\"\\nParallel Processing with OpenMP - {} ms \", MS(end - start).count()); <\/code><\/pre>\n<p>\u041d\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0438 \u00ab\u043f\u043e-\u0441\u0442\u0430\u0440\u0438\u043d\u043a\u0435\u00bb, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043f\u043e\u0442\u043e\u043a\u0438 \u00ab\u0440\u0443\u0447\u043a\u0430\u043c\u0438\u00bb, \u043d\u0430\u043c \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"cpp\">#define N_THREADS 4  static HANDLE hProcessThreads[N_THREADS] = { 0 }; static HANDLE hStartSemaphores[N_THREADS] = { 0 }; static HANDLE hStopSemaphores[N_THREADS] = { 0 };  typedef struct{     int ct;     void* src, * dest;     size_t size; } mt_proc_t;  mt_proc_t mtParamters[N_THREADS] = { 0 }; <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430:<\/p>\n<pre><code class=\"cpp\">DWORD WINAPI thread_proc(LPVOID param) {     mt_cpy_t* p = (mt_cpy_t*)param;      while (1){         WaitForSingleObject(hStartSemaphores[p->ct], INFINITE);         fnProcessA(p->dest, p->src, p->size);\/\/pointers must be aligned!         ReleaseSemaphore(hStopSemaphores[p->ct], 1, NULL);     }     return 0; } <\/code><\/pre>\n<p>\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">void startProcessingThreads() {     for (int ctr = 0; ctr &lt; N_THREADS; ctr++){         hStartSemaphores[ctr] = CreateSemaphore(NULL, 0, 1, NULL);         hStopSemaphores[ctr] = CreateSemaphore(NULL, 0, 1, NULL);         mtParamters[ctr].ct = ctr;         hProcessThreads[ctr] = CreateThread(0,0, thread_proc, &amp;mtParamters[ctr], 0,0);     } } <\/code><\/pre>\n<p>\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a, \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438, \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u043f\u043e\u0442\u043e\u043a\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">void* runProcessingThreads(void* dest, void* src, size_t bytes) {     \/\/set up parameters     for (int ctr = 0; ctr &lt; N_THREADS; ctr++){         mtParamters[ctr].dest = (char*)dest + ctr * bytes \/ N_THREADS;         mtParamters[ctr].src = (char*)src + ctr * bytes \/ N_THREADS;         mtParamters[ctr].size = (ctr + 1)*bytes\/N_THREADS - ctr*bytes\/N_THREADS;     }      \/\/release semaphores to start computation     for (int ctr = 0; ctr &lt; N_THREADS; ctr++)         ReleaseSemaphore(hStartSemaphores[ctr], 1, 0);     \/\/wait for all threads to finish     WaitForMultipleObjects(N_THREADS, hStopSemaphores, TRUE, INFINITE);      return dest; } <\/code><\/pre>\n<p>\u043d\u0443 \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">void stopProcessingThreads() {     for (int ctr = 0; ctr &lt; N_THREADS; ctr++){         TerminateThread(hProcessThreads[ctr], 0);         CloseHandle(hStartSemaphores[ctr]);         CloseHandle(hStopSemaphores[ctr]);     } } <\/code><\/pre>\n<p>\u0412\u0441\u0451 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\/\/============================================================================ \/\/ Multithreaded processing - classic \/\/     startProcessingThreads();      start = system_clock::now();     runProcessingThreads(LargeDst, LargeSrc, LARGE * sizeof(uint8_t));     end = system_clock::now();     println(\"Multi threaded processing {} ms\", MS(end - start).count());      stopProcessingThreads(); <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0447\u0442\u043e \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u044f\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432:<\/p>\n<pre><code>Parallel Processing with OpenMP - 60 ms Multi threaded processing 61 ms <\/code><\/pre>\n<p>\u041c\u044b \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u0440\u043e\u0441\u0442\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u0443\u043f\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0445\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c Xeon \u0441 \u0448\u0435\u0441\u0442\u0438\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e, \u043c\u043e\u0436\u043d\u043e \u00ab\u0432\u044b\u0436\u0430\u0442\u044c\u00bb \u043a\u0443\u0434\u0430 \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u0438 \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>\u042f \u043f\u043e\u0433\u043e\u043d\u044f\u043b \u044d\u0442\u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u0434\u0432\u0443\u0445 Xeon \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445 (\u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f i7-7700):<\/p>\n<p>Intel Xeon W-2245 3.9 GHz 8 Cores 16 Threads<br \/> Intel Xeon Gold 6132 2.6 GHz 28 Cores 56 Threads<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0422\u0435\u0441\u0442 (32768\u044532768 = 1024\u00b3 \u0431\u0430\u0439\u0442\u043e\u0432)<\/p>\n<\/th>\n<th>\n<p align=\"left\">Xeon W-2245 3.9 GHz<\/p>\n<\/th>\n<th>\n<p align=\"left\">Xeon Gold 6132 2.6 GHz<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">memcpy() \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u0437\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">347 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">467 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">memcpy() \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u044b\u0437\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">123 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">205 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">31 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">39 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e 64-\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">158 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">217 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 (\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f vmovdqu)<\/p>\n<\/td>\n<td>\n<p align=\"left\">154 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">154 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0412\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 (\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f vmovdqa\/vmovntdq)<\/p>\n<\/td>\n<td>\n<p align=\"left\">114 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">203 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">155 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">156 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">OpenCV \u0438\u043d\u0442\u0440\u0438\u043d\u0441\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">160 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">169 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">OpenCV \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">160 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">195 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">OpenMP \u043d\u0430 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">62 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">34 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">OpenMP \u043d\u0430 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">87 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">37 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 (\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">61 \u043c\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">33 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b \u2014 W-2245 \u0432 \u0446\u0435\u043b\u043e\u043c \u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u0432 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0430 \u0432\u044b\u0448\u0435, \u0447\u0435\u043c Gold 6132, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u2014 \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c vmovntdq \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u0438\u0435., \u0445\u043e\u0442\u044f \u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c \u0434\u0430\u0451\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u00ab\u043f\u0440\u043e\u0441\u0442\u0430\u044f\u00bb \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f. \u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043c\u044b \u043e\u0431\u0433\u043e\u043d\u044f\u0435\u043c \u043f\u0440\u0438 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u2014 \u0434\u0432\u0430\u0434\u0446\u0430\u0442\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u044f\u0434\u0435\u0440 \u0432\u043a\u0443\u043f\u0435 \u0441 \u0448\u0435\u0441\u0442\u0438\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0442\u0432\u043e\u0440\u044f\u0442 \u0447\u0443\u0434\u0435\u0441\u0430.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442 \u043b\u0438 \u0432\u0441\u0451 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0444\u0430\u043d\u0430\u0442\u0438\u0447\u043d\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0438 \u0432\u0441\u044f? \u041d\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e. \u0414\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044f\u0440\u043a\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c \u00ab\u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u044b\u043c \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e\u043c\u00bb, \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u2014 \u0447\u0442\u043e \u0436, \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 OpenCV, \u0442\u043e \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043d\u0435\u0441\u0451\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u00ab\u043e\u0431\u0432\u044f\u0437\u043a\u0438\u00bb \u0432 \u043a\u043e\u0434, \u0434\u0430 \u0438 \u043f\u0440\u0435\u0436\u0434\u0435\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043e\u043d\u0430 \u0432\u0440\u0435\u0434\u043d\u0430 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u00ab\u0437\u0430\u0431\u0438\u0432\u0430\u0442\u044c \u0433\u0432\u043e\u0437\u0434\u044f\u043c\u0438\u00bb \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 64 \u0431\u0430\u0439\u0442\u0430 \u0432 \u043a\u043e\u0434. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043e\u043d\u043e 64 \u0431\u0430\u0439\u0442\u0430, \u043d\u043e \u044f \u043f\u043e\u043c\u043d\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u043e \u0431\u044b\u043b\u043e 32 \u0431\u0430\u0439\u0442\u0430 (\u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u044b\u043b \u043f\u0435\u0440\u0438\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 32-\u0445 \u0431\u0438\u0442\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c 32 \u0431\u0430\u0439\u0442\u0430, \u0430 \u0442\u0430 \u0436\u0435 \u0441\u0430\u043c\u0430\u044f, \u043d\u043e 64-\u0445 \u0431\u0438\u0442\u043d\u0430\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0430 \u043b\u0438\u043d\u0438\u0438 \u0443\u0436\u0435 \u043d\u0430 64 \u0431\u0430\u0439\u0442\u0430). \u041d\u0443 \u0430 \u0437\u0430\u0432\u0442\u0440\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0443\u043f\u0435\u0440 AVX 10+ \u0438 \u043c\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 128 \u0431\u0430\u0439\u0442. \u041f\u0438\u0448\u0438\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0434\u043b\u0438\u043d\u0443 \u043b\u0438\u043d\u0438\u0438 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u2014 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0430\u0445. \u042d\u0442\u043e \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 16-\u0442\u0438 \u0431\u0438\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438), \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0418 \u0432-\u0442\u0440\u0435\u0442\u044c\u0438\u0445 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0448\u0438\u0440\u0438\u043d\u044b, \u043d\u043e \u0438 \u043e\u0442 \u043e\u0431\u0449\u0435\u0439 \u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0443 \u0434\u0432\u0443\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0448\u0430\u0433 \u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0438\u0445 \u0440\u0430\u0437\u043d\u044b\u0435 \u0431\u043e\u0440\u0434\u044e\u0440\u044b \u0438\u043b\u0438 \u0440\u0430\u0437\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0446\u0432\u0435\u0442\u0430.<\/p>\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043c\u043d\u043e\u0433\u043e\u044f\u0434\u0435\u0440\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0430\u0451\u0442 \u043a\u0443\u0434\u0430 \u043a\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448, \u043d\u0443 \u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441 \u0438 \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438 \u0432\u0441\u0451, \u043e \u0447\u0451\u043c \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043a\u0430\u043a \u00ab\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u00bb, \u0442\u043e \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043a\u0430\u043a \u00ab\u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043a\u0430\u00bb \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<h4>\u0421\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u044b \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h4>\n<p>\u042d\u043d\u0434\u0440\u044e \u0422\u0430\u043d\u0435\u043d\u0431\u0430\u0443\u043c, \u0425\u0435\u0440\u0431\u0435\u0442 \u0411\u043e\u0441: \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, 4-\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435, ISBN: 978-5-4461-1155-8.<\/p>\n<p>\u042d. \u0422\u0430\u043d\u0435\u043d\u0431\u0430\u0443\u043c, \u0422. \u041e\u0441\u0442\u0438\u043d: \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430, 6-\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435, ISBN: 978-5-4461-1103-9.<\/p>\n<p>\u041c. \u0420\u0443\u0441\u0441\u0438\u043d\u043e\u0432\u0438\u0447, \u0414. \u0421\u043e\u043b\u043e\u043c\u043e\u043d, \u041f. \u0419\u043e\u0441\u0438\u0444\u043e\u0432\u0438\u0447, \u0410.\u0418\u043e\u043d\u0435\u0441\u043a\u0443: \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Windows, 7-\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435, ISBN: 978-5-4461-0663-9.<\/p>\n<p>\u041a\u0440\u0438\u0441 \u041a\u0430\u0441\u043f\u0435\u0440\u0441\u043a\u0438:  \u0422\u0435\u0445\u043d\u0438\u043a\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c. \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, ISBN: 5-94157-232-8.<\/p>\n<p>\u0414\u0430\u043d\u0438\u044d\u043b\u044c \u041a\u0443\u0441\u0441\u0432\u044e\u0440\u043c: \u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 x64 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 AVX, AVX2 \u0438 AVX-512, ISBN: 978-5-97060-928-6<\/p>\n<p>Agner Fog: <a href=\"https:\/\/www.agner.org\/optimize\/\" rel=\"noopener noreferrer nofollow\">Software optimization resources<\/a>.<\/p>\n<p>Ulrich Drepper: <a href=\"https:\/\/people.freebsd.org\/~lstewart\/articles\/cpumemory.pdf\" rel=\"noopener noreferrer nofollow\">What Every Programmer Should Know About Memory<\/a>.<\/p>\n<p><a href=\"https:\/\/www.intel.com\/content\/www\/us\/en\/docs\/intrinsics-guide\/index.html\" rel=\"noopener noreferrer nofollow\">Intel Intrinsics Guide<\/a><\/p>\n<h4>\u041f\u0440\u0438\u043c\u0435\u0440<\/h4>\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e\u0442 <a href=\"https:\/\/github.com\/AndrDm\/OpenCV-Alignment\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435 (\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f, \u044f \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0451\u0439). \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b OpenCV 4.8.1 \u0438 Visual Studio 2022 17.8.0, \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u041a\u0430\u043a \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0421++ (\/std:c++latest)), \u0438 \u0442\u0430\u043c \u0433\u0434\u0435-\u0442\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043f\u0430\u0440\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0438\u0445 \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b, \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430, \u0438 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u043e\u0442\u0432\u044f\u0437\u0430\u0432 \u0438\u0445 \u043e\u0442 \u043d\u0430\u043c\u0435\u0440\u0442\u0432\u043e \u043f\u0440\u0438\u0431\u0438\u0442\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 &#171;opencv2&#187;, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u0442\u0435\u0441\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0434\u0442\u0438 \u00ab\u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u00bb, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0442\u0430\u043a\u0438 \u0432\u0437\u044f\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e <a href=\"https:\/\/github.com\/opencv\/opencv\" rel=\"noopener noreferrer nofollow\">OpenCV \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a>.<\/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\/773948\/\"> https:\/\/habr.com\/ru\/articles\/773948\/<\/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>\u0412 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430\u0445 \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0441\u0442\u0430\u043c \u043d\u0430 \u0444\u043e\u0440\u0443\u043c\u0430\u0445 \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u043e\u0440\u043e\u0439 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 64-x \u0431\u0430\u0439\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0442\u0438\u043f\u0430 \u00ab\u0434\u043b\u0438\u043d\u0430 \u0438\u043b\u0438 \u0448\u0430\u0433 \u0441\u0442\u0440\u043e\u043a\u0438 (LineWidth\/StepWidth, Stride)\u00bb, \u00ab\u0437\u0430\u0437\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f (Alignment Gaps)\u00bb, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0432 \u043a\u0443\u0440\u0441\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043b\u0438\u043d\u0438\u0439 \u043a\u044d\u0448\u0430 \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0442\u043e \u0432\u0430\u043c, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0442\u0435, \u043a\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u2014 \u043c\u043e\u0433\u0443\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c, \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0434\u0443\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435. \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043a\u043e\u0434\u0430 \u043d\u0430 \u0421\u0438 \u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435, \u043f\u0430\u0440\u0430 LabVIEW \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u043e\u0432, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0436\u0435, \u0447\u0442\u043e \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0435\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f OpenCV. \u0414\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0441 \u043a\u0430\u043c\u0443\u0448\u043a\u043e\u043c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u043c AVX2, \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u0434 Windows 11 x64.<\/p>\n<hr\/>\n<p>\u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u2014 \u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u043d\u0438 \u0441 \u043e\u0434\u043d\u0438\u043c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0441\u044f \u043d\u0438\u0436\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u043c, \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u044d\u0442\u043e\u0442 \u0447\u0438\u0441\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0441\u0442 \u043d\u0435 \u043d\u0435\u0441\u0451\u0442.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 OpenCV \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0441 \u043a\u043e\u0434\u0430 \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"cpp\">#include \"OpenCV\/opencv.hpp\" using namespace cv; \/\/... Mat Src = imread(\"Building.jpg\"); imshow(\"Building\", Src); waitKey(0); <\/code><\/pre>\n<p>\u00abBuilding.jpg\u00bb \u2014 \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 OpenCV (\u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0439 \u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0425\u0430\u0444\u0430). \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e (\u043d\u0443, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c) \u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 Dst, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0430\u043c \u0438 \u044f \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c<\/p>\n<pre><code class=\"cpp\">Mat Dst = 255 - Src; <\/code><\/pre>\n<p>\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u043d\u0438\u0436\u0435 \u043f\u043e\u0439\u043c\u0451\u0442\u0435, \u0437\u0430\u0447\u0435\u043c \u044f \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">Mat Src = imread(\"Building.jpg\", CV_8U); \/\/load as grayscale  int Width = Src.cols; int Height = Src.rows;  Mat Dst(Height, Width, CV_8U);  for (int i = 0; i &lt; Width * Height; i++) Dst.data[i] = 255 - Src.data[i];  imshow(\"Building Dst\", Dst); println(\"Hit Enter to continue\"); waitKey(0); <\/code><\/pre>\n<p>\u0412\u044b\u0448\u0435 \u044f \u0447\u0438\u0442\u0430\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u043a\u0430\u043a \u0441\u0435\u0440\u0443\u044e \u043e\u0434\u043d\u043e\u043a\u0430\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u0432\u043e\u0441\u044c\u043c\u0438\u0431\u0438\u0442\u043d\u0443\u044e. \u041f\u043e\u043a\u0430 \u0432\u0441\u0451 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u043d\u0435\u0433\u0430\u0442\u0438\u0432, \u043a\u0430\u043a \u0435\u0441\u0442\u044c:<\/p>\n<figure class=\"\">\n<div><figcaption>\u043d\u0435\u0433\u0430\u0442\u0438\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0430\u0434\u0440\u0435\u0441\u0430 \u00ab\u043d\u0443\u043b\u0435\u0432\u044b\u0445\u00bb \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 Src.data \u0438 Dst.data \u0432 \u043e\u0431\u043e\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445, \u0442\u043e \u0432\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u044b \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0448\u0435\u0441\u0442\u0438\u0434\u0435\u0441\u044f\u0442\u0438 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0431\u0430\u0439\u0442 (\u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 64 \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u0442\u043a\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0448\u0435\u0441\u0442\u044c \u0431\u0438\u0442\u043e\u0432 \u0443 \u044d\u0442\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0441\u0431\u0440\u043e\u0448\u0435\u043d\u044b, \u0441\u0442\u0430\u043b\u043e \u0431\u044b\u0442\u044c, \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0435 \u0446\u0438\u0444\u0440\u044b \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 00, 40, 80 \u0438\u043b\u0438 \u04210, \u0442\u043e \u0430\u0434\u0440\u0435\u0441 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 64):<\/p>\n<pre><code class=\"cpp\">    printf(\"Src ptr = 0x%p, Dst ptr = 0x%p\\n\", Src.data, Dst.data);          Src ptr = 0x000001B98E6C00C0, Dst ptr = 0x000001B98FC900C0 <\/code><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u2014 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0432 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 OpenCV:  <a href=\"https:\/\/github.com\/opencv\/opencv\/blob\/4.x\/modules\/core\/src\/alloc.cpp#L154\" rel=\"noopener noreferrer nofollow\">alloc.cpp<\/a> \u0438 <a href=\"https:\/\/github.com\/opencv\/opencv\/blob\/4.x\/modules\/core\/include\/opencv2\/core\/private.hpp#L119\" rel=\"noopener noreferrer nofollow\">private.hpp<\/a>, \u0442\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/learn.microsoft.com\/en-us\/cpp\/c-runtime-library\/reference\/aligned-malloc?view=msvc-170\" rel=\"noopener noreferrer nofollow\">_aligned_malloc<\/a>, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">\/* the alignment of all the allocated buffers *\/ #define  CV_MALLOC_ALIGN    64 \/\/... void* ptr = _aligned_malloc(size, CV_MALLOC_ALIGN); <\/code><\/pre>\n<p>\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435? \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 (\u044f \u043e\u0447\u0435\u043d\u044c \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0436\u0443 \u00ab\u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435\u00bb) \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 \u043a\u0430\u043a \u0440\u0430\u0437 64 \u0431\u0430\u0439\u0442\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0435 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0431\u0430\u0439\u0442 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u043e \u0432\u0441\u0435 \u0435\u0433\u043e \u0448\u0435\u0441\u0442\u044c\u0434\u0435\u0441\u044f\u0442 \u0442\u0440\u0438 \u0441\u043e\u0441\u0435\u0434\u0430 \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u044d\u0448. \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0441\u043e\u0441\u0435\u0434\u0443, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0432 \u043a\u044d\u0448\u0435, \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0430 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439, \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u043b\u0438\u043d\u0438\u0438, \u0442\u043e \u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 64 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u2014 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0443\u0439\u0442\u0435, \u0441\u043a\u0430\u0436\u0435\u043c, \u0433\u0438\u0431\u0438\u0431\u0430\u0439\u0442 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043b\u0438\u0431\u043e \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u043f\u043e 64 \u0431\u0430\u0439\u0442\u0430, \u0437\u0430\u043c\u0435\u0440\u044c\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0438 \u0432\u044b \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0443, \u0445\u043e\u0442\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u0442\u0430\u043c \u0438 \u0441\u044f\u043c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e:<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; N\/64; i++) dst[i] = src[i];  for (int i = 0; i &lt; N; i+=64) dst[i] = src[i]; <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043f\u043e \u00ab\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u00bb \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a 32-\u0445 \u0431\u0430\u0439\u0442\u0430\u043c (\u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 32 \u0431\u0430\u0439\u0442\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0435\u0439) \u043f\u0440\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c 16-\u0442\u0438 \u0431\u0430\u0439\u0442\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 malloc(), \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u0432\u0443\u0445 \u043b\u0438\u043d\u0438\u0439 \u043a\u044d\u0448\u0430, \u0447\u0442\u043e \u0438 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438 \u043f\u0440\u043e\u043c\u0430\u0445\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0439. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 SIMD \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, AVX-512 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 64-\u0445 \u0431\u0430\u0439\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u044f\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u00ab\u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443\u00bb, \u043c\u044b \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0432\u0441\u0435\u0445 \u043d\u0430\u0431\u043e\u0440\u043e\u0432 AVX \u043a\u043e\u043c\u0430\u043d\u0434 (\u0442\u0430\u043a \u043a\u0430\u043a AVX \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 16, \u0430 AVX2 \u2014 \u043d\u0430 32 \u0431\u0430\u0439\u0442\u0430). \u042d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0438 \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 AVX \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0430\u0440\u044b MOVDQU \u0438 MOVDQA \u043b\u0438\u0431\u043e MOVAPS \u0438 MOVUPS, \u0438 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0438 \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0443\u0445\u043d\u0435\u0442 \u0432\u0430\u043c \u0432 \u0440\u0443\u043a\u0438 (\u0438\u043b\u0438 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a).<\/p>\n<h4>\u041f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435<\/h4>\n<p>\u041d\u043e \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u0447\u0443\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Mat, \u0441 \u043f\u0430\u0440\u043e\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u0448\u0430\u0433\u0430:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0439 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 (\u043d\u0443 \u0438\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u043a\u0442\u043e \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442) \u043f\u0438\u043a\u0441\u0435\u043b\u044c, \u043d\u043e \u0438 <strong>\u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430<\/strong> \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0431\u044b \u0441 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e 64. \u042d\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0448\u0438\u0440\u0438\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 64, 128, 192, 256 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 868&#215;600 (\u044f \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u0437\u044f\u043b \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0451) \u0438 868 \u043d\u0430\u0446\u0435\u043b\u043e \u043d\u0430 64 \u043d\u0443 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u043d\u0430 28 \u0431\u0430\u0439\u0442\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u2014 896. \u0427\u0442\u043e\u0431\u044b \u043e\u043a\u0440\u0443\u0433\u043b\u0438\u0442\u044c, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0435\u0445\u0438\u0442\u0440\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0441\u0442\u0430\u0449\u0438\u043b \u043e\u0442\u043a\u0443\u0434\u0430-\u0442\u043e \u0438\u0437 \u043d\u0435\u0434\u0440 StackOverflow:<\/p>\n<pre><code class=\"cpp\">#define ALIGN(__intptr, __align) ((__intptr) - 1u + (__align)) &amp; -(__align) <\/code><\/pre>\n<p>\u041d\u0443 \u0430 \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u0442\u0435\u043c \u0436\u0435 _aligned_malloc, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">int LineWidth = ALIGN(Width, 64); uint8_t* pDst; pDst = (uint8_t*)_aligned_malloc(Height * LineWidth * sizeof(uint8_t), 64); Mat DstAligned(Height, Width, CV_8U, pDst, LineWidth); println(\"Alignment: Width = {}, aligned line width = {}\", Width, LineWidth); <\/code><\/pre>\n<p>\u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 Mat \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0443\u0436\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0438\u0437\u0432\u043d\u0435. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 OpenCV \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c _aligned_free(pDst) \u0438 \u0438\u043c\u0435\u043d\u043d\u043e _aligned_free(), \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e free().<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043c\u0435\u0441\u0442\u043e 868\u0445600 \u043c\u044b \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c 896\u0445600. \u0412 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430\u0448\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u0418 \u0432\u043e\u0442 \u044d\u0442\u0438 \u00ab\u0434\u044b\u0440\u043a\u0438\u00bb (\u0437\u0430\u0437\u043e\u0440\u044b \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 28 \u0431\u0430\u0439\u0442) \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f Alignment Gaps (\u044f \u043f\u0440\u0438\u043d\u043e\u0448\u0443 \u043c\u043e\u0438 \u0438\u0437\u0432\u0438\u043d\u0435\u043d\u0438\u044f \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438 \u0437\u0430 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u043d\u043e \u044f \u0447\u0435\u0441\u0442\u043d\u043e \u043d\u0435 \u0437\u043d\u0430\u044e \u043a\u0430\u043a \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0445\u043e\u0447\u0443 \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u00ab\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00bb \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u0433, \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u044e\u0449\u0438\u0445 \u0440\u0443\u0441\u0441\u043a\u0438\u043c \u044f\u0437\u044b\u043a\u043e\u043c).<\/p>\n<p>\u041a\u0430\u043a \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0442\u0430\u043a, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e:<\/p>\n<pre><code class=\"cpp\">for (int i = 0; i &lt; Width * Height; i++)     DstAligned.data[i] = 255 - Src.data[i]; <\/code><\/pre>\n<p>\u0438\u0431\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u0432\u043e\u0442 \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443:<\/p>\n<figure class=\"\">\n<div><figcaption>\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0438\u043f\u0438\u0447\u043d\u0435\u0439\u0448\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0435\u0433\u043e \u043b\u0438\u0431\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0443\u0447\u043b\u0438, \u043b\u0438\u0431\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u043b\u0438. \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0438 \u00ab\u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c\u00bb \u0446\u0438\u043a\u043b\u043e\u043c, \u0437\u0430\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u044f \u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 (\u0438 \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0448\u0438\u0440\u0438\u043d\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0430\u0441\u044c, \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f, \u043d\u0435 \u0434\u043e\u0439\u0434\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f), \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0432 \u0441\u0438\u043b\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0438\u0436\u0435.<\/p>\n<p>\u0410 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a (\u0432 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0438, \u0447\u0442\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a):<\/p>\n<pre><code class=\"cpp\">for (int y = 0; y &lt; Height; y++) {     for (int x = 0; x &lt; Width; x++) {         DstAligned.data[y * AlignedWidth + x] = 255 - Src.data[y * Width + x];     } } <\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u0432 \u043e\u0431\u0449\u0435\u043c \u043d\u0435\u0442:<\/p>\n<pre><code class=\"cpp\">    uint8_t *pSrc, *pDst;     pSrc = Src.data;     pDst = DstAligned.data;      for (int y = 0; y &lt; Height; y++) {         for (int x = 0; x &lt; Width; x++) {             *pDst++ = 255 - *pSrc++;         }         pDst += AlignedWidth - Width;     } <\/code><\/pre>\n<p>(\u041a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0434, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438; \u043f\u043e \u043c\u043e\u0438\u043c \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c Visul Studio \u0431\u043e\u043b\u0435\u0435 \u00ab\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u00bb, \u0430 \u0432\u043e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0442\u043e\u0440 \u0438\u043d\u0442\u0435\u043b\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u044b\u043d\u0447\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430)<\/p>\n<p>\u0418\u043b\u0438 \u0432 \u0441\u0430\u043c\u043e\u043c \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b, \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0430\u0434\u043e \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043e\u0431\u043e\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u00ab\u043f\u0435\u0440\u0435\u0441\u043a\u043e\u0447\u0438\u0442\u044c\u00bb \u0447\u0435\u0440\u0435\u0437 \u0434\u044b\u0440\u043a\u0438:<\/p>\n<pre><code class=\"cpp\">    for (int y = 0; y &lt; Height; y++) {         for (int x = 0; x &lt; Width; x++) {             *pDst++ = 255 - *pSrc++;         }         pSrc += AlignedWidthSrc - Width;         pDst += AlignedWidthDst - Width;     } <\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f? \u0420\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u0437\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0446\u0432\u0435\u0442\u0430, \u0441\u043a\u0430\u0436\u0435\u043c \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 8 \u0438 16 \u0431\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043b\u0438\u0431\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u043a\u0430\u043d\u0442\u043e\u0432\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u0440\u0434\u044e\u0440\u0430 (\u043e \u043d\u0451\u043c \u0440\u0435\u0447\u044c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435)<\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043a\u0440\u043e\u043c\u0435 \u043b\u0451\u0433\u043a\u0438\u0445 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432 \u0432 \u0446\u0438\u043a\u043b\u0430\u0445 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0445\u043e\u0434\u0430 \u043f\u0430\u043c\u044f\u0442\u0438? \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e, \u0442\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c, \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u0438 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0432 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043b\u0438\u043d\u0438\u0438 \u043a\u044d\u0448\u0430 \u0438 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p>\u0412 OpenCV, \u043a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 isContinuous(), \u043e\u043d \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">    if (Src.isContinuous()) println(\"Src is continuous\");     if (!DstAligned.isContinuous()) println(\"Dst is not continuous\"); <\/code><\/pre>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u0435\u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043d\u0430\u0434\u043e \u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0442\u0438\u043f \u0438\u043b\u0438 \u043d\u0435\u0442)<\/p>\n<pre><code class=\"cpp\">Src.copyTo(DstAligned); Src.convertTo(DstAligned, CV_8U); <\/code><\/pre>\n<p>\u0414\u0440\u0443\u0433\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 OpenCV \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0422\u0430\u043a, \u0435\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Intel IPP, \u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u043f\u0430\u043c\u044f\u0442\u044c, \u0432\u044b\u0437\u044b\u0432\u0430\u044f <a href=\"https:\/\/www.intel.com\/content\/www\/us\/en\/docs\/ipp\/developer-reference\/2021-9\/malloc-001.html\" rel=\"noopener noreferrer nofollow\">ippiMalloc_<\/a>,  \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u0435\u0440\u043e\u0439 \u0432\u043e\u0441\u044c\u043c\u0438\u0431\u0438\u0442\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">ippiMal<\/code><\/pre>\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-360170","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/360170","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=360170"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/360170\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=360170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=360170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=360170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}