{"id":314927,"date":"2020-12-15T21:00:45","date_gmt":"2020-12-15T21:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=314927"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=314927","title":{"rendered":"Radix sort \u2014 \u0432\u044b\u0436\u0430\u0442\u044c \u0432\u0441\u0451"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kk\/0c\/qb\/kk0cqbkcacdkl5xfnrddmvr4big.png\"><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0441\u0435\u0445 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0425\u043e\u0447\u0443 \u0412\u0430\u043c \u043f\u043e\u0432\u0435\u0434\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0438\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f\u0445 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0432 \u0446\u0435\u043b\u043e\u043c \u0438 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 radix \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u0411\u0443\u0434\u0443\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0441 \u043c\u043d\u043e\u0433\u043e\u043b\u0435\u0442\u043d\u0438\u043c \u0441\u0442\u0430\u0436\u0435\u043c, \u0432\u0441\u0451 \u0447\u0430\u0449\u0435 \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u0435\u0439 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f: <\/p>\n<p>  \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u0432\u044b\u0440\u043e\u0441\u043b\u0430, \u043d\u043e \u0438 \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0438\u0437\u0440\u044f\u0434\u043d\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0430.<\/p>\n<p>  \u041f\u043e\u043b\u0430\u0433\u0430\u044e \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043e\u0431\u0449\u0435\u0439 \u0438\u0434\u0435\u0435\u0439 \u043e\u0442\u0434\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0441\u0451 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0438 \u0441\u0432\u0435\u0440\u0445\u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \/ \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u042f\u0437\u044b\u043a\u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 Ruby \u0438\u043b\u0438 Python \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e &#8216;\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0445\u0430\u0440\u0430&#8217;, \u044f \u0431\u044b \u0434\u0430\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b &#8216;\u041c\u0451\u0434\u0430&#8217;, \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0440\u0430\u0437\u044b, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0438, \u043d\u043e \u043a\u0430\u043a\u043e\u0439 \u0446\u0435\u043d\u043e\u0439. \u041a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u0430\u044f \u0442\u0435\u043f\u043b\u043e\u0432\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430, \u043f\u0440\u043e \u043e\u0431\u044a\u0451\u043c\u044b \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043c\u043e\u043b\u0447\u0443, \u043e\u0434\u043d\u0430\u043a\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u0430 \u2013 \u0432\u0440\u0435\u043c\u044f. \u041e\u043d\u043e \u0431\u0435\u0441\u0441\u043b\u0435\u0434\u043d\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f\u0445, \u043f\u043e\u0445\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u043a\u043e\u0434\u0430, \u0432\u044b\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u0443\u043c\u043d\u044b\u043c\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430\u043c\u0438 \u043c\u0443\u0441\u043e\u0440\u0430. \u042f \u043d\u0435 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435, \u043e\u0442\u043a\u0430\u0437\u0430\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u0431\u043b\u0430\u0433 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043f\u0438\u0441\u0430\u0442\u044c \u201c\u0434\u043e\u0440\u043e\u0433\u043e\u0439\u201d \u043a\u043e\u0434, \u043b\u0438\u0448\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u201c\u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u044b\u0445 \u0433\u043e\u0440\u043b\u044b\u0448\u0435\u043a\u201d \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432 \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445. \u0427\u0430\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0447\u044c, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0432 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u043e\u0434\u043d\u0443 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443. \u0422\u0435\u043c\u0430 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0430, \u0432\u0434\u043e\u043b\u044c \u0438 \u043f\u043e\u043f\u0435\u0440\u0451\u043a, \u0447\u0442\u043e, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043d\u0430 \u044d\u0442\u043e\u043c \u043f\u0443\u0442\u0438 \u0442\u0440\u0443\u0434\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c.<\/p>\n<p>  \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b (\u043c\u0435\u043d\u0435\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432) \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u043c. \u0414\u0430\u0436\u0435, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0430\u0434\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u043d\u0438\u0432\u0435\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432), \u043e\u0442 \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u0441\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f\u0445, \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0448\u0430\u044e\u0442 \u0437\u0430\u0434\u0430\u0447\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u043b\u0443\u0447\u0448\u0435 \u0447\u0435\u043c O(n * Log n). \u041f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 n \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u042d\u0442\u0443 \u0442\u0435\u043d\u0434\u0435\u043d\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u043e\u0442\u043a\u0430\u0437\u0430\u0432\u0448\u0438\u0441\u044c \u043e\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u043c\u043d\u0435 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c Radix sort. \u0415\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c O(k * n), \u0433\u0434\u0435 k \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u0415\u0441\u043b\u0438 n \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0435\u043b\u0438\u043a\u043e, \u0430 k \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e, \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u0443 O(n * Log n).<br \/>  \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 k \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0447\u0438\u0441\u043b\u0443 \u0431\u0430\u0439\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u0422\u0430\u043a \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f DWord (int) k = 4, \u0447\u0442\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435 \u043c\u043d\u043e\u0433\u043e. \u042d\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u201c\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u044f\u043c\u0430\u201d \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u044b \u043f\u043e\u0434 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043d\u0430 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u043a\u0430\u043a \u0440\u0430\u0437 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u043b\u0438\u043d\u0438\u044e \u043a\u044d\u0448\u0430 L1 \u2013\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. (256 * 4-\u0431\u0430\u0439\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u043b\u0430)<\/li>\n<\/ul>\n<p>  \u0412 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0441\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u0431\u0438\u0442\u0443 \u0441\u0430\u043c\u044b\u0439 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u044d\u0448 L1 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0451\u0442\u0441\u044f \u0434\u043e 256 \u041a\u0411\u0430\u0439\u0442, \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u043c \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e \u0433\u0440\u0430\u043d\u0438\u0446\u0435 2-\u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>  \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043d\u043e \u0438 \u0442\u043e\u043d\u043a\u0430\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ol>\n<li>\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043d\u0430 \u0444\u043e\u043d\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0434\u0435\u0448\u0451\u0432\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, \u043a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c<\/li>\n<li>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u0438\u0442\u0430\u043c \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438<\/li>\n<li>\u0420\u0430\u0441\u0447\u0451\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439, \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u0441\u0440\u0430\u0437\u0443<\/li>\n<li>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u043a \u0441\u0442\u0430\u0440\u0448\u0438\u043c (LSD), \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/li>\n<\/ol>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c LSD \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0432 \u043c\u043e\u0451\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435) \u0437\u0430 \u0441\u0447\u0451\u0442 \u0431\u043e\u043b\u0435\u0435 \u0440\u043e\u0432\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u043b\u0443\u043a\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <br \/>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0445\u0443\u0434\u0448\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0417\u0430\u0442\u043e \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 Radix sort \u0447\u0440\u0435\u0437\u0432\u044b\u0447\u0430\u0439\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u0435\u043d.<\/p>\n<p>  \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0447\u0438\u0441\u0435\u043b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u043e, \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0443\u0436\u0435\u043d \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0432\u0438\u0434\u0430: \u043a\u043b\u044e\u0447 \u2013 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c.<br \/>  \u0414\u043b\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"cpp\">typedef struct TNode {   \/\/unsigned long long key;   unsigned int key;   \/\/unsigned short key;   \/\/unsigned  char key;   unsigned int value;   \/\/unsigned int value1;   \/\/unsigned int value2; } TNode; <\/code><\/pre>\n<p>  \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0438\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0430, \u0442\u0435\u043c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u043e\u043d\u044f\u0435\u0442 \u0435\u0451 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u0440\u0438 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0435 \u043f\u043e\u043b\u0435\u0439, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0421 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0451\u043c\u0430 \u043f\u043e\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442.<\/p>\n<p>  \u0420\u0430\u043d\u043d\u0435\u0435 \u044f \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u043b <a href=\"http:\/\/habr.com\/ru\/post\/484224\/\">\u0437\u0430\u043c\u0435\u0442\u043a\u0443<\/a> \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 Radix sort \u043d\u0430 \u043f\u0430\u0441\u043a\u0430\u043b\u044c, \u043e\u0434\u043d\u0430\u043a\u043e \u201c\u0441\u0435\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u201d \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0435\u0432\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0442\u0435\u043c\u043f\u044b \u0441\u0440\u0435\u0434\u0438 \u0437\u0430\u0432\u0441\u0435\u0433\u0434\u0430\u0442\u0430\u0435\u0432 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 &#8216;\u0441\u0438&#8217; \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 <s>&#8216;\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439&#8217;<\/s> \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 (\u0425\u043e\u0442\u044f \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u0430\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441 Pascal \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430\u044f). \u041f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043b\u044e\u0447 \u2013O2 \u0438\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0441\u0434\u0432\u0438\u0433\u0430, \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043f\u0440\u0438\u0431\u0430\u0432\u043a\u0443 \u0432 1-2% \u043a \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">C<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;stdio.h&gt; #include &lt;omp.h&gt;  #include &lt;time.h&gt; #include &lt;windows.h&gt; #include &lt;algorithm&gt; \/\/============================================================= typedef struct TNode {   \/\/unsigned long long key;   unsigned int key;   \/\/unsigned short key;   \/\/unsigned  char key;   unsigned int value;   \/\/unsigned int value1;   \/\/unsigned int value2; } TNode; \/\/============================================================= void RSort_step(TNode *source, TNode *dest, unsigned int n, unsigned int *offset, unsigned char sortable_bit) {   unsigned char *b = (unsigned char*)&amp;source[n].key + sortable_bit;   TNode *v = &amp;source[n];   while (v &gt;= source)   {     dest[--offset[*b]] = *v--;     b -= sizeof(TNode);   } } \/\/============================================================= void RSort_Node(TNode *m, unsigned int n) {   \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432   TNode *m_temp = (TNode*)malloc(sizeof(TNode) * n);    \/\/ \u0417\u0430\u0432\u043e\u0434\u0438\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d   unsigned int s[sizeof(m-&gt;key) * 256] = {0};   \/\/ \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432   unsigned char *b = (unsigned char*)&amp;m[n-1].key;   while (b &gt;= (unsigned char*)&amp;m[0].key)   {     for (unsigned int digit=0; digit&lt; sizeof(m-&gt;key); digit++)     {       s[*(b+digit)+256*digit]++;     }     b -= sizeof(TNode);   }    \/\/ \u041f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u0440\u0437\u0438\u043d   for (unsigned int i = 1; i &lt; 256; i++)   {     for (unsigned int digit=0; digit&lt; sizeof(m-&gt;key); digit++)     {       s[i+256*digit] += s[i-1+256*digit];     }   }    \/\/ \u0412\u044b\u0437\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u043a \u0441\u0442\u0430\u0440\u0448\u0438\u043c (LSD)   for (unsigned int digit=0; digit&lt; sizeof(m-&gt;key); digit++)   {     RSort_step(m, m_temp, n-1, &amp;s[256*digit] ,digit);     TNode *temp = m;     m = m_temp;     m_temp = temp;   }    \/\/ \u0415\u0441\u043b\u0438 \u043a\u043b\u044e\u0447 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439, \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432   if (sizeof(m-&gt;key)==1)   {     TNode *temp = m;     m = m_temp;     m_temp = temp;     memcpy(m, m_temp, n * sizeof(TNode));   }    free(m_temp); } \/\/============================================================= int main() {   unsigned int n=10000000;    LARGE_INTEGER frequency;   LARGE_INTEGER t1, t2, t3, t4;   double elapsedTime;    TNode *m1 = (TNode*)malloc(sizeof(TNode) * n);   TNode *m2 = (TNode*)malloc(sizeof(TNode) * n);   srand(time(NULL));    for (unsigned int i=0; i&lt;n; i++)   {       m1[i].key = rand()*RAND_MAX+rand();       m2[i].key = m1[i].key;   }    QueryPerformanceFrequency(&amp;frequency);   QueryPerformanceCounter(&amp;t1);    RSort_Node(m1, n);    QueryPerformanceCounter(&amp;t2);   elapsedTime=(float)(t2.QuadPart-t1.QuadPart)\/frequency.QuadPart;   printf(&quot;The RSort:          %.5f seconds\\n&quot;, elapsedTime);    QueryPerformanceFrequency(&amp;frequency);   QueryPerformanceCounter(&amp;t3);    std::sort(m2, m2+n,[](const TNode &amp;a, const TNode &amp;b){return a.key &lt; b.key;});    QueryPerformanceCounter(&amp;t4);   elapsedTime=(float)(t4.QuadPart-t3.QuadPart)\/frequency.QuadPart;   printf(&quot;The std::sort:      %.5f seconds\\n&quot;, elapsedTime);    for (unsigned int i=0; i&lt;n; i++)    {     if (m1[i].key!=m2[i].key)      {       printf(&quot;\\n\\n!!!!!\\n&quot;);       break;     }   }    free(m1);   free(m2);   return 0; } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">Pascal<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">program SORT; uses   SysUtils, Windows; \/\/============================================================= type TNode = record      key : Longword;      \/\/value : Longword; end; type ATNode = array of TNode; \/\/============================================================= procedure RSort_Node(var m: array of TNode); \/\/------------------------------------------------------------------------------     procedure Sort_step(var source, dest: array of TNode; len : Longword; offset: PLongword; const num: Byte);         var b : ^Byte;             v : ^TNode;         begin           b:=@source[len];           v:=@source[len];           inc(b,num);           while v &gt;= @source do           begin             dec(offset[b^]);             dest[offset[b^]] := v^;             dec(b,SizeOf(TNode));             dec(v);           end;         end; \/\/------------------------------------------------------------------------------ var \/\/ \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u0440\u0437\u0438\u043d \u043f\u0435\u0440\u0432\u044b\u043c, \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0435\u043a\u0435     s: array[0..1023] of Longword =( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);     i : Longword;     b : ^Byte;     p : Pointer; begin    GetMem(p, SizeOf(TNode)*Length(m));    \/\/ \u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u0440\u0437\u0438\u043d   b:=@m[High(m)];   while (b &gt;= @m[0]) do   begin     Inc(s[(b+3)^+256*3]);     Inc(s[(b+2)^+256*2]);     Inc(s[(b+1)^+256*1]);     Inc(s[(b+0)^+256*0]);     dec(b,SizeOf(TNode));   end;    \/\/ \u041f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u0440\u0437\u0438\u043d   for i := 1 to 255 do                                begin     Inc(s[i+256*0], s[i-1+256*0]);     Inc(s[i+256*1], s[i-1+256*1]);     Inc(s[i+256*2], s[i-1+256*2]);     Inc(s[i+256*3], s[i-1+256*3]);   end;    \/\/ \u0412\u044b\u0437\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e \u0431\u0438\u0442\u0430\u043c \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0438\u0445 \u043a \u0441\u0442\u0430\u0440\u0448\u0438\u043c   Sort_step(m, ATNode(p), High(m), @s[256*0], 0);                     Sort_step(ATNode(p), m, High(m), @s[256*1], 1);   Sort_step(m, ATNode(p), High(m), @s[256*2], 2);   Sort_step(ATNode(p), m, High(m), @s[256*3], 3);    FreeMem(p); end; \/\/=============================================================  procedure test();   const     n = 10000000;   var     m1: array of TNode;       i,j,k,j1,j2: Longword;      iCounterPerSec: TLargeInteger;     T1, T2: TLargeInteger; \/\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0414\u041e \u0438 \u041f\u041e\u0421\u041b\u0415 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     begin     SetLength(m1,n);      for i := 0 to n - 1 do     begin       m1[i].key := Random(65536 * 65536);     end;      QueryPerformanceFrequency(iCounterPerSec);\/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430   QueryPerformanceCounter(T11); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    RSort_Node(m1);        QueryPerformanceCounter(T22);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f   WRITELN('1='+FormatFloat('0.0000', (T22 - T11)\/iCounterPerSec) + ' sec.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438      SetLength(m, 0);   end;   \/\/------------------------------------------------------------------------------ begin   test();   Readln();   exit; end.    <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u042f \u043c\u0435\u0434\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u043b\u0433\u043e, \u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0412\u044b \u043f\u043e\u0434\u0441\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  \u0410 \u0435\u0441\u043b\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435? <\/p>\n<p>  \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u0448\u0430\u0433\u043e\u043c, \u043a\u0430\u043a \u043c\u043d\u0435 \u0432\u0438\u0434\u0435\u043b\u043e\u0441\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443. \u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e Radix sort \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u043b\u0441\u044f \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u044f\u0434\u0435\u0440 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u044b (\u0447\u0443\u0442\u044c \u043b\u0438 \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0435).<\/p>\n<p>  \u041f\u043e\u0434\u0434\u0430\u0432\u0448\u0438\u0441\u044c \u0438\u0441\u043a\u0443\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u043c \u043c\u043d\u0435 OpenCL. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 \u0442\u043e\u043f\u043e\u0432\u044b\u0445 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430\u0445, \u043d\u043e \u043d\u0430 \u043c\u043e\u0435\u0439 GEFORCE GTX 750 TI \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043b \u043e\u0434\u043d\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430 CPU, \u0437\u0430 \u0441\u0447\u0451\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0433\u043e\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0448\u0438\u043d\u0435 \u0442\u0443\u0434\u0430-\u0441\u044e\u0434\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0431\u044b\u043b\u0430 \u0431\u044b \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0439, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u2018\u0444\u043e\u043d\u0442\u0430\u043d\u2019. \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0412 OpenCL \u043d\u0438\u0442\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b (\u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0432 CUDA \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a, \u043f\u043e\u043f\u0440\u0430\u0432\u044c\u0442\u0435, \u043a\u0442\u043e \u0437\u043d\u0430\u0435\u0442), \u0447\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438: \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0440\u043e\u043b\u043b\u0435\u0439\u0431\u0443\u0441\u2026 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 OpenCL \u043d\u0430 \u0414\u0435\u043b\u044c\u0444\u0438&#8230; \u043d\u043e \u0437\u0430\u0447\u0435\u043c?<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430 &#8216;\u0421\u0438&#8217; \u043f\u043e\u043b\u0435\u043d\u0438\u043b\u0441\u044f, \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u043a\u0430\u043a \u0435\u0441\u0442\u044c.  <\/p>\n<pre><code class=\"delphi\">program project1;  uses Cl, SysUtils, Windows, Math; \/\/------------------------------------------------------------------------------ function OCL_Get_Prog(context: cl_context; pdevice_id: Pcl_device_id; name: PChar; S:AnsiString):cl_kernel; var   Tex:PCHAR;       Len:QWORD;       PLen:PQWORD;       Prog:cl_program;       kernel:cl_kernel;       Ret:cl_int; begin    Tex:=@S[1];    Len:=Length(S);    PLen:=@LEN;    prog:=nil;    kernel:=nil;       \/\/ \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0438\u0437 \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b      prog:= clCreateProgramWithSource(context, 1, @Tex, @Len, ret);      if CL_SUCCESS&lt;&gt;ret then writeln('clCreateProgramWithSource Error ',ret);      \/\/ \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443      ret:= clBuildProgram(prog, 1, pdevice_id, nil, nil, nil);      if CL_SUCCESS&lt;&gt;ret then writeln('clBuildProgram            Error ',ret);      \/\/ \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b      kernel:= clCreateKernel(prog, name, ret);      if  ret&lt;&gt;CL_SUCCESS then writeln('clCreateKernel            Error ',ret);      \/\/ \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443      clReleaseProgram(prog);      OCL_Get_Prog:=kernel; end; \/\/------------------------------------------------------------------------------ var    context:cl_context;    kernel1, kernel2, kernel3, kernel4 :cl_kernel;    Ret:cl_int;     valueSize : QWord =0;    s0 : PChar;     platform_id:cl_platform_id;    ret_num_platforms:cl_uint;    ret_num_devices:cl_uint;    device_id:cl_device_id;    command_queue:cl_command_queue;    S1,S2,S3,S4 : AnsiString;    memobj1, memobj2, memobj3 :cl_mem;    mem:Array of LongWord;    size:LongWord;    g_works, l_works :LongInt;     iCounterPerSec: TLargeInteger;    T1, T2, T3, T4: TLargeInteger; \/\/\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0414\u041e \u0438 \u041f\u041e\u0421\u041b\u0415 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    i,j,step:LongWord;  procedure exchange_memobj(var a,b:cl_mem); var c:cl_mem; begin   c:=a;   a:=b;   b:=c; end;  begin    \/\/---------------------------------------------------------------------------    S1 :=    \/\/ \u0428\u0430\u0433 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 1 (O\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430)    '__kernel void sort1(__global uint* m1) {'+    ' uint g_id = get_global_id(0);'+    ' m1[g_id] = 0;'+    '}';    \/\/---------------------------------------------------------------------------    S2 :=    \/\/ \u0428\u0430\u0433 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 2 (\u041f\u043e\u0434\u0441\u0447\u0451\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043f\u043e \u0431\u043b\u043e\u043a\u0430\u043c)    '__kernel void sort2(__global uint* m1, __global uint* m2, const uint len, const uint digit) {'+    ' uint g_id = get_global_id(0);'+    ' uint size = get_global_size(0);'+    ' uint a = g_id \/ len;'+    ' uchar key = (m1[g_id] &gt;&gt; digit);'+    ' atomic_inc(&amp;m2[key]);'+    ' atomic_inc(&amp;m2[256 * a + key + 256]);'+    '}';    \/\/---------------------------------------------------------------------------    S3 :=    \/\/ \u0428\u0430\u0433 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 3 (\u0420\u0430\u0441\u0447\u0451\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f)    '__kernel void sort3(__global uint* m1, const uint len) {'+    ' uint l_id = get_global_id(0);'+     ' for (uint i = 0; i &lt; 8; i++) {'+    '  uint offset = 1 &lt;&lt; i;'+    '  uint add = (l_id&gt;=offset) ? m1[l_id - offset] : 0;'+    '  barrier(CLK_GLOBAL_MEM_FENCE);'+    '  m1[l_id] += add;'+    '  barrier(CLK_GLOBAL_MEM_FENCE);'+    ' }'+     ' for (uint i = 1; i &lt; 1024; i++) {'+    '  m1[i*256+l_id + 256] += m1[(i-1)*256+l_id + 256];'+    ' }'+     '  barrier(CLK_GLOBAL_MEM_FENCE);'+     ' if (l_id&gt;0) {'+    '  for (uint i = 0; i &lt; 1024; i++) {'+    '   m1[i*256+l_id + 256] += m1[l_id-1];'+    '  }'+    ' }'+     '}';     \/\/---------------------------------------------------------------------------    S4 :=    \/\/ \u0428\u0430\u0433 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 4    '__kernel void sort4(__global uint* m1, __global uint* m2, __global uint* m3, const uint digit, const uint len) {'+    ' uint g_id = get_global_id(0);'+    ' for (int i = len-1; i &gt;= 0; i--) {'+      \/\/ \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439!    '  uchar key = (m1[g_id*len+i] &gt;&gt; digit);'+    '  m2[--m3[g_id*256 + key + 256]] = m1[g_id*len+i];'+    ' }'+    '}';    \/\/---------------------------------------------------------------------------     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b    ret := clGetPlatformIDs(1,@platform_id,@ret_num_platforms);    if CL_SUCCESS&lt;&gt;ret then writeln('clGetPlatformIDs          Error ',ret);    \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430    ret := clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, @device_id, @ret_num_devices);    if CL_SUCCESS&lt;&gt;ret then writeln('clGetDeviceIDs            Error ',ret);     clGetDeviceInfo(device_id, CL_DEVICE_NAME, 0, nil, valueSize);    GetMem(s0, valueSize);    clGetDeviceInfo(device_id, CL_DEVICE_NAME, valueSize, s0, valueSize);    Writeln('DEVICE_NAME:  '+s0);    FreeMem(s0);     \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430    context:= clCreateContext(nil, 1, @device_id, nil, nil, ret);    if CL_SUCCESS&lt;&gt;ret then writeln('clCreateContext           Error ',ret);     \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430    command_queue := clCreateCommandQueue(context, device_id, 0, ret);    if CL_SUCCESS&lt;&gt;ret then writeln('clCreateContext           Error ',ret);     \/\/-------------------------------------------------------------    kernel1 := OCL_Get_Prog(context, @device_id, 'sort1', S1);    kernel2 := OCL_Get_Prog(context, @device_id, 'sort2', S2);    kernel3 := OCL_Get_Prog(context, @device_id, 'sort3', S3);    kernel4 := OCL_Get_Prog(context, @device_id, 'sort4', S4);    \/\/-------------------------------------------------------------     size:=256*256*16*10;     g_works := size;    l_works := 256;     Randomize;    SetLength(mem, size);     for i:=0 to size-1 do mem[i]:=random(256*256*256*256);     \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0443\u0444\u0435\u0440\u044b \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0445    memobj1 := clCreateBuffer(context, CL_MEM_READ_WRITE, size * sizeof(cl_uint), nil, ret);    if  ret&lt;&gt;CL_SUCCESS then writeln('clCreateBuffer1            Error ',ret);    memobj2 := clCreateBuffer(context, CL_MEM_READ_WRITE, size * sizeof(cl_uint), nil, ret);    if  ret&lt;&gt;CL_SUCCESS then writeln('clCreateBuffer2            Error ',ret);    memobj3 := clCreateBuffer(context, CL_MEM_READ_WRITE, (256+256*1024) * sizeof(cl_uint), nil, ret);    if  ret&lt;&gt;CL_SUCCESS then writeln('clCreateBuffer3            Error ',ret);     QueryPerformanceFrequency(iCounterPerSec); \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T1); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     \/\/ \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440    ret := clEnqueueWriteBuffer(command_queue, memobj1, CL_TRUE, 0, size * sizeof(cl_int), @mem[0], 0, nil, nil);    if  ret&lt;&gt;CL_SUCCESS then writeln('clEnqueueWriteBuffer      Error ',ret);     QueryPerformanceCounter(T2);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('write       '+FormatFloat('0.0000', (T2 - T1)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     QueryPerformanceFrequency(iCounterPerSec); \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T3); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438      for step:=0 to 3 do    begin     \/\/-------------------------------------------------------------    QueryPerformanceFrequency(iCounterPerSec); \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T1); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    \/\/-------------------------------------------------------------    \/\/ 1 \u0428\u0410\u0413 (\u043e\u0447\u0438\u0442\u0441\u043a\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430)    ret:= clSetKernelArg(kernel1, 0, sizeof(cl_mem), @memobj3 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_1_1            Error ',ret);     i := 256+256*1024;    ret:= clEnqueueNDRangeKernel(command_queue, kernel1, 1, nil, @i, nil, 0, nil, nil);    if  ret&lt;&gt;CL_SUCCESS then writeln('clEnqueueNDRangeKernel_1    Error ',ret);    \/\/-------------------------------------------------------------     clFinish(command_queue); \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438    QueryPerformanceCounter(T2);  \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('step 1      '+FormatFloat('0.0000', (T2 - T1)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     QueryPerformanceFrequency(iCounterPerSec); \/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T1);  \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    \/\/-------------------------------------------------------------    \/\/ 2 \u0428\u0410\u0413 (\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u043e\u0432)     ret:= clSetKernelArg(kernel2, 0, sizeof(cl_mem), @memobj1 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_2_1            Error ',ret);    ret:= clSetKernelArg(kernel2, 1, sizeof(cl_mem), @memobj3 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_2_2            Error ',ret);    j := size div (1024);    ret:= clSetKernelArg(kernel2, 2, sizeof(j), @j );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_2_3            Error ',ret);     j:=step*8;    ret:= clSetKernelArg(kernel2, 3, sizeof(j), @j );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_2_4            Error ',ret);     i := size;    ret:= clEnqueueNDRangeKernel(command_queue, kernel2, 1, nil, @i, nil, 0, nil, nil);    if  ret&lt;&gt;CL_SUCCESS then writeln('clEnqueueNDRangeKernel_2    Error ',ret);     \/\/-------------------------------------------------------------    clFinish(command_queue); \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438    QueryPerformanceCounter(T2);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('step 2      '+FormatFloat('0.0000', (T2 - T1)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    QueryPerformanceFrequency(iCounterPerSec);\/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T1); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    \/\/-------------------------------------------------------------    \/\/ 3 \u0428\u0410\u0413 (\u043f\u0435\u0440\u0435\u0441\u0447\u0451\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439)     ret:= clSetKernelArg(kernel3, 0, sizeof(cl_mem), @memobj3 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_3_1            Error ',ret);     j := size;    ret:= clSetKernelArg(kernel3, 1, sizeof(j), @j );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_3_3            Error ',ret);     j := 256;    ret:= clEnqueueNDRangeKernel(command_queue, kernel3, 1, nil, @j, @j, 0, nil, nil);    if  ret&lt;&gt;CL_SUCCESS then writeln('clEnqueueNDRangeKernel_3    Error ',ret);     \/\/-------------------------------------------------------------    clFinish(command_queue); \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438    QueryPerformanceCounter(T2);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('step 3      '+FormatFloat('0.0000', (T2 - T1)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    QueryPerformanceFrequency(iCounterPerSec);\/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T1); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    \/\/-------------------------------------------------------------     \/\/ 4 \u0428\u0410\u0413 (\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430)    ret:= clSetKernelArg(kernel4, 0, sizeof(cl_mem), @memobj1 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_4_1            Error ',ret);    ret:= clSetKernelArg(kernel4, 1, sizeof(cl_mem), @memobj2 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_4_2            Error ',ret);    ret:= clSetKernelArg(kernel4, 2, sizeof(cl_mem), @memobj3 );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_4_3            Error ',ret);     j:=step*8;    ret:= clSetKernelArg(kernel4, 3, sizeof(j), @j );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_4_4            Error ',ret);     j := size div (1024);    ret:= clSetKernelArg(kernel4, 4, sizeof(j), @j );    if  ret&lt;&gt;CL_SUCCESS then writeln('clSetKernelArg_4_5            Error ',ret);     i := (1024);  \/\/ \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u044f\u0434\u0435\u0440    ret:= clEnqueueNDRangeKernel(command_queue, kernel4, 1, nil, @i, nil, 0, nil, nil);    if  ret&lt;&gt;CL_SUCCESS then writeln('clEnqueueNDRangeKernel_4    Error ',ret);    clFinish(command_queue);    \/\/ \u041c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430    \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432 memobj1    exchange_memobj(memobj2, memobj1);    \/\/-------------------------------------------------------------    clFinish(command_queue); \/\/ \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438    QueryPerformanceCounter(T2);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('step 4      '+FormatFloat('0.0000', (T2 - T1)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438    \/\/-------------------------------------------------------------    end;     QueryPerformanceCounter(T4);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('all not R\/W '+FormatFloat('0.0000', (T4 - T3)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438      QueryPerformanceFrequency(iCounterPerSec);\/\/\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430    QueryPerformanceCounter(T1); \/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438     \/\/ \u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430    ret:= clEnqueueReadBuffer(command_queue, memobj1, CL_TRUE, 0, size * sizeof(cl_int), @mem[0], 0, nil, nil);    if  ret&lt;&gt;CL_SUCCESS then writeln('clEnqueueReadBuffer       Error ',ret);     QueryPerformanceCounter(T2);\/\/\u0437\u0430\u0441\u0435\u043a\u043b\u0438 \u0432\u0440\u0435\u043c\u044f \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f    Writeln('Read        '+FormatFloat('0.0000', (T2 - T1)\/iCounterPerSec) + ' second.');\/\/\u0432\u044b\u0432\u0435\u043b\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438       \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u044b    clReleaseMemObject(memobj1);           \/\/ \u0412\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0431\u0443\u0444\u0435\u0440\u0430    clReleaseMemObject(memobj2);    clReleaseMemObject(memobj3);    clReleaseKernel(kernel1);              \/\/ \u0412\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f    clReleaseKernel(kernel2);    clReleaseKernel(kernel3);    clReleaseKernel(kernel4);    clReleaseCommandQueue(command_queue);  \/\/ \u0412\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c    clReleaseContext(context);             \/\/ \u0412\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430    \/\/-------------------------------------------------------------    SetLength(mem, 0);    readln; end.   <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041e\u0441\u0442\u0430\u043b\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043d\u0435 \u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2013 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. \u0423\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u043b\u044b\u0439 C \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OpenMP, \u044f \u0440\u0435\u0448\u0438\u043b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0434\u0430\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u044f\u0434\u0435\u0440 CPU.<\/p>\n<p>  \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0440\u0430\u0437\u0431\u0438\u0432\u043a\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u0440\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u0438\u0445 \u0441\u043b\u0438\u044f\u043d\u0438\u0435\u043c (merge sort). \u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0448\u043b\u0430 \u043d\u0435 \u043f\u043b\u043e\u0445\u043e, \u0430 \u0432\u043e\u0442 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u043b\u043e \u0432\u0441\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u043a\u043b\u0435\u0439\u043a\u0430 \u0440\u0430\u0432\u043d\u043e\u0441\u0438\u043b\u044c\u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0445\u043e\u0434\u0443 \u043f\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u042d\u0444\u0444\u0435\u043a\u0442 \u0431\u044b\u043b \u0445\u0443\u0436\u0435 \u0447\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a. \u0417\u0430\u0431\u0440\u0430\u043a\u043e\u0432\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u043a\u0430\u043a \u043d\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0443\u044e.<\/p>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 \u0442\u0443, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u043d\u0430 GPU. \u0412\u043e\u0442 \u0441 \u043d\u0435\u0439 \u0443\u0436\u0435 \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043d\u0430 \u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>  \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<br \/>  \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0448\u0451\u043b \u043e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0430\u0442\u043e\u043c\u0430\u0440\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u0438\u043b\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0447\u0438\u0442\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435, \u0445\u043e\u0442\u044f \u0438 \u043f\u043e\u0440\u043e\u0439 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438). \u041f\u043e\u0442\u043e\u043a\u0438 \u0432\u0435\u0449\u044c \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f, \u043d\u0430 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0442\u0440\u0430\u0442\u0438\u0442 \u0434\u0440\u0430\u0433\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u044b. \u0421\u0432\u043e\u0434\u044f \u0431\u0430\u0440\u044c\u0435\u0440\u044b \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u043a\u044d\u0448\u0430 L3 \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0438, \u043e\u0431\u0449\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u0435\u043d \u0432 \u0441\u0438\u043b\u0443 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%90%D0%BC%D0%B4%D0%B0%D0%BB%D0%B0\" rel=\"nofollow\">\u0437\u0430\u043a\u043e\u043d\u0430 \u0410\u043c\u0434\u0430\u043b\u0430<\/a>, \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">C<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">#include &lt;stdio.h&gt; #include &lt;omp.h&gt; \/\/============================================================= typedef struct TNode {   \/\/unsigned long long key;   unsigned int key;   \/\/unsigned short key;   \/\/unsigned  char key;   unsigned int value;   \/\/unsigned int value1;   \/\/unsigned int value2; } TNode; \/\/============================================================= void RSort_Parallel(TNode *m, unsigned int n) {   \/\/ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432   unsigned char threads = omp_get_num_procs();   \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432   TNode *m_temp = (TNode*)malloc(sizeof(TNode) * n);   unsigned int *s = (unsigned int*)malloc(sizeof(unsigned int) * 256 * threads);    #pragma omp parallel num_threads(threads)   {     TNode *source = m;     TNode *dest = m_temp;     unsigned int l = omp_get_thread_num();     unsigned int div = n \/ omp_get_num_threads();     unsigned int mod = n % omp_get_num_threads();     unsigned int left_index  = l &lt; mod ? (div + (mod == 0 ? 0 : 1)) * l : n - (omp_get_num_threads() - l) * div;     unsigned int right_index = left_index + div - (mod &gt; l ? 0 : 1);      for (unsigned int digit=0; digit&lt; sizeof(m-&gt;key); digit++)     {       unsigned int s_sum[256] = {0};       unsigned int s0[256] = {0};       unsigned char *b1 = (unsigned char*)&amp;source[right_index].key;       unsigned char *b2 = (unsigned char*)&amp;source[left_index].key;       while (b1 &gt;= b2)       {         s0[*(b1+digit)]++;         b1 -= sizeof(TNode);       }       for (unsigned int i=0; i&lt;256; i++)       {         s[i+256*l] = s0[i];       }        #pragma omp barrier       for (unsigned int j=0; j&lt;threads; j++)       {         for (unsigned int i=0; i&lt;256; i++)         {           s_sum[i] += s[i+256*j];           if (j&lt;l)           {             s0[i] += s[i+256*j];           }         }       }        for (unsigned int i=1; i&lt;256; i++)       {         s_sum[i] += s_sum[i-1];         s0[i] += s_sum[i-1];       }       unsigned char *b = (unsigned char*)&amp;source[right_index].key + digit;       TNode *v1 = &amp;source[right_index];       TNode *v2 = &amp;source[left_index];       while (v1 &gt;= v2)       {         dest[--s0[*b]] = *v1--;         b -= sizeof(TNode);       }       #pragma omp barrier       TNode *temp = source;       source = dest;       dest = temp;     }   }    \/\/ \u0415\u0441\u043b\u0438 \u043a\u043b\u044e\u0447 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432   if (sizeof(m-&gt;key)==1)   {     memcpy(m, m_temp, n * sizeof(TNode));   }    free(s);   free(m_temp); } \/\/============================================================= int main() {   unsigned int n=10000000;    TNode *m1 = (TNode*)malloc(sizeof(TNode) * n);   srand(time(NULL));    for (unsigned int i=0; i&lt;n; i++)   {     m1[i].key = rand()*RAND_MAX+rand();   }    RSort_Parallel(m1, n);    free(m1);   return 0; } <\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>  \u0421 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0412\u0430\u0448 \u043f\u043e\u043a\u043e\u0440\u043d\u044b\u0439 \u0441\u043b\u0443\u0433\u0430, Rebuilder.<\/p>\n<p>  P.S.<br \/>  \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">P.P.S.<\/b>                         <\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dm\/m9\/cz\/dmm9czjjyrk150l7jrzvcxzslp4.jpeg\">  <\/div>\n<\/p><\/div>\n<\/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\/post\/533206\/\"> https:\/\/habr.com\/ru\/post\/533206\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/kk\/0c\/qb\/kk0cqbkcacdkl5xfnrddmvr4big.png\"><\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e \u0432\u0441\u0435\u0445 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432. \u0425\u043e\u0447\u0443 \u0412\u0430\u043c \u043f\u043e\u0432\u0435\u0434\u0430\u0442\u044c \u043e \u0441\u0432\u043e\u0438\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f\u0445 \u043d\u0430 \u0442\u0435\u043c\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043e\u043a \u0432 \u0446\u0435\u043b\u043e\u043c \u0438 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 radix \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/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-314927","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/314927","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=314927"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/314927\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=314927"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=314927"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=314927"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}