{"id":489095,"date":"2026-07-29T21:42:05","date_gmt":"2026-07-29T21:42:05","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=489095"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=489095","title":{"rendered":"\u0427\u0435\u0442\u044b\u0440\u0435 f64 \u0437\u0430 \u043e\u0434\u043d\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u0432\u0430\u0441 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438: \u043a\u0430\u043a \u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043b \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u043d\u0430 Rust \u0438 \u0441\u043b\u043e\u0432\u0438\u043b CI \u043d\u0430 \u043b\u0436\u0438"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 <\/em><code><em>_mm256_*<\/em><\/code><em> \u0431\u0435\u0437 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0438 uops \u2014 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0432\u0440\u0430\u0442\u044c \u0441\u0435\u0431\u0435<\/em><\/p>\n<hr\/>\n<h3>TL;DR<\/h3>\n<p>\u042f \u043f\u0438\u0448\u0443 Quince \u2014 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Rust. \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 QFL, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u0430\u044f VM, \u0440\u0438\u0441\u043a-\u043a\u043e\u043d\u0442\u0443\u0440, replay \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443. \u042d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043f\u0438\u0442\u043e\u043d-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 REST \u0438 \u0448\u0435\u0434\u0435\u0432\u0440\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u043c\u00bb. \u0414\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0441\u0434\u0435\u043b\u043e\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 DOM, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0438\u0441\u043a \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0440\u0434\u0435\u0440 \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 event path.<\/p>\n<p>\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 scalar loop \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u00ab\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u00bb: WMA, LSMA, CCI, Bollinger Bands \u0438 Z-Score \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 rolling window, \u0430 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0432 hot path, \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a \u043a\u044d\u0448\u0443.<\/p>\n<p>\u042f \u0432\u044b\u043d\u0435\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0448\u0435\u0441\u0442\u044c AVX2\/FMA-\u044f\u0434\u0435\u0440: <code>sum<\/code>, <code>weighted_sum<\/code>, <code>sum_and_sum_xy<\/code>, <code>sum_abs_diff<\/code>, <code>min_max<\/code>, <code>sum_sq_diff<\/code>. \u041d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <code>+<\/code> \u043d\u0430 <code>_mm256_add_pd<\/code>. \u041c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c:<\/p>\n<ul>\n<li>\n<p>\u043e\u0442\u0434\u0430\u0442\u044c SIMD \u0434\u0432\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 slice \u0431\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 wrap-around;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c hot\/cold state VM, \u0447\u0442\u043e\u0431\u044b SIMD \u043d\u0435 \u0443\u0441\u043a\u043e\u0440\u044f\u043b \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u043c\u0430\u0445\u0430\u0445 L1;<\/p>\n<\/li>\n<li>\n<p>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c scalar tail \u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c AVX, AVX2 \u0438 FMA;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c Criterion gate, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0438\u0437-\u0437\u0430 \u043d\u0430\u0433\u0440\u0435\u0432\u0430 \u00ab\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0435\u0439\u00bb;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435 \u0441\u0440\u0435\u0434\u043d\u044e\u044e, \u0430 \u0434\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438 \u0432\u0435\u0441\u044c pipeline \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a intrinsics \u0438 \u043d\u0435 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 <code>unsafe<\/code>. \u042f \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <em>\u0447\u0442\u043e<\/em> \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043d\u043e \u0438 <em>\u043f\u043e\u0447\u0435\u043c\u0443<\/em> \u043e\u043d\u0430 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 pipeline: \u043e\u0442 \u0441\u0442\u0440\u043e\u043a \u043a\u044d\u0448\u0430 \u0438 uops \u0434\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 Criterion. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c Rust \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f, \u0430 \u0441\u0443\u043c\u0430\u0441\u0448\u0435\u0434\u0448\u0438\u0439 \u043a\u0430\u0440\u0433\u043e-\u043a\u0443\u043b\u044c\u0442 \u0441 <code>_mm256_*<\/code> \u0438 \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u044b\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c.<\/p>\n<hr\/>\n<h3>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<ol start=\"0\">\n<li>\n<p><a href=\"#0\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Quince \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f latency budget<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#1\" rel=\"noopener noreferrer nofollow\">\u0418\u043b\u043b\u044e\u0437\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e Rust<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#2\" rel=\"noopener noreferrer nofollow\">\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#3\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440: \u0434\u0432\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043e\u0434\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#4\" rel=\"noopener noreferrer nofollow\">SSE, AVX, AVX2 \u0438 FMA \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#5\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0432\u043e\u0435 \u044f\u0434\u0440\u043e: sum \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#6\" rel=\"noopener noreferrer nofollow\">WMA: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0441\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 YMM<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#7\" rel=\"noopener noreferrer nofollow\">LSMA: \u0434\u0432\u0435 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#8\" rel=\"noopener noreferrer nofollow\">MAD, variance \u0438 min\/max: \u0448\u0435\u0441\u0442\u044c \u044f\u0434\u0435\u0440 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430 \u0446\u0438\u043a\u043b\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#9\" rel=\"noopener noreferrer nofollow\">Tail, alignment \u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#10\" rel=\"noopener noreferrer nofollow\">Compile-time dispatch \u043f\u0440\u043e\u0442\u0438\u0432 runtime detection<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#11\" rel=\"noopener noreferrer nofollow\">SIMD \u043d\u0435 \u0441\u043f\u0430\u0441\u0435\u0442 VM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 L1<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#12\" rel=\"noopener noreferrer nofollow\">Non-blocking hot path: \u043a\u0430\u043d\u0430\u043b\u044b, \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0438 memory ordering<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#13\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u043a Criterion \u0441\u043e\u0432\u0440\u0430\u043b \u043c\u043d\u0435 \u043d\u0430 120%<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#14\" rel=\"noopener noreferrer nofollow\">\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 regression gate \u0431\u0435\u0437 \u0433\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430 upper bound<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#15\" rel=\"noopener noreferrer nofollow\">\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u0435\u0440\u0435\u0434 production<\/a><\/p>\n<\/li>\n<\/ol>\n<hr\/>\n<p><a class=\"anchor\" name=\"0\" id=\"0\"><\/a><\/p>\n<h3>0. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Quince \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f latency budget<\/h3>\n<p>Quince \u2014 \u0442\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u043d\u0430 QFL \u2014 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c, \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 Lua. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 11 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u043e\u0439 VM.<\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"lua\">@exchange binance@network testnet@using signed_volumeon trade(t) {    feature pressure = quince.get(\"signed_volume\")    if pressure &lt; -0.6 {        quince.order(1, 0.001, 0)    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>QFL \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0440\u0430\u0434\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u0431\u0435\u0437 \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u043b\u043e\u0434\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u044b, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f instruction budget, \u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0441\u043b\u043e\u0442\u0430\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u0442\u0430\u0449\u0430\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a.<\/p>\n<p>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u043f\u0443\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>exchange WebSocket    \u2502    \u251c\u2500 strict protocol parser    \u251c\u2500 sequence \/ gap \/ staleness validation    \u25bcnormalized Trade | Depth | Fill    \u2502    \u251c\u2500 native indicator bank    \u251c\u2500 pre-resolved feature slots    \u25bcQFL register VM    \u2502    \u251c\u2500 risk controls    \u251c\u2500 shadow\/live deployment gate    \u251c\u2500 order journal    \u25bcexchange adapter<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u044f\u0434\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 replay \u043f\u043e \u0430\u0440\u0445\u0438\u0432\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u0441\u0432\u0435\u0440\u043a\u0430 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u044f\u0432\u043e\u043a, \u0443\u0447\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439 \u0438 slippage, bounded control plane \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u043d\u0430 Axum. \u041d\u043e \u044d\u0442\u0438 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0430\u0432\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c market-data thread. \u00ab\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u00bb \u2014 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430, \u0432\u0435\u0434\u044c \u043e\u0442\u0441\u044e\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u043a\u0438 latency.<\/p>\n<p>\u0412\u043e\u0442 \u0442\u0443\u0442 \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f latency \u0431\u044e\u0434\u0436\u0435\u0442. \u0415\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u043e\u0439 \u00ab\u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 VM instruction\u00bb. \u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e market event \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0443\u043c\u043c\u0430:<\/p>\n<pre><code>T_event =    T_parse  + T_integrity  + T_indicators  + T_feature_write  + T_vm  + T_risk  + T_transport  + T_telemetry<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0410 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0430\u0441 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0435:<\/p>\n<pre><code>SLO = { throughput, p50, p95, p99, max bounded work }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 SIMD \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b <code>T_indicators<\/code> \u043d\u0430 60%, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b runtime dispatch, \u0440\u0430\u0437\u0434\u0443\u043b \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043f\u043e\u0434\u043d\u044f\u043b p99 \u0432\u0441\u0435\u0433\u043e pipeline, \u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043d\u0435\u0442. \u0415\u0441\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0430\u043c\u043e\u043e\u0431\u043c\u0430\u043d. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u0431\u0435\u0434\u043e\u0439 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0440\u0430\u0442\u044c \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0445, \u0430 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0438 \u043a\u043e\u0434\u043e\u043c \u0432 \u0440\u0443\u043a\u0430\u0445.<\/p>\n<p>\u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u043c\u043a\u0430 \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 \u043d\u0435 intrinsic \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<h3>1. \u0418\u043b\u043b\u044e\u0437\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e Rust<\/h3>\n<p>Rust \u043b\u0435\u0433\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u043d\u0435\u0442 GC, \u0430 \u0440\u0435\u043b\u0438\u0437 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 <code>--release<\/code>. \u041d\u0435\u0442, \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u0441\u0442\u0440\u0430\u044f. \u041e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043b\u0430\u0442\u0438\u0442 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 runtime-\u0438\u0437\u0434\u0435\u0440\u0436\u0435\u043a. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u2014 \u043f\u0440\u043e\u043c\u0430\u0445\u0438 \u043a\u044d\u0448\u0430, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439, \u0433\u043e\u043b\u043e\u0434\u0430\u043d\u0438\u0435 frontend, \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443 \u0438 coherence traffic \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u2014 \u044f\u0437\u044b\u043a \u0438 \u0444\u043b\u0430\u0433 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f\u2026<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u0432 \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430. \u0415\u0441\u043b\u0438 alias analysis \u0434\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0415\u0441\u043b\u0438 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430 \u043f\u0440\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u0415\u0441\u043b\u0438 \u0446\u0438\u043a\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442. \u0415\u0441\u043b\u0438 LLVM \u043d\u0435 \u0441\u043f\u043e\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043e bounds checks, \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, wrap-around \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u043a\u043d\u0430. \u041a\u043e\u0440\u043e\u0447\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0430\u043b\u0438 \u0435\u043c\u0443 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0441\u0442\u043d\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0430 \u043d\u0435 \u043d\u0430\u0434\u0435\u0435\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u0430\u0433\u0438\u044e \u0431\u0443\u043a\u0432 LLVM.<\/p>\n<p>\u0412 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 hot path \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0445\u0443\u0436\u0435 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0433\u043e <code>sum(&amp;[f64])<\/code>:<\/p>\n<pre><code>WebSocket frame    -&gt; strict parse    -&gt; normalized market event    -&gt; rolling indicators    -&gt; feature slots    -&gt; bytecode VM    -&gt; risk checks    -&gt; order intent    -&gt; bounded transport<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044e \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0445, \u043f\u043e\u0438\u0441\u043a \u0432 <code>HashMap<\/code>, \u0434\u043e\u0441\u0442\u0443\u043f \u043a cold state \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u0430\u043a\u043e\u0439:<\/p>\n<blockquote>\n<p>SIMD \u2014 \u043d\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430. SIMD \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0443\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.<\/p>\n<\/blockquote>\n<p>\u0414\u043e intrinsics \u044f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430 \u0442\u0438\u043a \u043d\u0435\u0442 \u0430\u043b\u043b\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>Rolling window \u043d\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043d\u0435 \u043b\u0438\u043d\u0435\u0430\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043b\u043e\u0442 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 hot path.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0430\u043b\u044f\u0440\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0444\u043e\u043b\u0431\u0435\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043c\u044b\u0441\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c <code>core::arch::x86_64<\/code>.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<h3>2. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/h3>\n<p>\u0421\u0430\u043c\u0430\u044f \u0432\u044b\u0433\u043e\u0434\u043d\u0430\u044f SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u2014 \u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c.<\/p>\n<p>SMA \u0438 VWMA \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u0430\u0436\u0434\u044b\u0439 tick \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0448\u0438\u0440\u0438\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430. \u0414\u043b\u044f SMA \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e running sum:<\/p>\n<pre><code class=\"rust\">if let Some(evicted) = buffer.push(value) {    sum -= evicted;}sum += value;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u2014 <code>O(1)<\/code>. \u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>O(N)<\/code> \u043f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 \u0437\u0434\u0435\u0441\u044c \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u0431\u044b \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0441\u044f\u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041f\u043e \u0441\u0443\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0433\u0434\u0435 \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u043a\u043b\u0430\u0434 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445:<\/p>\n<ul>\n<li>\n<p>WMA: \u0432\u0435\u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>LSMA: \u043d\u0443\u0436\u0435\u043d <code>\u03a3y<\/code> \u0438 <code>\u03a3xy<\/code>;<\/p>\n<\/li>\n<li>\n<p>CCI: mean absolute deviation \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e;<\/p>\n<\/li>\n<li>\n<p>Bollinger\/Z-Score: \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>Stochastic: \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043d\u0430 \u043e\u043a\u043d\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 <code>O(1)<\/code> \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0438\u043b\u0438 monotonic deque. \u0418 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. \u041d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0435\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u0440\u0435\u0439\u0444\u0443\u044e\u0442 \u0438\u0437-\u0437\u0430 \u043f\u043e\u0442\u0435\u0440\u0438 \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043e\u043a\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 period;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 state \u043f\u043e\u0441\u043b\u0435 hot reload \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 state machine \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0446\u0435\u043d\u0443 \u0430\u0443\u0434\u0438\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 Quince \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043e\u0431\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430: running aggregates \u0442\u0430\u043c, \u0433\u0434\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u044b, monotonic deque \u0434\u043b\u044f VM rolling windows \u0438 SIMD-reduction \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c.<\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u043f\u0443\u0442\u044c \u043a <code>O(1)<\/code>. \u042d\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"3\" id=\"3\"><\/a><\/p>\n<h3>3. \u041a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440: \u0434\u0432\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043e\u0434\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 ring buffer \u043f\u043e\u0441\u043b\u0435 wrap-around \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>physical: [ newest ... ][ ... oldest ]                    ^ headlogical:  oldest ................. newest<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0443\u043f\u043e\u0439 \u043f\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u0434 SIMD:<\/p>\n<pre><code class=\"rust\">let linear: Vec&lt;f64&gt; = ring.iter().collect();simd_kernel(&amp;linear);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e!!! \u041c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0430\u043b\u043b\u043e\u043a\u0443, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <code>N * 8<\/code> \u0431\u0430\u0439\u0442 \u0438 \u043b\u0438\u0448\u043d\u0438\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0440\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u0440\u043e\u0434 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u0411\u0443\u043c\u0430\u0433\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443; \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0435\u043c\u0438\u044e \u043d\u0435 \u0434\u0430\u0441\u0442.<\/p>\n<p>\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 API \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"rust\">pub fn as_chunks(&amp;self) -&gt; (&amp;[f64], &amp;[f64]) {    if self.len == 0 {        (&amp;[], &amp;[])    } else if self.len &lt; self.cap {        (&amp;self.data[..self.len], &amp;[])    } else {        (&amp;self.data[self.head..self.cap], &amp;self.data[..self.head])    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c kernel \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>(a, b)<\/code> \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 <code>a<\/code>, \u043f\u043e\u0442\u043e\u043c <code>b<\/code>. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u043d\u0435\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0435\u043c\u043f-\u0431\u0443\u0444\u0435\u0440\u043e\u0432. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 slices.<\/p>\n<p>\u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f WMA\/LSMA. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c slice \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u0435\u0441 \u0438\u043b\u0438 <code>x<\/code> \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043d\u043e\u043b\u044c, \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 SIMD-\u043a\u043e\u0434 \u043d\u0430\u0447\u043d\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<\/p>\n<pre><code>\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e: a0*1 + a1*2 + ... + b0*(len(a)+1)\u043e\u0448\u0438\u0431\u043a\u0430:    a0*1 + a1*2 + ... + b0*1<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c layout \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u0432\u0430 slice \u043e\u0431\u044b\u0447\u043d\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0445\u0438\u0442\u0440\u0435\u0439\u0448\u0438\u0439 gather?<\/p>\n<ul>\n<li>\n<p><code>_mm256_i64gather_pd<\/code> \u0438\u043c\u0435\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0445\u0443\u0434\u0448\u0443\u044e throughput\/latency-\u043c\u043e\u0434\u0435\u043b\u044c, \u0447\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 load;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0432\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0435\u0442\u0447\u0435\u0440;<\/p>\n<\/li>\n<li>\n<p><code>_mm256_loadu_pd<\/code> \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 x86 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 unaligned address, \u043f\u043e\u043a\u0430 load \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0433\u043e scalar tail \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 \u0442\u0440\u0435\u043c\u044f <code>f64<\/code> \u0434\u043b\u044f AVX width 4.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e API \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u0430 \u043d\u0435 \u043a\u0440\u0443\u0442\u043e\u0439 intrinsic, \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"4\" id=\"4\"><\/a><\/p>\n<h3>4. SSE, AVX, AVX2 \u0438 FMA \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043a\u043e\u0434\u043e\u043c \u043d\u0443\u0436\u043d\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0434\u0435\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f ISA, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u00abAVX2-\u0433\u0430\u0439\u0434\u043e\u0432\u00bb \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 AVX2 \u0432\u0441\u0435, \u0447\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>_mm256_<\/code>. \u0423\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430 \u0442\u0430\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u043c \u0433\u0430\u0439\u0434\u043e\u0432 Intel.<\/p>\n<p>\u0414\u043b\u044f <code>f64<\/code>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">ISA<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0428\u0438\u0440\u0438\u043d\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>f64<\/code>\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0432\u0430\u0436\u043d\u043e<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE2<\/p>\n<\/td>\n<td>\n<p align=\"left\">128 bit<\/p>\n<\/td>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">baseline \u0434\u043b\u044f x86-64, XMM-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX<\/p>\n<\/td>\n<td>\n<p align=\"left\">256 bit<\/p>\n<\/td>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">YMM \u0438 \u0442\u0440\u0435\u0445\u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2<\/p>\n<\/td>\n<td>\n<p align=\"left\">256 bit<\/p>\n<\/td>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 SIMD \u0438 gather<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">FMA3<\/p>\n<\/td>\n<td>\n<p align=\"left\">256 bit<\/p>\n<\/td>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>a * b + c<\/code> \u0441 \u043e\u0434\u043d\u0438\u043c \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><code>_mm256_add_pd<\/code> \u2014 AVX. <code>_mm256_fmadd_pd<\/code> \u2014 FMA. \u0424\u0430\u043a\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f AVX2 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c CPU \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0430\u0441\u0442\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 FMA, \u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043e\u0431\u0435 \u0444\u0438\u0447\u0438, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f FMA.<\/p>\n<p>SSE2 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u00ab\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0448\u043b\u0430\u043a\u00bb. \u0414\u043b\u044f x86-64 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 baseline \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f branchless scalar guards. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>_mm_cmpunord_sd(x, x)<\/code> \u0441\u0442\u0440\u043e\u0438\u0442 mask \u0434\u043b\u044f NaN \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430. \u041d\u043e \u043e\u043d <strong>\u043d\u0435 \u043b\u043e\u0432\u0438\u0442 infinity<\/strong>: unordered comparison \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f NaN. \u0415\u0441\u043b\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0431\u0435\u0449\u0430\u0435\u0442 <code>NaN\/Inf sanitizer<\/code>, \u0430 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0434\u0438\u043d <code>cmpunord<\/code>, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0432\u0440\u0435\u0442. \u041f\u043e\u043b\u043d\u0430\u044f <code>is_finite<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c exponent \u0431\u0438\u0442\u044b (<code>0x7ff0_0000_0000_0000<\/code>) \u043b\u0438\u0431\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c scalar <code>is_finite()<\/code>, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u043e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u043c\u0443 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0443, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0435 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435. SIMD \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u0442 \u0432\u0430\u0441 \u043e\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Intel \u0438\u043b\u0438 AMD.<\/p>\n<p>\u041d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<pre><code class=\"rust\">#[target_feature(enable = \"avx2,fma\")]unsafe fn weighted_sum_avx2_fma(...) -&gt; f64 { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0438 runtime dispatch:<\/p>\n<pre><code class=\"rust\">if is_x86_feature_detected!(\"avx2\") &amp;&amp; is_x86_feature_detected!(\"fma\") {    unsafe { weighted_sum_avx2_fma(...) }} else if is_x86_feature_detected!(\"sse2\") {    unsafe { weighted_sum_sse2(...) }} else {    weighted_sum_scalar(...)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041b\u0438\u0431\u043e compile-time specialization:<\/p>\n<pre><code class=\"rust\">#[cfg(all(target_feature = \"avx2\", target_feature = \"fma\"))]return unsafe { weighted_sum_avx2_fma(...) };<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Compile-time \u043f\u0443\u0442\u044c \u0434\u0430\u0435\u0442 \u043d\u0443\u043b\u0435\u0432\u0443\u044e \u0446\u0435\u043d\u0443 dispatch, \u043d\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0435\u0437\u0434\u0443\u043c\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0439 CPU: \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 <code>SIGILL<\/code>, \u0430 \u043d\u0435 \u00ab\u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435\u00bb.<\/p>\n<p>Runtime detection \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u043e\u0440\u0442\u0430\u0431\u043b \u0431\u0438\u043d\u0430\u0440\u044c, \u043d\u043e \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0412\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 function pointer \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0447\u0435\u0440\u0435\u0437 <code>OnceLock<\/code>, enum backend \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043b\u0438\u0431\u043e multiversioning.<\/p>\n<p>\u0418 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u044d\u0444\u0444\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u044e\u0431\u044f\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c: \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f\u0445 Intel \u0442\u044f\u0436\u0435\u043b\u044b\u0439 AVX2 workload \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u044f\u0434\u0440\u0430. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0443\u0445\u0443\u0434\u0448\u0438\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 hot path. \u0418\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e kernel, \u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 pipeline \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0418\u043d\u0430\u0447\u0435 \u0432\u044b \u0442\u043e\u0440\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u043b\u0438 \u0444\u0443\u043b\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433 \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u043b\u0435\u043f\u0443\u044e.<\/p>\n<h4>\u0427\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 CPU: \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u0435\u0449\u0435 \u043d\u0435 uops<\/h4>\n<p>x86-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0438\u0437 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0430 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. Frontend \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0431\u0430\u0439\u0442\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438\u0437 L1I, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u0432 uops, \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432 reorder buffer, \u0430 scheduler \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 uops \u043d\u0430 execution ports. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f out-of-order, \u043d\u043e retire \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u044d\u0442\u043e\u0442 \u0430\u0431\u0437\u0430\u0446 \u2014 \u0440\u0430\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e intrinsics \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u043e\u0431\u0435\u0449\u0430\u0442\u044c \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443 \u043c\u0435\u043d\u044f AVX-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439?\u00bb \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u041d\u0443\u0436\u043d\u044b \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438:<\/p>\n<ul>\n<li>\n<p><strong>latency<\/strong> \u2014 \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0442\u043e\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p><strong>reciprocal throughput<\/strong> \u2014 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u044f\u0434\u0440\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430;<\/p>\n<\/li>\n<li>\n<p><strong>port pressure<\/strong> \u2014 \u043a\u0430\u043a\u0438\u0435 execution ports \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0437\u0430 \u044d\u0442\u0438 uops;<\/p>\n<\/li>\n<li>\n<p><strong>load\/store pressure<\/strong> \u2014 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442 \u043b\u0438 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u0440\u043c\u0438\u0442\u044c \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0446\u0435\u043f\u043e\u0447\u043a\u0430:<\/p>\n<pre><code class=\"rust\">acc = _mm256_add_pd(acc, values);acc = _mm256_add_pd(acc, next);acc = _mm256_add_pd(acc, third);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0438\u043c\u0435\u0435\u0442 loop-carried dependency: \u0432\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0436\u0434\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0435\u0440\u0432\u043e\u0439. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0443\u043c\u0435\u044e\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e vector add \u0437\u0430 \u0442\u0430\u043a\u0442, \u043e\u0434\u043d\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043d\u0435 \u0434\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c throughput. \u0414\u0432\u0430 \u0438\u043b\u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 instruction-level parallelism:<\/p>\n<pre><code class=\"rust\">acc0 = _mm256_add_pd(acc0, v0);acc1 = _mm256_add_pd(acc1, v1);acc2 = _mm256_add_pd(acc2, v2);acc3 = _mm256_add_pd(acc3, v3);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c scheduler \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u0442\u044c latency. \u041d\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u0441\u044b\u0440\u0430 \u043e\u043f\u044f\u0442\u044c \u043d\u0435\u0442: \u0440\u0430\u0441\u0442\u0435\u0442 register pressure, \u0442\u0435\u043b\u043e \u0446\u0438\u043a\u043b\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 uops, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0446\u0438\u043a\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u0434\u0443\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 YMM-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430.<\/p>\n<h4>Arithmetic intensity: \u043f\u043e\u0447\u0435\u043c\u0443 WMA \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c<\/h4>\n<p>\u0423\u0434\u043e\u0431\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2014 arithmetic intensity:<\/p>\n<pre><code>AI = \u0447\u0438\u0441\u043b\u043e arithmetic operations \/ bytes transferred<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0434\u0438\u043d YMM-load \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 32 \u0431\u0430\u0439\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 <code>f64<\/code>. FMA \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u0443\u0441\u043b\u043e\u0432\u043d\u043e 8 FLOP. \u0415\u0441\u043b\u0438 \u0432\u0435\u0441\u0430 \u0443\u0436\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445:<\/p>\n<pre><code>AI \u2248 8 FLOP \/ 32 bytes = 0.25 FLOP\/byte<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0438\u0437\u043a\u0430\u044f \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c. \u041a\u043e\u0433\u0434\u0430 \u043e\u043a\u043d\u043e \u043d\u0435 \u0432 L1, kernel \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c: \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 ALU\/FMA-\u0431\u043b\u043e\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0438\u0432\u0430\u044e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0435\u0445\u0430\u043b\u0438. \u041a\u043e\u0433\u0434\u0430 \u043e\u043a\u043d\u043e \u0432 L1, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043a load ports \u0438 \u0446\u0435\u043f\u043e\u0447\u043a\u0430\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041a\u043e\u0433\u0434\u0430 period \u0441\u043e\u0432\u0441\u0435\u043c \u043c\u0430\u043b, \u0434\u043e\u043c\u0438\u043d\u0438\u0440\u0443\u044e\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430, \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 horizontal reduction.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u00abAVX \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 double \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u04454\u00bb \u2014 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043d\u043e\u043d\u0441\u0435\u043d\u0441 \u0438 \u0447\u0443\u0448\u044c. \u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0437\u0430\u0434\u0430\u0435\u0442 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0438, \u043d\u043e \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u0430\u043a\u043e\u043d \u0410\u043c\u0434\u0430\u043b\u0430 \u0438 roofline.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043e\u043b\u044f SIMD-\u0443\u0441\u043a\u043e\u0440\u044f\u0435\u043c\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0432\u043d\u0430 <code>P<\/code>, \u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e <code>S<\/code>, \u0442\u043e:<\/p>\n<pre><code>Speedup_total = 1 \/ ((1 - P) + P \/ S)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 <code>P = 0.35<\/code> \u0438 \u0444\u0430\u043d\u0442\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c <code>S = 4<\/code> \u0432\u0435\u0441\u044c pipeline \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 <code>1.36\u00d7<\/code>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 65% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0438\u0441\u044c. \u0426\u0438\u0444\u0440\u044b, \u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0438\u0435 \u00ab\u04454 \u043d\u0430 \u0432\u0435\u0441\u044c \u0434\u0432\u0438\u0436\u043e\u043a\u00bb \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e <code>_mm256_fmadd_pd<\/code>, \u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430 \u043f\u043e\u043c\u043e\u0439\u043a\u0443.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"5\" id=\"5\"><\/a><\/p>\n<h3>5. \u041f\u0435\u0440\u0432\u043e\u0435 \u044f\u0434\u0440\u043e: sum \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430<\/h3>\n<p>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"rust\">unsafe fn sum_avx2(a: &amp;[f64], b: &amp;[f64]) -&gt; f64 {    let mut acc = _mm256_setzero_pd();    let mut tail = 0.0;    for slice in [a, b] {        let vectorized = slice.len() &amp; !3;        let (full, rem) = slice.split_at(vectorized);        for chunk in full.chunks_exact(4) {            let v = _mm256_loadu_pd(chunk.as_ptr());            acc = _mm256_add_pd(acc, v);        }        for &amp;value in rem {            tail += value;        }    }    horizontal_sum(acc) + tail}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Horizontal reduction:<\/p>\n<pre><code class=\"rust\">unsafe fn horizontal_sum(v: __m256d) -&gt; f64 {    let hi = _mm256_extractf128_pd(v, 1);    let lo = _mm256_castpd256_pd128(v);    let pair = _mm_add_pd(lo, hi);    let swapped = _mm_shuffle_pd(pair, pair, 0b01);    _mm_cvtsd_f64(_mm_add_sd(pair, swapped))}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c lanes \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e horizontal operation \u043b\u043e\u043c\u0430\u0435\u0442 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 dependency chain. \u041f\u043e\u043a\u0430 accumulator \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f YMM, \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 lane \u0440\u0435\u0434\u0443\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e. \u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437.<\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u044e\u0437\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043a\u043a\u0443\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u0432:<\/p>\n<pre><code class=\"rust\">acc0 = add(acc0, load(ptr));acc1 = add(acc1, load(ptr.add(4)));<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 latency <code>vaddpd<\/code> \u0447\u0435\u0440\u0435\u0437 instruction-level parallelism. \u041d\u043e unroll \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443: \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0435\u0440\u0435\u0442\u044c\u0441\u044f \u0432 load ports, register pressure \u0438 front-end bandwidth. \u00ab\u0411\u043e\u043b\u044c\u0448\u0435 accumulator\u00bb \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u043d\u0430\u0446\u0435\u0435\u0439.<\/p>\n<p>\u0418 \u043a\u0441\u0442\u0430\u0442\u0438 \u0434\u0430, \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f. \u0421\u043a\u0430\u043b\u044f\u0440\u043a\u0430:<\/p>\n<pre><code>(((x0 + x1) + x2) + x3) + ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>SIMD:<\/p>\n<pre><code>(x0 + x4 + ...) + (x1 + x5 + ...) + ...<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e IEEE-754 \u043d\u0435 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0442\u0435\u0441\u0442\u0430 \u2014 \u043d\u0435 bitwise equality, \u0435\u0441\u043b\u0438 bitwise determinism \u043d\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d. \u041d\u0443\u0436\u0435\u043d \u044f\u0432\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 tolerance, \u0442\u0435\u0441\u0442\u044b \u043d\u0430 NaN\/Inf \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043b\u0438 FMA \u0441 \u043e\u0434\u043d\u0438\u043c \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0447\u0435\u0440\u0435\u0437 <code>==<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0440\u0443\u0433\u0430\u0442\u044c SIMD \u2014 \u0433\u043b\u0443\u043f\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 f64 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438<\/h4>\n<p>\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u044c \u0441 <code>f32<\/code> \u0434\u043e <code>f64<\/code> \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u043e cancellation \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430, \u043c\u043b\u0430\u0434\u0448\u0438\u0435 \u0431\u0438\u0442\u044b \u043c\u0430\u043b\u043e\u0433\u043e \u0441\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0433\u043e \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f. \u0412 rolling variance \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>\u03a3x\u00b2 - (\u03a3x)\u00b2 \/ N<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0432\u0430 \u043f\u043e\u0447\u0442\u0438 \u0440\u0430\u0432\u043d\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0447\u0438\u0441\u043b\u0430. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u0435\u043d, \u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u0442\u0430\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0437-\u0437\u0430 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0437\u0430\u0449\u0438\u0442\u044b:<\/p>\n<ol>\n<li>\n<p><strong>Pairwise reduction.<\/strong> SIMD \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u0438 \u0437\u0430\u0442\u0435\u043c \u0441\u0432\u043e\u0434\u0438\u0442 \u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u043e\u043c. \u041e\u0448\u0438\u0431\u043a\u0430 \u0447\u0430\u0441\u0442\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Kahan\/Neumaier compensation.<\/strong> \u0425\u0440\u0430\u043d\u0438\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0439 \u043c\u043b\u0430\u0434\u0448\u0438\u0439 \u043e\u0441\u0442\u0430\u0442\u043e\u043a, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 dependency chains \u0438 \u043f\u043b\u043e\u0445\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0443\u044e SIMD-\u0441\u0445\u0435\u043c\u0443.<\/p>\n<\/li>\n<li>\n<p><strong>Welford variance.<\/strong> \u0427\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u0435\u0435 \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e <code>\u03a3x\u00b2 - \u03a3x\u00b2\/N<\/code>, \u043d\u043e rolling eviction \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 rebasing.<\/strong> \u0411\u044b\u0441\u0442\u0440\u044b\u0439 incremental state \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u043e, \u0430 \u0440\u0430\u0437 \u0432 <code>K<\/code> ticks \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043e\u043a\u043d\u0430 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u044b\u0431\u043e\u0440 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043d\u0435 \u043e\u0442 \u0432\u043a\u0443\u0441\u0430. \u0414\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 <code>1e-12<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u0435\u0437\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0430, \u043f\u043e\u043a\u0430 \u043f\u043e\u0440\u043e\u0433 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u043a\u043e. \u041d\u043e \u0435\u0441\u043b\u0438 <code>signal &gt; 0.0<\/code> \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0437\u0430\u044f\u0432\u043a\u0438, \u043e\u0434\u0438\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0438\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 control flow \u0441 \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c, \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u043c;)<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435 production-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c:<\/p>\n<pre><code>numeric equivalence   \u2014 |simd - scalar| &lt;= atol + rtol * |scalar|decision equivalence  \u2014 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435replay equivalence    \u2014 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c intents\/fills\/PnL<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0442\u0438\u0439 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0430 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"6\" id=\"6\"><\/a><\/p>\n<h3>6. WMA: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0441\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 YMM<\/h3>\n<p>Weighted Moving Average \u0438\u043c\u0435\u0435\u0442 \u0444\u043e\u0440\u043c\u0443\u043b\u0443:<\/p>\n<pre><code>WMA = \u03a3(y\u1d62 \u00b7 (i + 1)) \/ \u03a3(i + 1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0425\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 <code>[1.0, 2.0, ...]<\/code> \u2014 \u043b\u0438\u0448\u043d\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u044d\u0448. \u0412\u0435\u0441\u0430 \u0434\u0435\u0448\u0435\u0432\u043b\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445:<\/p>\n<pre><code class=\"rust\">let mut weights = _mm256_set_pd(    (start + 3) as f64,    (start + 2) as f64,    (start + 1) as f64,    start as f64,);let step = _mm256_set1_pd(4.0);for chunk in full.chunks_exact(4) {    let values = _mm256_loadu_pd(chunk.as_ptr());    acc = _mm256_fmadd_pd(values, weights, acc);    weights = _mm256_add_pd(weights, step);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043e\u0442 <code>a<\/code> \u043a <code>b<\/code> scalar <code>weight<\/code> \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <code>full.len()<\/code> \u0438 \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 tail. \u042d\u0442\u043e \u043c\u0435\u043b\u043a\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u0441\u0442 \u043d\u0430 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c FMA \u0434\u0430\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u043e\u0434\u043d\u0443 fused instruction \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 multiply \u0438 add;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0435\u043d\u044c\u0448\u0435 decoded uops;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0434\u043d\u043e \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043d\u043e \u043d\u0435 bitwise-\u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 scalar \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u043d\u0430\u043c\u0435\u043d\u0430\u0442\u0435\u043b\u044c <code>N(N+1)\/2<\/code> \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u0430 \u043d\u0435 \u043d\u0430 tick. \u042d\u0442\u043e \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e, \u043d\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c production-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043e\u0442\u043d\u0438 \u0442\u0430\u043a\u0438\u0445 \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439. \u0422\u043e\u0442, \u043a\u0442\u043e \u0438\u0449\u0435\u0442 \u043e\u0434\u043d\u0443 \u00ab\u0443\u043b\u044c\u0442\u0440\u0430-\u0441\u0435\u043a\u0440\u0435\u0442\u043d\u0443\u044e NDA \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e\u00bb, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0440\u0430\u0437\u0433\u0440\u0435\u0431\u0430\u0442\u044c \u0441\u043e\u0442\u043d\u044e \u043c\u0435\u043b\u043a\u0438\u0445 \u043f\u043e\u0442\u0435\u0440\u044c.<\/p>\n<p>\u0414\u043b\u044f period 10 SIMD \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0442\u044c scalar \u0438\u0437-\u0437\u0430 setup \u0438 horizontal reduction. \u0414\u043b\u044f 200 \u2014 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u043a\u0443\u043f\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 backend \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e CPU \u0444\u0438\u0447\u0435, \u043d\u043e \u0438 \u043f\u043e \u0434\u043b\u0438\u043d\u0435:<\/p>\n<pre><code class=\"rust\">if len &lt; SIMD_BREAK_EVEN {    scalar(...)} else {    avx2(...)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Break-even \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b. \u041e\u043d \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 CPU, \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0433\u0440\u0435\u0442\u044b \u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"7\" id=\"7\"><\/a><\/p>\n<h3>7. LSMA: \u0434\u0432\u0435 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434<\/h3>\n<p>Linear Regression Moving Average \u0442\u0440\u0435\u0431\u0443\u0435\u0442:<\/p>\n<pre><code>\u03a3y\u03a3xyslope = (N\u03a3xy - \u03a3x\u03a3y) \/ (N\u03a3x\u00b2 - (\u03a3x)\u00b2)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>\u03a3x<\/code> \u0438 <code>\u03a3x\u00b2<\/code> \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0438 \u043f\u0440\u0435\u0434\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f. \u041e\u0448\u0438\u0431\u043a\u0430 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u043e\u043a\u043d\u043e \u0434\u043b\u044f <code>\u03a3y<\/code>, \u0437\u0430\u0442\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0434\u043b\u044f <code>\u03a3xy<\/code>. \u0410\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0434\u043b\u044f \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e.<\/p>\n<p>\u041e\u0434\u0438\u043d load \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0432\u0435 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"rust\">let mut acc_y = _mm256_setzero_pd();let mut acc_xy = _mm256_setzero_pd();for chunk in full.chunks_exact(4) {    let y = _mm256_loadu_pd(chunk.as_ptr());    acc_y = _mm256_add_pd(acc_y, y);    acc_xy = _mm256_fmadd_pd(y, x, acc_xy);    x = _mm256_add_pd(x, four);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u00ab\u0432 \u0447\u0435\u0442\u044b\u0440\u0435 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435\u00bb. Kernel \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d:<\/p>\n<ul>\n<li>\n<p>\u0434\u0432\u0443\u043c\u044f dependency chains;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0434\u043d\u0438\u043c 32-byte load;<\/p>\n<\/li>\n<li>\n<p>FMA\/add execution ports;<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 horizontal reductions.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u2014 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0448\u043b\u0438 \u0438\u0437 L1, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 traffic \u0432\u0430\u0436\u043d\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 FLOPs.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 SoA layout \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438: \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u0447\u0435\u0442\u044b\u0440\u0435\u0445 symbols. \u042d\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u0442 horizontal reduction, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e lane \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443. \u041d\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 scheduler \u0438 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 symbols \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 ticks \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e.<\/p>\n<p>SIMD \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0438 \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c. SIMD \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u0426\u0435\u043d\u0430 \u2014 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0441\u0438 \u0438 mask lanes. \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u0443\u0442 \u043d\u0430\u0434\u043e \u043f\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u044b\u043d\u043e\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043d\u0435 \u043f\u043e \u043a\u0440\u0430\u0441\u043e\u0442\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"8\" id=\"8\"><\/a><\/p>\n<h3>8. MAD, variance \u0438 min\/max: \u0448\u0435\u0441\u0442\u044c \u044f\u0434\u0435\u0440 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430 \u0446\u0438\u043a\u043b\u043e\u0432<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 <code>sum<\/code> \u0438 <code>weighted_sum<\/code> \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0445 \u043e\u043a\u043e\u043d \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u043d\u0430\u0431\u043e\u0440\u0443 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432.<\/p>\n<h4>Mean absolute deviation (MAD)<\/h4>\n<pre><code class=\"rust\">let diff = _mm256_sub_pd(values, center);let abs = _mm256_andnot_pd(sign_mask, diff);acc = _mm256_add_pd(acc, abs);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 <code>max(diff, -diff)<\/code> \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043d\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <code>min\/max<\/code> \u043f\u0440\u0438 NaN \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430. \u041c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442 <code>abs<\/code> \u0442\u043e\u0447\u043d\u0435\u0435 \u043f\u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u044e.<\/p>\n<h4>Sum of squared deviations<\/h4>\n<pre><code class=\"rust\">let diff = _mm256_sub_pd(values, center);acc = _mm256_fmadd_pd(diff, diff, acc);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 Bollinger Bands \u0438 Z-Score. \u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0433\u0434\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440. \u0415\u0441\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 SIMD <code>sum<\/code>, \u043f\u043e\u0442\u043e\u043c SIMD <code>sum_sq_diff<\/code>, \u043e\u043a\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u0430\u0436\u0434\u044b. \u0414\u043b\u044f \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u043e\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432 L1; \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435 Welford\/\u043f\u0430\u0440\u043d\u0430\u044f \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044f, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<h4>Min\/max<\/h4>\n<pre><code class=\"rust\">mins = _mm256_min_pd(mins, values);maxs = _mm256_max_pd(maxs, values);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f sliding extrema \u043b\u0443\u0447\u0448\u0435 monotonic deque \u0441 amortized <code>O(1)<\/code>. SIMD \u0441\u043a\u0430\u043d \u0443\u043c\u0435\u0441\u0442\u0435\u043d, \u0435\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435, \u0441\u0442\u0435\u0439\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u043b\u0438 \u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u043c\u0438.<\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 primitives, \u0430 \u043d\u0435 SIMD \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e indicator<\/h4>\n<p>\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043e\u0434 \u043d\u0430 intrinsics \u2014 unsafe boundary. \u042f \u0445\u043e\u0447\u0443 \u0430\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0435\u0441\u0442\u044c kernels, \u0430 \u043d\u0435 52 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u043e\u0439 \u0438\u0437 <code>unsafe<\/code>. \u0420\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u043f\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u2014 \u043a\u043e\u043f\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u0435\u0431\u0435 \u044f\u043c\u0443 \u0442\u0435\u0445\u0434\u043e\u043b\u0433\u0430 + \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0431\u0443\u0434\u0443\u0449\u0438\u0445 UB, \u0442\u043e \u0435\u0441\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u044b\u0445 \u0443\u0431\u044b\u0442\u043a\u043e\u0432:<\/p>\n<pre><code>Indicator   -&gt; safe slice contract      -&gt; six reviewed SIMD primitives         -&gt; scalar reference<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c UB, \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 property tests \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c AVX2 backend \u043d\u0430 AVX-512\/SVE \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0444\u0438\u043d\u0430\u043d\u0441\u043e\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"9\" id=\"9\"><\/a><\/p>\n<h3>9. Tail, alignment \u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430<\/h3>\n<p>\u042d\u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441.<\/p>\n<p>\u0414\u043b\u044f \u0434\u0432\u0443\u0445 slices \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0434\u0432\u0430 tail. \u0412\u0435\u0441\/\u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"rust\">for slice in [a, b] {    \/\/ vector body    index += full.len();    for &amp;value in rem {        scalar_acc += value * index as f64;        index += 1;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0430\u0431\u043e\u0440 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u043f\u0443\u0441\u0442\u043e\u0435 \u043e\u043a\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>1, 2, 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043b\u0438\u043d\u0430 \u0440\u043e\u0432\u043d\u043e 4;<\/p>\n<\/li>\n<li>\n<p>5 \u0438 7 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>wrapped buffer, \u0433\u0434\u0435 <code>a.len()<\/code> \u0438 <code>b.len()<\/code> \u043d\u0435 \u043a\u0440\u0430\u0442\u043d\u044b \u0447\u0435\u0442\u044b\u0440\u0435\u043c;<\/p>\n<\/li>\n<li>\n<p><code>head == 0<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 wrap \u043f\u0440\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p><code>-0.0<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u044b\u0435 magnitude;<\/p>\n<\/li>\n<li>\n<p>NaN\/Inf \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<h4>Aligned \u0438\u043b\u0438 unaligned load<\/h4>\n<p><code>Vec&lt;f64&gt;<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 alignment \u0434\u043b\u044f <code>f64<\/code>, \u0430 \u043d\u0435 32 \u0431\u0430\u0439\u0442\u0430. \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c custom allocator \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>_mm256_load_pd<\/code>, \u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 x86 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435, \u043f\u043e\u0442\u043e\u043c allocator. \u041e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0430 \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c.<\/p>\n<h4>fast-math<\/h4>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 fast-math \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430 \u2014 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u0440\u043e\u0432\u043d\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b, \u0430 \u043d\u0435 compiler flag \u00ab\u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u00bb. \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c reassociation, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c signed zero \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 NaN\/Inf. \u0415\u0441\u043b\u0438 risk boundary \u043e\u0436\u0438\u0434\u0430\u0435\u0442 fail-closed \u043d\u0430 non-finite input, \u0442\u0430\u043a\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432 \u043c\u0435\u0440\u0442\u0432\u044b\u0439 \u043a\u043e\u0434. \u0417\u0430\u0442\u043e benchmark \u0431\u0443\u0434\u0435\u0442 \u0437\u0435\u043b\u0435\u043d\u044b\u043c \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430.<\/p>\n<h4>FMA \u0438 reproducibility<\/h4>\n<p>FMA \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0434\u043d\u043e \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435. Scalar <code>mul<\/code> + <code>add<\/code> \u2014 \u0434\u0432\u0430. \u041e\u0431\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b \u0432 tolerance, \u043d\u043e replay \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 CPU\/backend \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0442\u044c bitwise-identical.<\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<ol>\n<li>\n<p>\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e tolerance-level determinism.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c FMA \u0432 deterministic replay.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c numerical backend \u0432 capture\/report metadata.<\/p>\n<\/li>\n<\/ol>\n<p>\u042f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u044f\u0432\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442. \u00ab\u0423 \u043d\u0430\u0441 \u0432\u0435\u0437\u0434\u0435 <code>f64<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435\u00bb \u044d\u0442\u043e \u043d\u0435 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0437\u043c, \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0442\u043e\u043b\u043a\u0430.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"10\" id=\"10\"><\/a><\/p>\n<h3>10. Compile-time dispatch \u043f\u0440\u043e\u0442\u0438\u0432 runtime detection<\/h3>\n<p>\u0415\u0441\u0442\u044c \u0442\u0440\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.<\/p>\n<h4>1. \u041e\u0434\u0438\u043d \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 scalar binary<\/h4>\n<p>\u041c\u0438\u043d\u0438\u043c\u0443\u043c \u0440\u0438\u0441\u043a\u0430, \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0414\u043b\u044f control plane, CLI \u0438 cold path \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<\/p>\n<h4>2. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 release-\u0441\u0431\u043e\u0440\u043a\u0438<\/h4>\n<pre><code>quince-x86_64-v2quince-x86_64-v3-avx2-fma<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c CPU. \u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u043d\u0443\u043b\u0435\u0432\u0430\u044f \u0446\u0435\u043d\u0430 dispatch \u0438 \u044f\u0432\u043d\u044b\u0439 <code>SIGILL<\/code>-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.<\/p>\n<h4>3. Multiversioning \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e binary<\/h4>\n<pre><code class=\"rust\">type Kernel = fn(&amp;[f64], &amp;[f64]) -&gt; f64;static SUM: OnceLock&lt;Kernel&gt; = OnceLock::new();fn sum(a: &amp;[f64], b: &amp;[f64]) -&gt; f64 {    let kernel = SUM.get_or_init(select_sum_backend);    kernel(a, b)}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Feature detection \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437. \u041d\u043e indirect call \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c inlining. \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c backend \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 <code>IndicatorBank<\/code>, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c enum \u0438\u043b\u0438 function pointers \u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 lookup \u043d\u0430 tick.<\/p>\n<p>Compile-time <code>#[cfg(target_feature = \"avx2\")]<\/code> \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0443\u0434\u043e\u0431\u0435\u043d, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443:<\/p>\n<pre><code class=\"bash\">RUSTFLAGS='-C target-cpu=native' cargo rustc -p quince-indicators --release -- --emit=asm<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 Quince Cargo feature <code>simd<\/code> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e backend, \u0430 <code>target_feature<\/code> \u0440\u0435\u0448\u0430\u0435\u0442, \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u043b\u0438 AVX2-\u0432\u0435\u0442\u043a\u0430 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443. \u042d\u0442\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0443\u0431\u0438\u043b\u044c\u043d\u0438\u043a\u0430. \u041e\u0431\u044b\u0447\u043d\u044b\u0439 release \u0434\u043b\u044f \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e x86-64 CPU \u043e\u0431\u044f\u0437\u0430\u043d \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c scalar fallback. \u0421\u0431\u043e\u0440\u043a\u0430 \u0441 <code>-C target-cpu=native<\/code> \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0431\u0438\u043d\u0430\u0440\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u0437\u0430\u0442\u0435\u043c \u043c\u043e\u043b\u0447\u0430 \u0443\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u0430, <code>native<\/code> \u0432 CI \u2014 \u043b\u0435\u043d\u0438\u0432\u043e\u0435 \u0438 \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435: \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u0431\u0438\u043d\u0430\u0440\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 runner, \u0430 \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f. \u041b\u0438\u0431\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u043f\u043e\u0434 \u044f\u0432\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 <code>target-cpu<\/code>\/target-feature baseline, \u043b\u0438\u0431\u043e \u0434\u0435\u043b\u0430\u0439\u0442\u0435 runtime multiversioning.<\/p>\n<p>\u0418\u0449\u0438\u0442\u0435 <code>vaddpd<\/code>, <code>vfmadd*pd<\/code>, \u0448\u0438\u0440\u0438\u043d\u0443 loads \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0439 scalarization. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>sum_avx2<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442. \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0430\u043b\u044f\u0440\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<p>\u041d\u0430 Linux \u043f\u043e\u043b\u0435\u0437\u043d\u044b:<\/p>\n<pre><code class=\"bash\">perf stat -e cycles,instructions,branches,branch-misses,cache-misses \\  target\/release\/your-benchmarkperf record -g target\/release\/your-benchmarkperf report<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 IPC, cache misses \u0438 cycles\/event. <code>ns\/iter<\/code> \u0431\u0435\u0437 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"11\" id=\"11\"><\/a><\/p>\n<h3>11. SIMD \u043d\u0435 \u0441\u043f\u0430\u0441\u0435\u0442 VM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 L1<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 QFL VM. \u0422\u0430\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u0430 \u0432 <code>u64<\/code>:<\/p>\n<pre><code>[ opcode:8 | rd:8 | rs1:8 | rs2:8 | imm:32 ]<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Register file \u2014 256 \u0432\u043e\u0441\u044c\u043c\u0438\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0441\u043b\u043e\u0442\u043e\u0432, <code>i64\/f64<\/code> \u0447\u0435\u0440\u0435\u0437 <code>#[repr(C)] union<\/code>. \u0412 hot state \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f registers, <code>pc<\/code>, call stack \u0438 code pointer. \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b balances, indicator slots, depth book, rolling arenas \u0438 profiler \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0432 <code>Box&lt;ColdVm&gt;<\/code>.<\/p>\n<p>\u0417\u0430\u0447\u0435\u043c? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e SIMD-kernel \u0434\u043b\u0438\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 L1 miss \u043b\u0435\u0433\u043a\u043e \u0441\u044a\u0435\u0434\u0430\u0435\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u0439 \u0431\u044e\u0434\u0436\u0435\u0442. \u0415\u0441\u043b\u0438 <code>Vm<\/code> \u0442\u0430\u0441\u043a\u0430\u0435\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 30+ KB cold arrays, \u043a\u0430\u0436\u0434\u044b\u0439 dispatch \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0437\u0430 L1D. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e \u0446\u0435\u043d\u0435 \u043e\u0434\u043d\u043e\u0439 <code>vaddpd<\/code> \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434\u0438 \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>Dispatch \u2014 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 function pointers \u043d\u0430 256 \u043e\u043f\u043a\u043e\u0434\u043e\u0432. Handler:<\/p>\n<ol>\n<li>\n<p>\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043f\u043e\u043b\u044f instruction \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0438\u0442\u0430\u0435\u0442 registers \u0447\u0435\u0440\u0435\u0437 <code>get_unchecked<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e;<\/p>\n<\/li>\n<li>\n<p>tail-dispatches \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 handler.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u0430\u044f VM, \u0430 \u043d\u0435 \u0441\u0442\u0435\u043a\u043e\u0432\u0430\u044f VM? \u0412 \u0441\u0442\u0435\u043a \u043c\u0430\u0448\u0438\u043d\u0435 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 implicit push\/pop, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 traffic \u043a operand stack \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0430\u0439\u0442\u043a\u043e\u0434-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u0445 \u0436\u0435 data dependencies. \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u044b\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 <code>rd<\/code>, <code>rs1<\/code>, <code>rs2<\/code> \u043f\u0440\u044f\u043c\u043e \u0432 packed instruction. \u0411\u0430\u0439\u0442\u043a\u043e\u0434 \u0448\u0438\u0440\u0435, \u0437\u0430\u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u043c\u0435\u043d\u044c\u0448\u0435 dispatches \u043d\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>dataflow \u0432\u0438\u0434\u0435\u043d compiler passes;<\/p>\n<\/li>\n<li>\n<p>constant propagation \u0438 CSE \u043f\u0440\u043e\u0449\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043b\u043e\u0442\u043d\u043e\u043c register file;<\/p>\n<\/li>\n<li>\n<p>handler \u043d\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 top-of-stack protocol.<\/p>\n<\/li>\n<\/ul>\n<p>Indirect dispatch \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u0435\u0442 \u0441 branch prediction. CPU \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c target \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e function pointer. \u0415\u0441\u043b\u0438 opcode stream \u0445\u0430\u043e\u0442\u0438\u0447\u0435\u043d, branch target buffer \u043e\u0448\u0438\u0431\u0430\u0435\u0442\u0441\u044f, pipeline \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f, \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u043b\u0435\u043d\u043d\u044b\u0445 ALU uops \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043d\u0435\u0432\u0430\u0436\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 VM \u0434\u0432\u0430\u0436\u0434\u044b: \u043e\u043d \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 opcode sequence \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0439.<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 <code>#[inline(always)]<\/code> \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0440\u0430\u0437\u0434\u0443\u0442\u044c handlers \u0438 instruction footprint. L1I \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442, \u0430 \u043d\u0435 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u0430\u043c\u0438. \u041a\u043e\u0433\u0434\u0430 hot dispatch code \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f, frontend \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043a\u043e\u0440\u043c\u0438\u0442\u044c backend \u0440\u044b\u0432\u043a\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u00ab\u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u00bb \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043d\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. Hot handlers \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c\u0438, cold error\/reporting paths \u2014 \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u044b\u043c\u0438 \u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043a\u0430\u043a \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0435.<\/p>\n<p>Packed <code>u64<\/code> \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u0435\u0442 predictable fetch:<\/p>\n<pre><code>8 bytes\/instruction8 instructions\/cache line \u043f\u0440\u0438 line size 64 \u0431\u0430\u0439\u0442<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 jumps \u0438 entry layout. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440 binary, \u0430 <code>L1-icache-load-misses<\/code>, <code>branch-misses<\/code>, <code>idq_uops_not_delivered<\/code> \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e PMU. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043c\u0438\u043a\u0440\u043e\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u2014 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>perf<\/code> \u0438\u0437 \u0447\u0443\u0436\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 CPU \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0435\u0441\u0441\u043c\u044b\u0441\u043b\u0435\u043d\u043d\u043e.<\/p>\n<p><code>unsafe<\/code> \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u043d\u0435 \u00ab\u0443\u043b\u044c\u0442\u0440\u0430-\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435\u00bb. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 type checker \u0434\u043e VM \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>register index \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435;<\/p>\n<\/li>\n<li>\n<p>instruction encoding \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u043a\u043e\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>code pointer \u0432\u0430\u043b\u0438\u0434\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>jump target \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d;<\/p>\n<\/li>\n<li>\n<p>instruction budget \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u0430\u0447\u0435 \u043e\u0434\u0438\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HFT-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u0414\u043e VM \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0438\u0437 11 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432: constant folding, CFG simplify, SCCP, CSE, local shadowing, LICM, loop unroll, fused lowering, GVN, DCE, persist coalescing. \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0433\u043e\u0434\u043d\u0435\u0435, \u0447\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0435\u0435 dispatch.<\/p>\n<p>\u042d\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f, \u0447\u0442\u043e \u0441\u043e SMA:<\/p>\n<blockquote>\n<p>\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443, \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f.<\/p>\n<\/blockquote>\n<hr\/>\n<p><a class=\"anchor\" name=\"12\" id=\"12\"><\/a><\/p>\n<h3>12. Non-blocking hot path: \u043a\u0430\u043d\u0430\u043b\u044b, \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0438 memory ordering<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0446\u0435 \u0447\u0442\u043e-\u0442\u043e \u0442\u0438\u043f\u0430 <code>Mutex&lt;HashMap&lt;...&gt;&gt;<\/code> \u0434\u043b\u044f \u043c\u0435\u0442\u0440\u0438\u043a. \u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e \u0435\u0449\u0435 \u0440\u0430\u0437!!! \u0412\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u043e\u0435\u0445\u0430\u0442\u044c \u0434\u043e \u043b\u043e\u043a\u0430.<\/p>\n<p>\u0412 Quince engine loop \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u0439\u0442\u0430. \u0412\u043d\u0435\u0448\u043d\u0438\u0435 producers \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 bounded <code>crossbeam<\/code> sender \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 <code>try_send<\/code>. \u041e\u043d\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c engine;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c VM\/risk\/order state;<\/p>\n<\/li>\n<li>\n<p>\u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>Engine \u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 batch \u043a\u043e\u043c\u0430\u043d\u0434 \u0437\u0430 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. Boundedness \u043d\u0443\u0436\u043d\u0430 \u0441 \u043e\u0431\u0435\u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d: bounded channel \u0431\u0435\u0437 bounded drain \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0442\u0435\u0441\u043d\u0438\u0442\u044c market data.<\/p>\n<p>Hot telemetry \u2014 fixed-size atomics:<\/p>\n<pre><code class=\"rust\">market_events.fetch_add(1, Ordering::Relaxed);latency_buckets[bucket].fetch_add(1, Ordering::Relaxed);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>Relaxed<\/code> \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d \u0434\u043b\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432, \u0433\u0434\u0435 \u043d\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0414\u043b\u044f readiness\/revision \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f Release\/Acquire, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0438\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 64 log2 buckets. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e HDR allocation, lock \u0438\u043b\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u0442\u0438\u043a\u0430\u0445:<\/p>\n<pre><code class=\"rust\">let bucket = 63 - nanos.leading_zeros() as usize;histogram[bucket].fetch_add(1, Ordering::Relaxed);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043d\u0430\u043f\u0448\u043e\u0442 \u0438 \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0438\u043b\u0435\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432\u043d\u0435 hot path.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441 cache coherence: \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e atomic counters \u0440\u044f\u0434\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 cache line. \u0415\u0441\u043b\u0438 \u043f\u0438\u0448\u0435\u0442 \u043e\u0434\u0438\u043d engine thread, \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e producers \u0434\u043e\u043b\u0431\u044f\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 counters, \u043d\u0443\u0436\u0435\u043d padding, per-thread shards \u0438\u043b\u0438 aggregation, \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 false sharing.<\/p>\n<p>Atomic RMW \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0432\u043b\u0430\u0434\u0435\u0435\u0442 cache line. \u0418 \u043d\u0435\u0442, \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0430\u0442\u043e\u043c\u0438\u043a\u0430 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u00ab\u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0439\u00bb \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u2014 \u044d\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u043e\u0439 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u043a\u0430\u0440\u0433\u043e-\u043a\u0443\u043b\u044c\u0442.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"13\" id=\"13\"><\/a><\/p>\n<h3>13. \u041a\u0430\u043a Criterion \u0441\u043e\u0432\u0440\u0430\u043b \u043c\u043d\u0435 \u043d\u0430 120%<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0430\u0436\u043d\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: Criterion \u043d\u0435 \u00ab\u043f\u043b\u043e\u0445\u043e\u0439 \u0438 \u0443\u0436\u0430\u0441\u043d\u044b\u0439\u00bb. \u041e\u043d \u0447\u0435\u0441\u0442\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 samples, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u043c\u0443 \u0434\u0430\u043b\u0438. \u0415\u0441\u043b\u0438 \u0441\u0440\u0435\u0434\u0430 \u0434\u0440\u0435\u0439\u0444\u0443\u0435\u0442, \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442 \u0434\u0440\u0435\u0439\u0444 \u0441\u0440\u0435\u0434\u044b. \u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0444\u0438\u0447\u0435\u0439 \u043a\u043e\u0434\u0430. \u0422\u0435\u0440\u043c\u043e\u0434\u0430\u0442\u0447\u0438\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0430\u0433\u0440\u0435\u0432, \u0430 \u0432 \u043e\u0442\u0447\u0435\u0442\u0435 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u00ab\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u00bb. \u0423\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043b\u0436\u0438\u0432\u043e.<\/p>\n<p>\u0412 Quince benchmarks \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0438:<\/p>\n<pre><code>indicator\/update    \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e rolling formulaindicator_only\/strategy    \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 IndicatorBank \u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432vm_tick\/strategy    \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442 10 000 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 QFL handlerfull_pipeline\/strategy    indicator update + slot writes + VM eventruntime_feed    runtime boundary \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 Trade<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 kernel \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0441\u044f, \u0430 <code>full_pipeline<\/code> \u043d\u0435\u0442, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438: dispatch, \u0437\u0430\u043f\u0438\u0441\u044c slots, \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u044d\u0448 \u0438\u043b\u0438 \u0434\u043e\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u041e\u0434\u0438\u043d E2E benchmark \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0444\u0430\u043a\u0442, \u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443. \u041e\u0434\u0438\u043d microbenchmark \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u043d\u043e \u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0443\u0436\u043d\u044b \u043e\u0431\u0430 \u0441\u0440\u0430\u0437\u0443.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 stateful benchmarks. \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0435\u043b\u044c\u0437\u044f \u043a\u0430\u0436\u0434\u044b\u0439 sample \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 warmup phase \u0438\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430, \u0435\u0441\u043b\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f steady-state update. \u041d\u043e \u0435\u0441\u043b\u0438 production \u0447\u0430\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0435\u0442 runtime \u043f\u0440\u0438 hot deployment, setup \u043e\u0431\u044f\u0437\u0430\u043d \u0438\u043c\u0435\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 benchmark. \u0418\u043d\u0430\u0447\u0435 \u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0440\u044f\u0442\u0430\u043b\u0438 \u0438\u0437 \u043e\u0442\u0447\u0435\u0442\u0430, \u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438.<\/p>\n<p>\u0412 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 latency \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>distribution \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e event;<\/p>\n<\/li>\n<li>\n<p>throughput batch \u0438\u0437 10 000 events;<\/p>\n<\/li>\n<li>\n<p>tail latency \u043f\u0440\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 exchange\/control\/telemetry;<\/p>\n<\/li>\n<li>\n<p>\u0445\u0443\u0434\u0448\u0438\u0439 \u043a\u0435\u0439\u0441 bounded work \u043f\u0440\u0438 burst \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>Criterion \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0414\u043b\u044f p99 production event path \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434. \u0414\u0435\u043b\u0438\u0442\u044c batch time \u043d\u0430 10 000 \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 p99 \u2014 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0433\u043b\u0443\u043f\u043e\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432\u0438\u0436\u0443.<\/p>\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0440\u0435\u043b\u0438\u0437\u0430 regression gate \u0441\u043e\u043e\u0431\u0449\u0438\u043b:<\/p>\n<pre><code>indicator_only\/dom_scalper: +123%indicator_only\/heavy_test: +116%vm_tick\/macd_cross: upper CI +29%<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 indicator kernels \u043c\u0435\u0436\u0434\u0443 baseline \u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u043c \u043d\u0435 \u0431\u044b\u043b\u043e. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 baseline \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u00abGitHub Actions \u0442\u0443\u043f\u0438\u0442\u00bb. \u041e\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u0440 \u0438 \u0438\u0449\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0444\u0430\u043a\u0442\u043e\u0440.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d \u0448\u0435\u043b \u0442\u0430\u043a:<\/p>\n<pre><code>QFL suite -&gt; indicators suite -&gt; engine suite<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 CPU. \u041a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 engine microbench \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u0438 thermal state runner \u0443\u0436\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0438\u0441\u044c \u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f baseline. \u0421\u0430\u043c\u044b\u0435 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 <code>indicator_only<\/code> cases, \u0433\u0434\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 10k ticks, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0434\u043e +120%.<\/p>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440 engine suite \u0432 \u0447\u0438\u0441\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0430\u043b:<\/p>\n<pre><code>dom_scalper:          \u043e\u043a\u043e\u043b\u043e -54%heavy_test:           \u043e\u043a\u043e\u043b\u043e -53%test_data_passing:    \u043e\u043a\u043e\u043b\u043e -21%ema_cross:            \u043e\u043a\u043e\u043b\u043e -4%<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0442 \u0436\u0435 \u0431\u0438\u043d\u0430\u0440\u044c. \u041f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434. \u0412\u043e\u0442 \u0432\u0430\u043c \u0438 \u0446\u0435\u043d\u0430 \u00ab\u043e\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u044b\u00bb \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430: \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435, \u0438 \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e, \u043d\u0435 \u043c\u0435\u043d\u044f\u044f \u043d\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438.<\/p>\n<p>\u0427\u0442\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>Latency-sensitive engine suite \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p>QFL \u0438 indicators \u0438\u0434\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 suite \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 timestamp marker.<\/p>\n<\/li>\n<li>\n<p>Gate \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e estimates, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 marker.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e suite, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 stale result \u043d\u0435 \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u044f\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u0430\u043b\u043e. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043d\u0434:<\/p>\n<ul>\n<li>\n<p>\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 governor (<code>performance<\/code>);<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u044f\u0434\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0442\u043e\u043a benchmark \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d \u0437\u0430 \u044f\u0434\u0440\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>IRQ\/RPS \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u044b \u0441 \u044d\u0442\u043e\u0433\u043e \u044f\u0434\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b compiler\/toolchain flags;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u0434\u0435\u043b\u044c CPU, microcode \u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0434\u0440\u0430 \u041e\u0421 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0440\u044f\u0434\u043e\u043c \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0435\u0432 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 thermal drift<\/h4>\n<p>Warm-up Criterion \u043d\u0443\u0436\u0435\u043d, \u0447\u0442\u043e\u0431\u044b:<\/p>\n<ul>\n<li>\n<p>\u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c lazy initialization;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0433\u0440\u0435\u0442\u044c \u043a\u044d\u0448\u0438 \u043a\u043e\u0434\u0430 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c branch predictor;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0432\u0435\u0441\u0442\u0438 JIT \u0438\u0437 \u0443\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0435\u0441\u043b\u0438 \u043e\u043d \u0435\u0441\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e Rust AOT \u0431\u0438\u043d\u0430\u0440\u044c \u043d\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u00ab\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c\u00bb \u043f\u043e\u0441\u043b\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438. \u0414\u043b\u0438\u043d\u043d\u044b\u0439 suite \u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443, package power, turbo residency \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0430 \u043e\u0431\u0449\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. \u042d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u043a\u0430\u043b\u043e\u0439 \u0432 \u043c\u0438\u043d\u0443\u0442\u044b.<\/p>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0435\u043d\u0447\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438. \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c baseline. \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c, \u043d\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u043a \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044e \u0442\u0435\u043f\u043b\u0430. \u0420\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u044b\u0435 jobs \u0434\u0430\u044e\u0442 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0441\u0442\u044b\u0439 \u0441\u0442\u0430\u0440\u0442, \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0435 VM \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u0430. \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044f\u0432\u043d\u043e \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"14\" id=\"14\"><\/a><\/p>\n<h3>14. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 regression gate \u0431\u0435\u0437 \u0433\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430 upper bound<\/h3>\n<p>\u0412 Criterion change estimate \u0435\u0441\u0442\u044c confidence interval:<\/p>\n<pre><code class=\"json\">{  \"mean\": {    \"confidence_interval\": {      \"lower_bound\": 0.05,      \"point_estimate\": 0.09,      \"upper_bound\": 0.20    }  }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0440\u043e\u0433 \u2014 10%.<\/p>\n<p><code>point_estimate<\/code> \u2014 \u043e\u0446\u0435\u043d\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e, \u0430 \u043d\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u0438\u0441\u0442\u0438\u043d\u0430. Confidence interval \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0446\u0435\u043d\u043e\u043a, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0441 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u043c\u0438 samples \u043f\u0440\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 bootstrap. \u041e\u043d \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u00ab\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c 95%, \u0447\u0442\u043e \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u0435\u0436\u0438\u0442 \u0437\u0434\u0435\u0441\u044c\u00bb \u0432 \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438. \u041d\u043e \u0434\u043b\u044f regression gate \u0435\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 gate \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b:<\/p>\n<pre><code>upper_bound &gt; 10% =&gt; fail<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435 \u043f\u0430\u0434\u0430\u043b, \u0445\u043e\u0442\u044f:<\/p>\n<ul>\n<li>\n<p>point estimate \u043d\u0438\u0436\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>lower bound \u0432\u0441\u0435\u0433\u043e 5%;<\/p>\n<\/li>\n<li>\n<p>\u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 threshold;<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c \u00ab\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 10%\u00bb \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0437\u0432\u0443\u0447\u0438\u0442 \u00abfail, \u043a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u044f \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 10%\u00bb, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<pre><code>lower_bound &gt; 10% =&gt; fail<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u0432\u0435\u0441\u044c 95% CI \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u043e\u043c \u0431\u044e\u0434\u0436\u0435\u0442\u0430.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>point estimate &gt; threshold \u0438 <code>p &lt; \u03b1<\/code>;<\/p>\n<\/li>\n<li>\n<p>lower bound &gt; 0 \u0438 point estimate &gt; threshold;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u044b \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0430\u043c benchmarks.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0440\u043e\u0433 \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u043d \u0431\u044b\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c. \u0414\u043b\u044f 50-ns kernel \u0440\u0430\u0437\u0431\u0440\u043e\u0441 runner \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c, \u0430 +10% \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0432 E2E budget. \u0414\u043b\u044f 2-ms risk\/reconciliation path +5% \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 budget \u043a \u043a\u043b\u0430\u0441\u0441\u0443:<\/p>\n<pre><code>kernel:        relative threshold + minimum absolute deltaVM tick:       cycles\/event and relative thresholdfull pipeline: p95\/p99 latency budgetthroughput:    events\/sec floor<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f relative \u0438 absolute guard \u043d\u0435 \u0434\u0430\u0435\u0442 \u043f\u0430\u0434\u0430\u0442\u044c \u0438\u0437-\u0437\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441 20 \u043d\u0430 23 ns, \u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441 200 \u043d\u0430 230 us.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u0430 \u0442\u0435\u0441\u0442\u043e\u043c. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0443:<\/p>\n<pre><code>CI [5%, 20%]  -&gt; passCI [11%, 20%] -&gt; fail<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u0430\u043c gate \u0442\u043e\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f production code. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u0434\u043d\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 CI \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043a\u0440\u0435\u0441\u0442\u0438\u043a\u043e\u0432\u2026<\/p>\n<hr\/>\n<p><a class=\"anchor\" name=\"15\" id=\"15\"><\/a><\/p>\n<h3>15. \u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u0435\u0440\u0435\u0434 production<\/h3>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 README \u00ab\u0443 \u043d\u0430\u0441 \u0441\u0443\u043f\u0435\u0440 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f SIMD\u00bb, \u044f \u0431\u044b \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u043f\u0440\u043e\u0439\u0442\u0438 \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0438, \u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u0432\u0430\u0441 \u043f\u043e\u043a\u0430 \u043d\u0435 SIMD-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f, \u0430 \u0434\u0435\u043c\u043a\u0430 intrinsics.<\/p>\n<h4>\u0410\u043b\u0433\u043e<\/h4>\n<ul>\n<li>\n<p>\u041d\u0435\u0442 \u043b\u0438 <code>O(1)<\/code> update \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430?<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e reductions \u0432 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438?<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0434\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 period?<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043b\u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 kernel allocation \u0438\u043b\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e?<\/p>\n<\/li>\n<\/ul>\n<h4>Layout<\/h4>\n<ul>\n<li>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b \u0438\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 slices?<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a wrapped ring buffer?<\/p>\n<\/li>\n<li>\n<p>SoA\/AoS \u0432\u044b\u0431\u0440\u0430\u043d \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u0430?<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 gather \u0442\u0430\u043c, \u0433\u0434\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 loads?<\/p>\n<\/li>\n<\/ul>\n<h4>ISA<\/h4>\n<ul>\n<li>\n<p>AVX, AVX2 \u0438 FMA \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e?<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 CPU \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 fallback, \u0430 \u043d\u0435 <code>SIGILL<\/code>?<\/p>\n<\/li>\n<li>\n<p>Runtime detection \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442?<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433?<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u043c\u0435\u0440\u0435\u043d AVX frequency effect \u043d\u0430 \u0432\u0435\u0441\u044c pipeline?<\/p>\n<\/li>\n<\/ul>\n<h4>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c<\/h4>\n<ul>\n<li>\n<p>Scalar backend \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u0430\u043b\u043e\u043d\u043e\u043c?<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u044b \u0432\u0441\u0435 \u0434\u043b\u0438\u043d\u044b tail \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 wrap?<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 NaN\/Inf?<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d tolerance \u0438\u043b\u0438 bitwise contract?<\/p>\n<\/li>\n<li>\n<p>FMA\/reassociation \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u044b \u0432 replay determinism?<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u0434\u0443\u0441\u043b\u043e\u0432\u0438\u044f <code>unsafe<\/code> \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0434\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 boundary?<\/p>\n<\/li>\n<\/ul>\n<h4>Hot path<\/h4>\n<ul>\n<li>\n<p>\u041d\u0435\u0442 \u0430\u043b\u043b\u043e\u043a\u0438, \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043b\u043e\u0433\u043e\u0432 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 <code>HashMap<\/code> \u043d\u0430 \u0442\u0438\u043a?<\/p>\n<\/li>\n<li>\n<p>Hot\/cold state \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b?<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043d\u0430\u043b\u044b bounded \u0438 non-blocking?<\/p>\n<\/li>\n<li>\n<p>Drain \u0442\u043e\u0436\u0435 bounded?<\/p>\n<\/li>\n<li>\n<p>\u0410\u0442\u043e\u043c\u0438\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 ordering?<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0442 false sharing \u043d\u0430 multi-writer counters?<\/p>\n<\/li>\n<\/ul>\n<h4>\u0418\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u044f<\/h4>\n<ul>\n<li>\n<p>\u0415\u0441\u0442\u044c kernel, VM \u0438 full-pipeline benchmarks?<\/p>\n<\/li>\n<li>\n<p>Throughput \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439?<\/p>\n<\/li>\n<li>\n<p>Setup \u043d\u0435 \u043f\u043e\u043f\u0430\u043b \u0432 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e?<\/p>\n<\/li>\n<li>\n<p>CPU frequency\/thermal state \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f?<\/p>\n<\/li>\n<li>\n<p>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438 toolchain?<\/p>\n<\/li>\n<li>\n<p>Gate \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443 CI?<\/p>\n<\/li>\n<li>\n<p>Baseline \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438?<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>\u0412\u044b\u0432\u043e\u0434<\/h3>\n<p>SIMD-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0441 <code>_mm256_loadu_pd<\/code>. \u041e\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u043f\u0440\u0438\u0434\u0443\u0442 \u0432 L1;<\/p>\n<\/li>\n<li>\n<p>\u0432 \u043a\u0430\u043a\u043e\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u044b;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0441 tail;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432\u044b \u043e\u0431\u0435\u0449\u0430\u0435\u0442\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0434\u043e\u043a\u0430\u0436\u0435\u0442\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432\u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0442\u043e\u0433\u043e \u043c\u0438\u043a\u0440\u043e\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 Quince \u0448\u0435\u0441\u0442\u044c AVX2\/FMA kernels \u0441\u0442\u0430\u043b\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 zero-copy <code>RingVec::as_chunks<\/code>, \u043f\u0440\u0435\u0434\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0442\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f hot\/cold state VM, bounded non-blocking \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 benchmarks. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0447\u0438\u043d\u0438\u0442\u044c \u0443\u0436\u0435 \u0441\u0430\u043c\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438\u0437\u043c\u0435\u0440\u0435\u043d\u0438\u0439: gate \u0441 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u043e\u0439 \u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f gate \u2014 \u043e\u043d \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u0432\u0440\u0435\u0442 \u0438 \u0435\u0449\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a \u0437\u0434\u0435\u0441\u044c \u2014 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0435\u043b\u0435\u043d\u0443\u044e \u0446\u0438\u0444\u0440\u0443 \u0438 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043f\u043e\u0431\u0435\u0434\u0443. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0443 \u043f\u043b\u0435\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 PR, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e intrinsics \u0438 \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 uops, \u0436\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430 \u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 pipeline \u043f\u043e\u0441\u043b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>perf<\/code>, \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u0438 confidence intervals. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u2014 \u043e\u043d\u043e \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435. \u0415\u0441\u043b\u0438 \u0438\u0441\u0447\u0435\u0437\u043b\u043e, \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u043d\u0435 \u00ab\u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e\u00bb, \u0430 \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u043b\u043e\u0436\u044c \u0432 \u043f\u0440\u043e\u0434.<\/p>\n<p>\u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0432 changelog \u043f\u0440\u043e SIMD.<\/p>\n<hr\/>\n<h3>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f<\/h3>\n<pre><code class=\"bash\"># Scalar\/reference buildcargo bench -p quince-indicators --no-default-features --bench bench -- --noplot# Native CPU build; \u0431\u0438\u043d\u0430\u0440\u044c \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 CPURUSTFLAGS='-C target-cpu=native' \\  cargo bench -p quince-indicators --bench bench -- --noplot# VM \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 engine pipelinecargo bench -p quince-qfl --bench bench -- --noplotcargo bench -p quince-engine --bench bench -- --noplot# \u0410\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c benchmark binaryperf stat -r 10 \\  -e cycles,instructions,branches,branch-misses,cache-references,cache-misses \\  target\/release\/deps\/bench-&lt;hash&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0435\u043a\u0442<\/h3>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442: <a href=\"https:\/\/github.com\/0xitsss\/quince\" rel=\"noopener noreferrer nofollow\">Quince<\/a><\/p>\n<p>\u0421\u0430\u0439\u0442: <a href=\"https:\/\/notafraud.xyz\" rel=\"noopener noreferrer nofollow\">Not A Fraud<\/a><\/p>\n<h3>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0430<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0446\u0435\u043d\u0438\u0448\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u044b \u0438 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0430\u0440\u0438\u0442\u044c \u043a\u043e\u0444\u0435:<\/p>\n<p>BTC: <code>bc1qnvn2fwkptfw5n7q033gkd38atlntp08s5d2vuh<\/code><\/p>\n<p>TRC20: <code>TVNPzo91J7cPv2tZnvHfKyH8HMGzwXQg44<\/code><\/p>\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\/articles\/1064622\/\">https:\/\/habr.com\/ru\/articles\/1064622\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0438\u043b\u0438 \u043f\u043e\u0447\u0435\u043c\u0443 _mm256_* \u0431\u0435\u0437 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u044d\u0448\u0430 \u0438 uops \u2014 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0432\u0440\u0430\u0442\u044c \u0441\u0435\u0431\u0435TL;DR\u042f \u043f\u0438\u0448\u0443 Quince \u2014 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Rust. \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439 QFL, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u0430\u044f VM, \u0440\u0438\u0441\u043a-\u043a\u043e\u043d\u0442\u0443\u0440, replay \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443. \u042d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043f\u0438\u0442\u043e\u043d-\u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 REST \u0438 \u0448\u0435\u0434\u0435\u0432\u0440\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u043c\u00bb. \u0414\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0441\u0434\u0435\u043b\u043e\u043a \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 DOM, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0438\u0441\u043a \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0440\u0434\u0435\u0440 \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 event path.\u0412 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 scalar loop \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u044b\u0442\u044c \u00ab\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u00bb: WMA, LSMA, CCI, Bollinger Bands \u0438 Z-Score \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 rolling window, \u0430 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b \u043a\u0440\u0430\u0441\u0438\u0432\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u0432 hot path, \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a \u043a\u044d\u0448\u0443.\u042f \u0432\u044b\u043d\u0435\u0441 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0448\u0435\u0441\u0442\u044c AVX2\/FMA-\u044f\u0434\u0435\u0440: sum, weighted_sum, sum_and_sum_xy, sum_abs_diff, min_max, sum_sq_diff. \u041d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c + \u043d\u0430 _mm256_add_pd. \u041c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c:\u043e\u0442\u0434\u0430\u0442\u044c SIMD \u0434\u0432\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0445 slice \u0431\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430;\u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 wrap-around;\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c hot\/cold state VM, \u0447\u0442\u043e\u0431\u044b SIMD \u043d\u0435 \u0443\u0441\u043a\u043e\u0440\u044f\u043b \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u043c\u0430\u0445\u0430\u0445 L1;\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c scalar tail \u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b;\u043d\u0435 \u043f\u0435\u0440\u0435\u043f\u0443\u0442\u0430\u0442\u044c AVX, AVX2 \u0438 FMA;\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c Criterion gate, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0438\u0437-\u0437\u0430 \u043d\u0430\u0433\u0440\u0435\u0432\u0430 \u00ab\u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0435\u0439\u00bb;\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435 \u0441\u0440\u0435\u0434\u043d\u044e\u044e, \u0430 \u0434\u043e\u0432\u0435\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438 \u0432\u0435\u0441\u044c pipeline \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\u042d\u0442\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a intrinsics \u0438 \u043d\u0435 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 unsafe. \u042f \u0431\u0443\u0434\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d\u0430 \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 pipeline: \u043e\u0442 \u0441\u0442\u0440\u043e\u043a \u043a\u044d\u0448\u0430 \u0438 uops \u0434\u043e \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u0432 \u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 Criterion. \u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d \u043d\u0430 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0443\u043c\u0435\u044e\u0442 \u0447\u0438\u0442\u0430\u0442\u044c Rust \u0438 \u0433\u043e\u0442\u043e\u0432\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f, \u0430 \u0441\u0443\u043c\u0430\u0441\u0448\u0435\u0434\u0448\u0438\u0439 \u043a\u0430\u0440\u0433\u043e-\u043a\u0443\u043b\u044c\u0442 \u0441 _mm256_* \u0438 \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u044b\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c.\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Quince \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f latency budget\u0418\u043b\u043b\u044e\u0437\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e Rust\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u041a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440: \u0434\u0432\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043e\u0434\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043eSSE, AVX, AVX2 \u0438 FMA \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b\u041f\u0435\u0440\u0432\u043e\u0435 \u044f\u0434\u0440\u043e: sum \u0431\u0435\u0437 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430WMA: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0441\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 YMMLSMA: \u0434\u0432\u0435 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u0438 \u0437\u0430 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434MAD, variance \u0438 min\/max: \u0448\u0435\u0441\u0442\u044c \u044f\u0434\u0435\u0440 \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u043e\u043e\u043f\u0430\u0440\u043a\u0430 \u0446\u0438\u043a\u043b\u043e\u0432Tail, alignment \u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430Compile-time dispatch \u043f\u0440\u043e\u0442\u0438\u0432 runtime detectionSIMD \u043d\u0435 \u0441\u043f\u0430\u0441\u0435\u0442 VM, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 L1Non-blocking hot path: \u043a\u0430\u043d\u0430\u043b\u044b, \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f \u0438 memory ordering\u041a\u0430\u043a Criterion \u0441\u043e\u0432\u0440\u0430\u043b \u043c\u043d\u0435 \u043d\u0430 120%\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 regression gate \u0431\u0435\u0437 \u0433\u0430\u0434\u0430\u043d\u0438\u044f \u043d\u0430 upper bound\u0427\u0435\u043a-\u043b\u0438\u0441\u0442 \u043f\u0435\u0440\u0435\u0434 production0. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Quince \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0435\u0442\u0441\u044f latency budgetQuince \u2014 \u0442\u043e\u0440\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u0434\u0432\u0438\u0436\u043a\u0430, \u0430 \u043d\u0430 QFL \u2014 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c, \u043e\u0442\u0434\u0430\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u043c \u043d\u0430 Lua. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u044e \u0438 11 \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432\u043e\u0439 VM.\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:@exchange binance@network testnet@using signed_volumeon trade(t) {    feature pressure = quince.get(&#171;signed_volume&#187;)    if pressure &lt; -0.6 {        quince.order(1, 0.001, 0)    }}QFL \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0440\u0430\u0434\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430, \u044f\u0437\u044b\u043a\u043e\u0432 \u0438 \u0431\u0435\u0437 \u043c\u0435\u043d\u044f \u043d\u0430\u043f\u043b\u043e\u0434\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0442\u0438\u043f\u044b, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f instruction budget, \u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0441\u043b\u043e\u0442\u0430\u043c. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u043d\u0435 \u0442\u0430\u0449\u0430\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0438\u043a.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u043f\u0443\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:exchange WebSocket    \u2502    \u251c\u2500 strict protocol parser    \u251c\u2500 sequence \/ gap \/ staleness validation    \u25bcnormalized Trade | Depth | Fill    \u2502    \u251c\u2500 native indicator bank    \u251c\u2500 pre-resolved feature slots    \u25bcQFL register VM    \u2502    \u251c\u2500 risk controls    \u251c\u2500 shadow\/live deployment gate    \u251c\u2500 order journal    \u25bcexchange adapter\u0420\u044f\u0434\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 replay \u043f\u043e \u0430\u0440\u0445\u0438\u0432\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c, \u0441\u0432\u0435\u0440\u043a\u0430 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u044f\u0432\u043e\u043a, \u0443\u0447\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0439 \u0438 slippage, bounded control plane \u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u043d\u0430 Axum. \u041d\u043e \u044d\u0442\u0438 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0430\u0432\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c market-data thread. \u00ab\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u00bb \u2014 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430, \u0432\u0435\u0434\u044c \u043e\u0442\u0441\u044e\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0441\u043a\u0430\u0447\u043a\u0438 latency.\u0412\u043e\u0442 \u0442\u0443\u0442 \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f latency \u0431\u044e\u0434\u0436\u0435\u0442. \u0415\u0433\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u043e\u0439 \u0446\u0438\u0444\u0440\u043e\u0439 \u00ab\u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 VM instruction\u00bb. \u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e market event \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0443\u043c\u043c\u0430:T_event =    T_parse  + T_integrity  + T_indicators  + T_feature_write  + T_vm  + T_risk  + T_transport  + T_telemetry\u0410 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043d\u0430\u0441 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0435:SLO = { throughput, p50, p95, p99, max bounded work }\u0415\u0441\u043b\u0438 SIMD \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b T_indicators \u043d\u0430 60%, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b runtime dispatch, \u0440\u0430\u0437\u0434\u0443\u043b \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043f\u043e\u0434\u043d\u044f\u043b p99 \u0432\u0441\u0435\u0433\u043e pipeline, \u0442\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043d\u0435\u0442. \u0415\u0441\u0442\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u0430\u043c\u043e\u043e\u0431\u043c\u0430\u043d. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u0431\u0435\u0434\u043e\u0439 \u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0440\u0430\u0442\u044c \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u043d\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0445, \u0430 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0438 \u043a\u043e\u0434\u043e\u043c \u0432 \u0440\u0443\u043a\u0430\u0445.\u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u043c\u043a\u0430 \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0430 \u043d\u0435 intrinsic \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.1. \u0418\u043b\u043b\u044e\u0437\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e RustRust \u043b\u0435\u0433\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0432 \u043d\u0435\u0439 \u043d\u0435\u0442 GC, \u0430 \u0440\u0435\u043b\u0438\u0437 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441 &#8212;release. \u041d\u0435\u0442, \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u0441\u0442\u0440\u0430\u044f. \u041e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043b\u0430\u0442\u0438\u0442 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 runtime-\u0438\u0437\u0434\u0435\u0440\u0436\u0435\u043a. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u2014 \u043f\u0440\u043e\u043c\u0430\u0445\u0438 \u043a\u044d\u0448\u0430, \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439, \u0433\u043e\u043b\u043e\u0434\u0430\u043d\u0438\u0435 frontend, \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443 \u0438 coherence traffic \u2014 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e. \u0415\u0441\u043b\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u2014 \u044f\u0437\u044b\u043a \u0438 \u0444\u043b\u0430\u0433 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u0438\u044f\u2026\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043c\u0435\u0435\u0442 \u0432 \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430. \u0415\u0441\u043b\u0438 alias analysis \u0434\u043e\u043a\u0430\u0437\u0430\u043b \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0415\u0441\u043b\u0438 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430 \u043f\u0440\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u0415\u0441\u043b\u0438 \u0446\u0438\u043a\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442. \u0415\u0441\u043b\u0438 LLVM \u043d\u0435 \u0441\u043f\u043e\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043e bounds checks, \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, wrap-around \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u043a\u043d\u0430. \u041a\u043e\u0440\u043e\u0447\u0435, \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0430\u043b\u0438 \u0435\u043c\u0443 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0441\u0442\u043d\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c, \u0430 \u043d\u0435 \u043d\u0430\u0434\u0435\u0435\u0442\u0435\u0441\u044c \u043d\u0430 \u043c\u0430\u0433\u0438\u044e \u0431\u0443\u043a\u0432 LLVM.\u0412 \u0442\u043e\u0440\u0433\u043e\u0432\u043e\u043c \u0434\u0432\u0438\u0436\u043a\u0435 hot path \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0445\u0443\u0436\u0435 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0433\u043e sum(&amp;[f64]):WebSocket frame    -&gt; strict parse    -&gt; normalized market event    -&gt; rolling indicators    -&gt; feature slots    -&gt; bytecode VM    -&gt; risk checks    -&gt; order intent    -&gt; bounded transport\u041c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043e\u0434\u043d\u0443 \u0440\u0435\u0434\u0443\u043a\u0446\u0438\u044e \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 \u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043d\u0430 \u0430\u043b\u043b\u043e\u043a\u0430\u0445, \u043f\u043e\u0438\u0441\u043a \u0432 HashMap, \u0434\u043e\u0441\u0442\u0443\u043f \u043a cold state \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u044d\u0448\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0438.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0442\u0430\u043a\u043e\u0439:SIMD \u2014 \u043d\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430. SIMD \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0443\u0436\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.\u0414\u043e intrinsics \u044f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430:\u041d\u0430 \u0442\u0438\u043a \u043d\u0435\u0442 \u0430\u043b\u043b\u043e\u043a\u0438.Rolling window \u043d\u0435 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043d\u0435 \u043b\u0438\u043d\u0435\u0430\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f.\u0421\u043b\u043e\u0442 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0434\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 hot path.\u0421\u043a\u0430\u043b\u044f\u0440\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u0430\u043b\u043e\u043d\u043e\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0444\u043e\u043b\u0431\u0435\u043a\u043e\u043c.\u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043c\u044b\u0441\u043b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c core::arch::x86_64.2. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043f\u043e\u0442\u043e\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0421\u0430\u043c\u0430\u044f \u0432\u044b\u0433\u043e\u0434\u043d\u0430\u044f SIMD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u2014 \u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c.SMA \u0438 VWMA \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u0430\u0436\u0434\u044b\u0439 tick \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0448\u0438\u0440\u0438\u043d\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430. \u0414\u043b\u044f SMA \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e running sum:if let Some(evicted) = buffer.push(value) {    sum -= evicted;}sum += value;\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u2014 O(1). \u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c O(N) \u043f\u0435\u0440\u0435\u0441\u0447\u0435\u0442 \u0437\u0434\u0435\u0441\u044c \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e \u0431\u044b \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0441\u044f\u043a \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041f\u043e \u0441\u0443\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u043e\u0440\u043e\u0433\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c.\u041d\u043e \u0435\u0441\u0442\u044c \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0433\u0434\u0435 \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u043a\u043b\u0430\u0434 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445:WMA: \u0432\u0435\u0441 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438;LSMA: \u043d\u0443\u0436\u0435\u043d \u03a3y \u0438 \u03a3xy;CCI: mean absolute deviation \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e;Bollinger\/Z-Score: \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430;Stochastic: \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u043d\u0430 \u043e\u043a\u043d\u0435.\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 O(1) \u0447\u0435\u0440\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u0439\u0442 \u0438\u043b\u0438 monotonic deque. \u0418 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442. \u041d\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0435\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439:\u043d\u0430\u043a\u043e\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u0434\u0440\u0435\u0439\u0444\u0443\u044e\u0442 \u0438\u0437-\u0437\u0430 \u043f\u043e\u0442\u0435\u0440\u0438 \u0437\u043d\u0430\u0447\u0430\u0449\u0438\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432;\u043e\u043a\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 period;\u043e\u0434\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b;\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 state \u043f\u043e\u0441\u043b\u0435 hot reload \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c;\u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 state machine \u043f\u043e\u0432\u044b\u0448\u0430\u0435\u0442 \u0446\u0435\u043d\u0443 \u0430\u0443\u0434\u0438\u0442\u0430.\u0412 Quince \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043e\u0431\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430: running aggregates \u0442\u0430\u043c, \u0433\u0434\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u044b, monotonic deque \u0434\u043b\u044f VM rolling windows \u0438 SIMD-reduction \u0442\u0430\u043c, \u0433\u0434\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u043c \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c.\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u043f\u0443\u0442\u044c \u043a O(1). \u042d\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044e.3. \u041a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440: \u0434\u0432\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u043e\u0434\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u043d\u043e\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 ring buffer \u043f\u043e\u0441\u043b\u0435 wrap-around \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:physical: [ newest &#8230; ][ &#8230; oldest ]                    ^ headlogical:  oldest &#8230;&#8230;&#8230;&#8230;&#8230;.. newest\u0422\u0443\u043f\u043e\u0439 \u043f\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u0434 SIMD:let linear: Vec&lt;f64&gt; = ring.iter().collect();simd_kernel(&amp;linear);\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e!!! \u041c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0430\u043b\u043b\u043e\u043a\u0443, \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 N * 8 \u0431\u0430\u0439\u0442 \u0438 \u043b\u0438\u0448\u043d\u0438\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0440\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043d\u0430 \u0431\u0443\u043c\u0430\u0433\u0435 \u0438 \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u0440\u043e\u0434 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435. \u0411\u0443\u043c\u0430\u0433\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443; \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0435\u043c\u0438\u044e \u043d\u0435 \u0434\u0430\u0441\u0442.\u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 API \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0432\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:pub fn as_chunks(&amp;self) -&gt; (&amp;[f64], &amp;[f64]) {    if self.len == 0 {        (&amp;[], &amp;[])    } else if self.len &lt; self.cap {        (&amp;self.data[..self.len], &amp;[])    } else {        (&amp;self.data[self.head..self.cap], &amp;self.data[..self.head])    }}\u0422\u0435\u043f\u0435\u0440\u044c kernel \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 (a, b) \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 a, \u043f\u043e\u0442\u043e\u043c b. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u043d\u0435\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0435\u043c\u043f-\u0431\u0443\u0444\u0435\u0440\u043e\u0432. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 slices.\u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f WMA\/LSMA. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c slice \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432\u0435\u0441 \u0438\u043b\u0438 x \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043d\u043e\u043b\u044c, \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 SIMD-\u043a\u043e\u0434 \u043d\u0430\u0447\u043d\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443:\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e: a0*1 + a1*2 + &#8230; + b0*(len(a)+1)\u043e\u0448\u0438\u0431\u043a\u0430:    a0*1 + a1*2 + &#8230; + b0*1\u0422\u043e \u0435\u0441\u0442\u044c layout \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0434\u0435\u0441\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430.\u041f\u043e\u0447\u0435\u043c\u0443 \u0434\u0432\u0430 slice \u043e\u0431\u044b\u0447\u043d\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0445\u0438\u0442\u0440\u0435\u0439\u0448\u0438\u0439 gather?_mm256_i64gather_pd \u0438\u043c\u0435\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0445\u0443\u0434\u0448\u0443\u044e throughput\/latency-\u043c\u043e\u0434\u0435\u043b\u044c, \u0447\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 load;\u0434\u0432\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0435\u0442\u0447\u0435\u0440;_mm256_loadu_pd \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 x86 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 unaligned address, \u043f\u043e\u043a\u0430 load \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0443\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u0443&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-489095","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/489095","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=489095"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/489095\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=489095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=489095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=489095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}