{"id":304930,"date":"2020-06-06T09:00:23","date_gmt":"2020-06-06T09:00:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=304930"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=304930","title":{"rendered":"\u041a\u0430\u043a GPU-\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0430\u0441\u043b\u0438 \u043c\u0435\u043d\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435. \u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 Python"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/505590\/\">\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0442\u0435\u043c\u0443 \u2014 Python \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPU. \u0410\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u043e\u0441\u0442\u0438, \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u044f \u0435\u0433\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u043c\u0438 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430\u043c\u0438. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xb\/mv\/xr\/xbmvxrrximpm1_fchk6fsi9v5fg.jpeg\"><br \/>  <a name=\"habracut\"><\/a><br \/>  \u041d\u0438\u043a\u043e\u0433\u043e \u0438\u0437 \u043d\u0430\u0441 \u0432 \u0442\u043e\u0439 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043d\u0435 \u043e\u0431\u043e\u0448\u0435\u043b \u0445\u0430\u0439\u043f \u0432\u043e\u043a\u0440\u0443\u0433 GPU-\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0438\u0439\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f. \u041f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u0432\u044b \u0441\u0442\u0430\u043d\u0435\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u044f\u0441\u043d\u044e: \u044f \u043d\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0442 \u043f\u043e GPU. \u041c\u043e\u0439 \u043f\u0443\u0442\u044c \u0432 \u043c\u0438\u0440\u0435 GPU \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f. \u041d\u043e \u044d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043e\u0441\u0442\u0438\u0433\u043b\u0430 \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u0449\u0438, \u0447\u0442\u043e, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u0435\u044e, \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0446\u0435\u043b\u0443\u044e \u0443\u0439\u043c\u0443 \u0437\u0430\u0434\u0430\u0447. \u041c\u043d\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u0440\u0443\u0447\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443, \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0430 \u0442\u0440\u0430\u0442\u0438\u043b\u0430 \u0446\u0435\u043b\u044b\u0435 \u0447\u0430\u0441\u044b, \u0430 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0442\u0430\u043a \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e. \u041d\u043e, \u0441\u0442\u043e\u0438\u043b\u043e \u043c\u043d\u0435 \u0432\u0437\u044f\u0442\u044c\u0441\u044f \u0437\u0430 GPU \u2013 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u0442\u0430\u043b\u0430 \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u044b. <b>\u0417\u0430\u0434\u0430\u0447\u0443, \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c 2 \u0441\u0443\u0442\u043e\u043a, \u044f \u0441\u043c\u043e\u0433 \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u0437\u0430 20 \u0441\u0435\u043a\u0443\u043d\u0434<\/b>.<\/p>\n<p>  \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 \u044f \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0448\u0443 \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043c, \u043a\u0430\u043a \u0438 \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GPU \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u0418\u0442\u0430\u043a, \u0447\u0438\u0442\u0430\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u2013 \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u0432\u044b \u043d\u0435 \u043f\u043e\u0436\u0430\u043b\u0435\u0435\u0442\u0435. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0432\u043d\u0438\u043a\u043d\u0435\u043c \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0438, \u0437\u0430\u0442\u0435\u043c \u043e\u0441\u0432\u043e\u0438\u043c\u0441\u044f \u0441 GPU \u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f GPU \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u042f \u0431\u0443\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Python <a href=\"http:\/\/numba.pydata.org\">Numba<\/a> \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c <a href=\"https:\/\/www.nvidia.com\/en-us\/data-center\/volta-gpu-architecture\/\">Nvidia Volta V100 16GB GPU<\/a>.<\/p>\n<h4>1. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438<\/h4>\n<p>  \u0412 \u0441\u0444\u0435\u0440\u0435 \u0440\u043e\u0437\u043d\u0438\u0447\u043d\u043e\u0439 \u0442\u043e\u0440\u0433\u043e\u0432\u043b\u0438 \u0447\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0438\u043b\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u0438\u0437\u043a\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041c\u043d\u0435 \u0434\u0430\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 k \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438. \u0418\u0442\u0430\u043a, \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0440\u0443\u0447\u0435\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u043f-3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441\u043f\u0438\u0441\u043a\u0430. \u041c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043e \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0438 \u043c\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/s1\/02\/if\/s102ifuqgnhoe_pv81htzopsye4.png\"><\/p>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 64-\u043b\u0430\u0442\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c\u0438<\/p>\n<p>  <i>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438<\/i><\/p>\n<p>  \u041c\u043d\u0435 \u0434\u0430\u043b\u0438 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u044b\u043b\u043e \u043e\u043a\u043e\u043b\u043e 10\u2075 \u043f\u043e\u0437\u0438\u0446\u0438\u0439. \u041f\u043e\u0438\u0441\u043a 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u041f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u0431\u044b n * k \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0433\u0434\u0435 n \u2013 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0430 k \u2013 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u041f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435.<\/p>\n<pre><code class=\"python\">def top_3_similar_items(X,mindex): # X \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u043f-3 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 'mindex'     SMALL = -9999.0 # \u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430(\u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c)     first_best_val = SMALL # \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c      first_best_index = -1 # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     second_best_val = SMALL # \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     second_best_index = -1 # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     third_best_val = SMALL # \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     third_best_index = -1 # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     for j in range(n): # \u0412\u0441\u0435\u0433\u043e n-\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435             if(mindex==j):                 continue             tmp = np.dot(X[mindex],X[j])\/(np.sqrt(np.sum(np.square(X[mindex]))) * np.sqrt(np.sum(np.square(X[j])))) # \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f             if(tmp&gt;=first_best_val):                 third_best_val = second_best_val                 third_best_index = second_best_index                 second_best_val = first_best_val                 second_best_index = first_best_index                 first_best_val = tmp                 first_best_index = j             elif(tmp&gt;=second_best_val):                 third_best_val = second_best_val                 third_best_index = second_best_index                 second_best_val = tmp                 second_best_index = j             elif(tmp&gt;third_best_val):                 third_best_val = tmp                 third_best_index = j     return first_best_val,first_best_index,second_best_val,second_best_index,third_best_val,third_best_index # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/code><\/pre>\n<p>  <i>\u041a\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043f\u0440\u0438 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0442\u043e\u043f-3 \u0441\u0445\u043e\u0436\u0438\u0445 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043d\u0430 n. \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0432\u043d\u0430 O(n*n*k) = O(n\u00b2k).<\/p>\n<pre><code class=\"python\">def top_3_similar_all_items(X): # X \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     SMALL = -9999.99 # \u041f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u0430(\u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c)     first_best_index = np.zeros(n,dtype=int) # \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     first_best_val = np.zeros(n,dtype=float) # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     second_best_index = np.zeros(n,dtype=int) # \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     second_best_val = np.zeros(n,dtype=float) # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     third_best_index = np.zeros(n,dtype=int) # \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     third_best_val = np.zeros(n,dtype=float) # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     for i in range(n):         # Initialisation         first_best_val[i] = SMALL         first_best_index[i] = -1         second_best_val[i] = SMALL         second_best_index[i] = -1         third_best_val[i] = SMALL         third_best_index[i] = -1         for j in range(n):             if(i==j):                 continue             tmp = np.dot(X[i],X[j])\/(np.sqrt(np.sum(np.square(X[i]))) * np.sqrt(np.sum(np.square(X[j])))) # \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f             if(tmp&gt;=first_best_val[i]):                 third_best_val[i] = second_best_val[i]                 third_best_index[i] = second_best_index[i]                 second_best_val[i] = first_best_val[i]                 second_best_index[i] = first_best_index[i]                 first_best_val[i] = tmp                 first_best_index[i] = j             elif(tmp&gt;=second_best_val[i]):                 third_best_val[i] = second_best_val[i]                 third_best_index[i] = second_best_index[i]                 second_best_val[i] = tmp                 second_best_index[i] = j             elif(tmp&gt;third_best_val[i]):                 third_best_val[i] = tmp                 third_best_index[i] = j     return first_best_val,first_best_index,second_best_val,second_best_index,third_best_val,third_best_index # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0445 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435<\/p>\n<p>  <i>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/i><\/p>\n<p>  \u042f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043a\u043e\u0434, \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0432 \u043d\u0430\u0439\u0442\u0438 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0438\u0437 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e n = 10\u00b3 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441 k = 64. \u041d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Python \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043e\u043a\u043e\u043b\u043e 17 \u0441\u0435\u043a\u0443\u043d\u0434 \u0441\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e 3.7 *10\u2076 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u041a\u043e\u0434 \u0431\u044b\u043b \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 Numpy. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 CPU.<\/p>\n<pre><code class=\"python\">%time first_best_val,first_best_index,second_best_val,second_best_index,third_best_val,third_best_index = top_3_similar_all_items(X)<\/code><\/pre>\n<p>  <i>\u041f\u0440\u043e\u0433\u043e\u043d \u0434\u043b\u044f n = 10\u00b3 \u043f\u043e\u0437\u0438\u0446\u0438\u0439<\/i><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/z7\/fr\/p9\/z7frp96r6jga71hy_eh5kqc6soo.png\"><\/p>\n<p>  \u0412\u044b\u0432\u043e\u0434: \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u0434\u043b\u044f n = 10\u00b3 \u043f\u043e\u0437\u0438\u0446\u0438\u0439<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043e n =10\u2074 \u043f\u043e\u0437\u0438\u0446\u0438\u0439. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0432\u043d\u0430 O(n\u00b2k), \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043e\u0437\u0440\u043e\u0441\u043b\u0430 \u0432 100 \u0440\u0430\u0437 (\u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 n \u0432\u043e\u0437\u0440\u043e\u0441\u043b\u0430 \u0432 10 \u0440\u0430\u0437). \u041d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0443\u0448\u043b\u043e 1700 \u0441\u0435\u043a\u0443\u043d\u0434 = 28,33 \u043c\u0438\u043d\u0443\u0442\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/1t\/hz\/we\/1thzweestkdve12ggxihgenaisu.png\"><\/p>\n<p>  \u0412\u044b\u0432\u043e\u0434: \u0432\u0440\u0435\u043c\u044f, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 n = 10\u2074 \u043f\u043e\u0437\u0438\u0446\u0438\u0439<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e\u043c\u0443: \u043e\u0446\u0435\u043d\u043a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0437 10\u2075 \u043f\u043e\u0437\u0438\u0446\u0438\u0439. \u041f\u043e\u0441\u0447\u0438\u0442\u0430\u0432, \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u043e\u0432\u044c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0435\u0442 \u0432 100 \u0440\u0430\u0437, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0430\u0432\u043d\u0430 O(n\u00b2k).<br \/>  \u041e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u043e\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f = 1700 * 100 \u0441\u0435\u043a\u0443\u043d\u0434 = 2834 \u043c\u0438\u043d\u0443\u0442\u044b = 47,2 \u0447\u0430\u0441\u0430 ~ 2 \u0434\u043d\u044f.<\/p>\n<p>  \u041e, \u0413\u043e\u0441\u043f\u043e\u0434\u0438! \u0422\u0430\u043a \u0434\u043e\u043b\u0433\u043e!!!<\/p>\n<p>  \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0441\u0438\u043b\u043e\u0439 GPU. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 GPU \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u043e\u043a\u0438\u0440\u0443\u0435\u0442. \u0426\u0438\u0444\u0440\u044b \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043d\u0430 \u0437\u0430\u043a\u0443\u0441\u043a\u0443, \u0430 \u043f\u043e\u043a\u0430 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0432\u0430\u043c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043c\u0438\u0440\u043e\u043c GPU.<\/p>\n<h4>2. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 CPU \u0438 GPU<\/h4>\n<p>  \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 (CPU), \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0437\u0433\u043e\u043c \u043b\u044e\u0431\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430: \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430. <\/p>\n<p>  \u041f\u0440\u0430\u0432\u0434\u0430, \u0443 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 CPU \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u044f\u0434\u0435\u0440, \u0438 \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CPU \u2013 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u2013 \u0432 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, CPU \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0435 \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439\u0441\u044f \u0432 \u043a\u043e\u0434\u0435.<\/p>\n<p>  \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 (GPU) \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043b\u043a\u0438\u043c\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u044f\u0434\u0440\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043e\u0434\u043d\u0430\u043a\u043e, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 (\u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043e\u0431 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u043e-\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 (\u0410\u041b\u0423), \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0438 \u043a\u044d\u0448-\u043f\u0430\u043c\u044f\u0442\u0438), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0441 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0446\u0435\u043b\u043e\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0445 \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dv\/rj\/_r\/dvrj_rfbqkiabwugkvilkoka3oo.png\">   <\/p>\n<blockquote><p>\u0423 GPU \u0431\u043e\u043b\u044c\u0448\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 (ALU), \u0447\u0435\u043c \u0443 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e CPU, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/p><\/blockquote>\n<p>  <i>\u0420\u0438\u0441\u0443\u043d\u043e\u043a: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 CPU \u0438 GPU ~ <a href=\"https:\/\/blogs.oracle.com\/datascience\/cpu-vs-gpu-in-machine-learning\">\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/a><\/i><\/p>\n<h4>3. \u041a\u043e\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 GPU <\/h4>\n<p>  CPU \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044f\u0434\u0440\u0430 CPU \u043c\u043e\u0449\u043d\u0435\u0435, GPU \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0418\u0418, \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u043c \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435\u043c. GPU \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u043c\u0438, \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u044f \u0441\u0445\u043e\u0436\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f GPU: \u0432\u043e\u0437\u044c\u043c\u0435\u043c, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435. \u0415\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0432 \u043e\u0434\u043d\u043e \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435, \u043b\u0438\u0431\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0442\u043e \u0435\u0441\u0442\u044c, \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e, \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0441\u043b\u043e\u0432\u0443.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f CPU \u2014 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0441\u0447\u0435\u0442 \u0440\u044f\u0434\u0430 \u0424\u0438\u0431\u043e\u043d\u0430\u0447\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c. \u0412\u0435\u0434\u044c \u043d\u0430\u0439\u0442\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0448\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0434\u0432\u0430. \u0422\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f CPU.<br \/>  \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446, \u043b\u0435\u0433\u043a\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c GPU, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0445 \u044f\u0447\u0435\u0439\u043a\u0430\u0445 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u0441\u0445\u043e\u0436\u0438 \u043f\u043e \u043f\u0440\u0438\u0440\u043e\u0434\u0435, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0435\u043d\u044b.<\/p>\n<h4>4. \u041a\u0440\u0430\u0442\u043a\u043e \u043e CUDA<\/h4>\n<p>  CUDA \u2013 \u044d\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c API, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 Nvidia. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e API \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 CUDA-\u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0434\u043b\u044f \u0448\u0438\u0440\u043e\u043a\u043e\u0433\u043e \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 GPGPU (\u043d\u0435\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430\u0445). \u0417\u0434\u0435\u0441\u044c \u043e \u043d\u0438\u0445 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e <a href=\"https:\/\/numba.pydata.org\/numba-doc\/latest\/index.html\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435e<\/a>.<\/p>\n<p>  <i>NUMBA<\/i><\/p>\n<p>  Numba \u2013 \u044d\u0442\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u0439 JIT-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e Python \u0438 NumPy \u0432 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 LLVM, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 llvmlite \u043d\u0430 Python. \u0412 \u044d\u0442\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044e \u043a\u043e\u0434\u0430 \u043d\u0430 Python \u0434\u043b\u044f CPU \u0438 GPU, \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. <a href=\"https:\/\/numba.pydata.org\/numba-doc\/latest\/index.html\">\u0421\u043c. \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435e<\/a>.<br \/>  \u0420\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c <a href=\"https:\/\/www.nvidia.com\/en-us\/data-center\/volta-gpu-architecture\/\">Nvidia Volta V100 16GB GPU<\/a>, \u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 Numba.<\/p>\n<p>  <i>\u0414\u0435\u0442\u0430\u043b\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b ~ \u043f\u043e\u0442\u043e\u043a\u0438, \u0431\u043b\u043e\u043a\u0438 \u0438 \u0433\u0440\u0438\u0434\u044b<\/i><\/p>\n<p>  CUDA \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u0430\u043a\u0438\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043a\u0430\u043a \u043f\u043e\u0442\u043e\u043a\u0438, \u0431\u043b\u043e\u043a\u0438 \u0438 \u0433\u0440\u0438\u0434\u044b.<\/p>\n<p>  <b>\u041f\u043e\u0442\u043e\u043a<\/b>: \u043f\u043e\u0442\u043e\u043a CUDA \u2013 \u044d\u0442\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0438\u0445\/\u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0432 \u044f\u0434\u0440\u043e CUDA (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440). \u041d\u0430 \u043b\u0435\u0442\u0443 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438 \u0442\u043e\u043c \u0436\u0435 \u044f\u0434\u0440\u0435 CUDA \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e 32 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0437\u0432\u0435\u043d\u044c\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430). \u042d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044f\u0434\u0440\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u044f \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <b>\u0411\u043b\u043e\u043a<\/b>: \u044d\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u0430: \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0438 \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u041c\u043e\u0436\u043d\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>_syncthreads()<\/code>, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u043f\u043e\u0442\u043e\u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0432 \u044f\u0434\u0440\u0435 \u0438 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0431\u043b\u043e\u043a\u0435 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u044d\u0442\u043e\u0439 \u0436\u0435 \u0442\u043e\u0447\u043a\u0438.<\/p>\n<p>  <b>\u0413\u0440\u0438\u0434<\/b>: \u042d\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u043b\u043e\u043a\u043e\u0432. \u041c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u044f\u043a\u0430\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fu\/q_\/rm\/fuq_rmemxkfpo8o9wkx4es362s8.png\"><\/p>\n<p>  CUDA: \u043f\u043e\u0442\u043e\u043a\u0438, \u0431\u043b\u043e\u043a\u0438, \u0433\u0440\u0438\u0434\u044b ~ <a href=\"https:\/\/www.researchgate.net\/figure\/Distribution-of-threads-and-blocks-in-a-computational-grid-of-a-GPU-see-online-version_fig1_262399038\">\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a><\/p>\n<p>  \u041d\u043e \u0433\u0434\u0435 \u0436\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u0438, \u0431\u043b\u043e\u043a\u0438 \u0438 \u0433\u0440\u0438\u0434\u044b? \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b G80 GPU \u043e\u0442 Nvidia, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043f\u043e-\u0432\u0438\u0434\u0438\u043c\u043e\u043c\u0443, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<p>  <i>\u0413\u0440\u0438\u0434 \u2192 GPU: \u0412\u0435\u0441\u044c \u0433\u0440\u0438\u0434 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c GPU-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c.<br \/>  \u0411\u043b\u043e\u043a \u2192 \u041c\u041f: \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 GPU \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u0433\u0440\u0438\u0434\u0435. \u041e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u041c\u041f.<br \/>  \u041f\u043e\u0442\u043e\u043a \u2192 \u041f\u041f: \u041a\u0430\u0436\u0434\u044b\u0439 \u041c\u041f \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u041f\u041f), \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u041f\u041f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u0431\u043b\u043e\u043a\u0435.<\/i><\/p>\n<p>  \u042f \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438\u0437 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/llpanorama.wordpress.com\/2008\/06\/11\/threads-and-blocks-and-grids-oh-my\/\">\u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h4>5. \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u043d\u0430 Python, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f GPU<\/h4>\n<p>  \u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435, \u0441\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u043f\u043e\u043c\u043e\u0447\u044c \u0448\u0438\u0440\u043e\u043a\u043e\u0439 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0438\u043b\u0443 GPU \u0438 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c GPU \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043b\u044f GPU, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432.<\/p>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u2018a\u2019 \u0438 \u2018b\u2019 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u2018n\u2019. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u2018c\u2019, \u0442\u0430\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 c \u044f\u0432\u043b\u044f\u043b\u0441\u044f \u0441\u0443\u043c\u043c\u043e\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 \u2018a\u2019 \u0438 \u2018b\u2019. \u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u0430 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043b\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GPU.<\/p>\n<p>  \u041c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c n \u043f\u043e\u0442\u043e\u043a\u043e\u0432\/\u044f\u0434\u0435\u0440. \u0418\u043d\u0434\u0435\u043a\u0441, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u044b:<\/p>\n<p>  <code>index = cuda.blockIdx.x * cuda.blockDim.x + cuda.threadIdx.x<\/code><\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435\u0439 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<p>  <code>row = cuda.blockIdx.x * cuda.blockDim.x + cuda.threadIdx.x<br \/>  col = cuda.blockIdx.x * cuda.blockDim.x + cuda.threadIdx.x<\/code><\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0430 \u0431\u043b\u043e\u043a, \u0441\u043a\u0430\u0436\u0435\u043c, tpb \u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u0433\u0440\u0438\u0434, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c bpg. \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0434\u043b\u044f \u043d\u0438\u0445.<\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0432\u0430\u0436\u043d\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e: \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u0438\u0435-\u043b\u0438\u0431\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043d\u0430 GPU, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c GPU, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0445\u043e\u0441\u0442. \u042d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>cuda.to_device()<\/code> \u0438 <code>copy_to_host()<\/code>, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Numba \u043d\u0430 Python.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u043a \u0434\u043b\u044f CPU, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f GPU. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043e\u0431\u0430 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443.<\/p>\n<pre><code class=\"python\">c = np.zeroes(n) for i in range(n):     c[i] = a[i] + b[i] return c<\/code><\/pre>\n<p>  <i>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f CPU.<\/i><\/p>\n<pre><code class=\"python\">from numba import cuda # \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Nvidia \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPU  import numpy as np   @cuda.jit('void(float32[:], float32[:], float32[:])') #\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 Cuda  def cuda_addition(a,b,c):     &quot;&quot;&quot;\u041f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430.&quot;&quot;&quot;     i = cuda.blockIdx.x * cuda.blockDim.x + cuda.threadIdx.x # \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430     if i &gt; c.size:         return     c[i] = a[i]+b[i] #Perform the addition   # \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 device = cuda.get_current_device()  # \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441 \u0445\u043e\u0441\u0442\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e d_a = cuda.to_device(a)  # \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c GPU d_b = cuda.to_device(b)  # \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c GPU d_c = cuda.device_array_like(a)  tpb = device.WARP_SIZE       #blocksize \u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0430 \u0431\u043b\u043e\u043a, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 = 32 bpg = int(np.ceil((n)\/tpb))  # \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u0433\u0440\u0438\u0434  cuda_addition[bpg, tpb](d_a, d_b, d_c) # \u0432\u044b\u0437\u043e\u0432 \u044f\u0434\u0440\u0430  # \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442 c = d_c.copy_to_host() print(c) <\/code><\/pre>\n<p>  <i>\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f GPU <\/i><\/p>\n<h4>6. \u041d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GPU<\/h4>\n<p>  \u0425\u043e\u0440\u043e\u0448\u0435\u043d\u044c\u043a\u043e \u0432\u043d\u0438\u043a\u043d\u0443\u0432 \u0432 \u0442\u0435\u043e\u0440\u0438\u044e \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435: \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u043f-3 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 GPU.<br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 n \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u0438 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c n \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043d\u0438\u0445, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044f \u043f\u043e 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435. \u0417\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a. <\/p>\n<pre><code class=\"python\">from numba import cuda # Nvidia's GPU Library import numpy as np  import math #\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, Numpy \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 GPU import random  # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430                 @cuda.jit('void(float32[:,:],float32[:],int32[:],float32[:],int32[:],float32[:],int32[:])') # CUDA Just-in-time Compiler def cuda_dist(X,first_best_val,first_best_index,second_best_val,second_best_index,third_best_val,third_best_index):     &quot;&quot;&quot;\u041f\u043e\u0442\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430.&quot;&quot;&quot;     # \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443     row = cuda.blockIdx.x * cuda.blockDim.x + cuda.threadIdx.x;     if ((row &gt;= n)): # \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043c\u0430\u0442\u0440\u0438\u0446         return     first_best_val[row] = SMALL # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     first_best_index[row] = -1 # \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     second_best_val[row] = SMALL # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     second_best_index[row] = -1 # \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     third_best_val[row] = SMALL # \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439     third_best_index[row] = -1 # \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u043f\u043e \u0441\u0445\u043e\u0436\u0435\u0441\u0442\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0434\u0435\u0441\u044c     for i in range(n):         if(i==row): # \u0422\u043e\u0442 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442             continue         # \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 numpy \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 GPU         tmp = 0.0         magnitude1 = 0.0         magnitude2 = 0.0         for j in range(k):             tmp += X[row,j] * X[i,j]             magnitude1 += (X[row,j]* X[row,j])             magnitude2 += (X[i,j]* X[i,j])         tmp \/= (math.sqrt(magnitude1)*math.sqrt(magnitude2)) # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f Dot_product(a,b) = a.b\/(|a|*|b|)         if(tmp&gt;=first_best_val[row]):             third_best_val[row] = second_best_val[row]             third_best_index[row] = second_best_index[row]             second_best_val[row] = first_best_val[row]             second_best_index[row] = first_best_index[row]             first_best_val[row] = tmp             first_best_index[row] = i         elif(tmp&gt;=second_best_val[row]):             third_best_val[row] = second_best_val[row]             third_best_index[row] = second_best_index[row]             second_best_val[row] = tmp             second_best_index[row] = i         elif(tmp&gt;third_best_val[row]):             third_best_val[row] = tmp             third_best_index[row] = i  # \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 device = cuda.get_current_device()  d_x = cuda.to_device(X) d_first_val = cuda.device_array_like(first_val) d_first_index = cuda.device_array_like(first_index) d_second_val = cuda.device_array_like(second_val) d_second_index = cuda.device_array_like(second_index) d_third_val = cuda.device_array_like(third_val) d_third_index = cuda.device_array_like(third_index)   tpb = device.WARP_SIZE       # blocksize \u0438\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0430 \u0431\u043b\u043e\u043a bpg = int(np.ceil((n)\/tpb))  # \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u0433\u0440\u0438\u0434  %time cuda_dist[bpg,tpb](d_x,d_first_val,d_first_index,d_second_val,d_second_index,d_third_val,d_third_index) # \u0432\u044b\u0437\u043e\u0432 \u044f\u0434\u0440\u0430  # \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442 first_val = d_first_val.copy_to_host() print (first_val[:10]) # \u041f\u0435\u0440\u0432\u044b\u0435 10 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 # \u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442 first_index = d_first_index.copy_to_host() print (first_index[:10]) # \u041f\u0435\u0440\u0432\u044b\u0435 10 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 <\/code><\/pre>\n<p>  <i>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f GPU ~ \u041a\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f 3 \u043f\u043e\u0437\u0438\u0446\u0438\u0439, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u0443\u044e <\/i><\/p>\n<p>  <b>\u0417\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f<\/b><\/p>\n<p>  \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 GPU \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u043e\u043f-3 \u0441\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e 481 \u043c\u0441 (0,5 \u0441\u0435\u043a\u0443\u043d\u0434). \u0415\u0449\u0435 20 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430 \u0445\u043e\u0441\u0442 \u0438 \u0441 \u0445\u043e\u0441\u0442\u0430 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<h4>7. \u0412\u044b\u0432\u043e\u0434<\/h4>\n<p>  \u0417\u0430\u0434\u0430\u0447\u0430, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430 CPU \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u0431\u044b \u043e\u043a\u043e\u043b\u043e 2 \u0434\u043d\u0435\u0439, \u043d\u0430 GPU \u0431\u044b\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0430 \u0437\u0430 20,5 \u0441\u0435\u043a\u0443\u043d\u0434. \u042d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u043e\u0438\u0441\u043a 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u2018A\u2019 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0438\u0441\u043a\u0430 3 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0434\u043b\u044f \u2018B\u2019. \u041c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u044d\u0442\u0438\u043c \u0444\u0430\u043a\u0442\u043e\u043c \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 GPU, \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442, \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u043e\u0433\u0443\u0447\u0435\u0433\u043e GPU.<\/p>\n<h4>8. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438<\/h4>\n<p>  \u0414\u0430\u043d\u043d\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043d\u0430 MLP (\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f) \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/medium.com\/@WalmartLabs\">Walmart Labs<\/a>. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0410\u044e\u0448\u0443 \u041a\u0443\u043c\u0430\u0440\u0443 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/505590\/\"> https:\/\/habr.com\/ru\/company\/piter\/blog\/505590\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/505590\/\">\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>  \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0443\u044e \u0442\u0435\u043c\u0443 \u2014 Python \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPU. \u0410\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u043e\u0441\u0442\u0438, \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u044f \u0435\u0433\u043e \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u043c\u0438 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430\u043c\u0438. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xb\/mv\/xr\/xbmvxrrximpm1_fchk6fsi9v5fg.jpeg\">  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-304930","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304930","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=304930"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/304930\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=304930"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=304930"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=304930"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}