{"id":443255,"date":"2024-12-26T06:50:59","date_gmt":"2024-12-26T06:50:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=443255"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=443255","title":{"rendered":"<span>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 CPU Cannon Lake \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 10-15 \u0442\u0430\u043a\u0442\u043e\u0432, \u0430 \u043d\u0430 Zen4 \u2014 9-14 \u0442\u0430\u043a\u0442\u043e\u0432. \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 CPU \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 3-4 \u0442\u0430\u043a\u0442\u0430.<\/p>\n<p>\u041d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 ISA SIMD (SSE, AVX, AVX-512, ARM Neon, ARM SVE) \u043d\u0435\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043e\u043d\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <a href=\"http:\/\/0x80.pl\/notesen\/2024-11-09-riscv-vector-extension.html\" rel=\"noopener noreferrer nofollow\">RISC-V Vector Extension<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 ISA \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 SIMD-\u0434\u0435\u043b\u0435\u043d\u0438\u044f 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<ol>\n<li>\n<p>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0438\u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 C++. \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u0439 \u043e \u0434\u0435\u043b\u0438\u043c\u044b\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/en.wikipedia.org\/wiki\/Division_algorithm#Division_by_a_constant\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443<\/a>.<\/p>\n<pre><code class=\"cpp\">void scalar_div_u8(const uint8_t* a, const uint8_t* b, uint8_t* out, size_t n) {     for (size_t i=0; i &lt; n; i++) {         out[i] = a[i] \/ b[i];     } }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GCC 14.1.0 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 (\u0432\u044b\u0440\u0435\u0437\u0430\u043d \u0432\u0435\u0441\u044c \u043c\u0443\u0441\u043e\u0440, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430):<\/p>\n<pre><code class=\"cpp\">2b40:       48 85 c9                test   %rcx,%rcx 2b43:       74 30                   je     2b75 &lt;_Z13scalar_div_u8PKhS0_Phm+0x35&gt; 2b45:       45 31 c0                xor    %r8d,%r8d 2b60:       42 0f b6 04 07          movzbl (%rdi,%r8,1),%eax 2b65:       42 f6 34 06             divb   (%rsi,%r8,1) 2b69:       42 88 04 02             mov    %al,(%rdx,%r8,1) 2b6d:       49 ff c0                inc    %r8 2b70:       4c 39 c1                cmp    %r8,%rcx 2b73:       75 eb                   jne    2b60 &lt;_Z13scalar_div_u8PKhS0_Phm+0x20&gt; 2b75:       c3                      ret<\/code><\/pre>\n<h2>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439<\/h2>\n<p>8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 integer,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435 integer \u0432 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 integer,<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e integer \u0432 8-\u0431\u0438\u0442\u043d\u044b\u0439 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c<\/h3>\n<p>\u0412\u043e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b SSE. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 integer \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0441\u0435\u0447\u044c \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b (\u0441\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0435 \u043d\u0430 1).<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u043c\u044b\u0445.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_a; memcpy(&amp;buf_a, &amp;a[i], 4);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0418 \u0447\u0435\u0442\u044b\u0440\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_b; memcpy(&amp;buf_b, &amp;b[i], 4);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0438\u0445 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 SSE \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0439.<\/p>\n<pre><code class=\"cpp\">const __m128i a_u8  = _mm_cvtsi32_si128(buf_a); const __m128i a_u32 = _mm_cvtepu8_epi32(a_u8);  const __m128i b_u8  = _mm_cvtsi32_si128(buf_b); const __m128i b_u32 = _mm_cvtepu8_epi32(b_u8);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f 32-\u0431\u0438\u0442\u043d\u044b\u0445 integer \u0432\u043e float.<\/p>\n<pre><code class=\"cpp\">const __m128  a_f32 = _mm_cvtepi32_ps(a_u32); const __m128  b_f32 = _mm_cvtepi32_ps(b_u32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u0435\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">const __m128  c_f32   = _mm_div_ps(a_f32, b_f32); const __m128  c_f32_2 = _mm_round_ps(c_f32, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c float \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 integer.<\/p>\n<pre><code class=\"cpp\">const __m128i c_i32 = _mm_cvtps_epi32(c_f32_2);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c 32-\u0431\u0438\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0432 8-\u0431\u0438\u0442\u043d\u044b\u0439: \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043b\u0430\u0434\u0448\u0438\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<pre><code class=\"cpp\">const __m128i c_u8  = _mm_shuffle_epi8(c_i32, _mm_setr_epi8(     0, 4, 8, 12,     -1, -1, -1, -1,     -1, -1, -1, -1,     -1, -1, -1, -1 ));  const uint32_t buf = _mm_cvtsi128_si32(c_u8); memcpy(&amp;out[i], &amp;buf, 4);<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f ROUNDPS \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0430 CPU Intel. \u041d\u0430 IceLake \u2014 8 \u0442\u0430\u043a\u0442\u043e\u0432, \u0430 \u043d\u0430 Zen4 \u2014 \u0432\u0441\u0435\u0433\u043e 3 \u0442\u0430\u043a\u0442\u0430.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439, \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u0435 \u043d\u0430 256 (\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 8 \u0431\u0438\u0442\u043e\u0432), \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0434\u0432\u0438\u043d\u0443\u0432 \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 8 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0421\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0438 \u0442\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0435. \u0421\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 8 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f SSE-\u043a\u043e\u0434\u0430 \u2014 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0443 \u0431\u0430\u0439\u0442\u043e\u0432 (byte shuffle), \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0434\u0432\u0438\u0433 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 AVX2-\u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 128-\u0431\u0438\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u043a\u0442\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0432\u0432\u043e\u0434 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u042d\u0442\u0430 SSE-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430:<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0435\u043b\u0438\u043c\u044b\u0445.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_a; memcpy(&amp;buf_a, &amp;a[i], 4); const __m128i a_u8  = _mm_cvtsi32_si128(buf_a);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0435\u043b\u0438\u043c\u043e\u0435 &lt;&lt; 8\u00a0\u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">const __m128i a_u32 = _mm_shuffle_epi8(a_u8, _mm_setr_epi8(     -1, 0, -1, -1,     -1, 1, -1, -1,     -1, 2, -1, -1,     -1, 3, -1, -1 ));<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0438\u0445 \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_b; memcpy(&amp;buf_b, &amp;b[i], 4); const __m128i b_u8  = _mm_cvtsi32_si128(buf_b); const __m128i b_u32 = _mm_cvtepu8_epi32(b_u8);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f \u0432\u0441\u0435\u0445 32-\u0431\u0438\u0442\u043d\u044b\u0445 integer \u0432\u043e float.<\/p>\n<pre><code class=\"cpp\">const __m128  a_f32 = _mm_cvtepi32_ps(a_u32); const __m128  b_f32 = _mm_cvtepi32_ps(b_u32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">const __m128  c_f32   = _mm_div_ps(a_f32, b_f32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 integer.<\/p>\n<pre><code class=\"cpp\">const __m128i c_i32 = _mm_cvtps_epi32(c_f32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f &gt;&gt; 8\u00a0\u0432 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430: \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u0438\u0442 1 \u043a\u0430\u0436\u0434\u043e\u0433\u043e 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430.<\/p>\n<pre><code class=\"cpp\">const __m128i c_u8  = _mm_shuffle_epi8(c_i32, _mm_setr_epi8(     0 + 1, 4 + 1, 8 + 1, 12 + 1,     -1, -1, -1, -1,     -1, -1, -1, -1,     -1, -1, -1, -1 ));  const uint32_t buf = _mm_cvtsi128_si32(c_u8); memcpy(&amp;out[i], &amp;buf, 4);<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b<\/h3>\n<p>\u0412 SSE \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 RCPPS, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e \u0435\u0451 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:\u00a01\/<em>x<\/em>. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435  <em>\u0434\u0435\u043b\u0438\u043c\u043e\u0435 <\/em>\u22c5\u00a0<em>approx<\/em>(1\/<em>\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c<\/em>).<\/p>\n<p>\u0412 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e <strong>\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f<\/strong> \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 1.5 \u22c5 2<sup>\u00a0\u2212 12<\/sup>. \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u044b\u0445 x \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u043c\u0430. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.00025 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 RCPPS \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043e\u0442 1.00024 \u0434\u043e 1.00199.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/445\/961\/00f\/44596100f6f51bf82be8d7bdb26929fb.png\" alt=\"2024-12-21-uint8-division\/rcp_diff.png\" title=\"\" width=\"1024\" height=\"800\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/445\/961\/00f\/44596100f6f51bf82be8d7bdb26929fb.png\"\/><\/figure>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th rowspan=\"2\">\n<p>x<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>1 \/ x<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>approx 1 \/ x<\/p>\n<\/th>\n<th rowspan=\"2\">\n<p>error<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p>float<\/p>\n<\/th>\n<th>\n<p>hex<\/p>\n<\/th>\n<th>\n<p>float<\/p>\n<\/th>\n<th>\n<p>hex<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3f800000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.999756<\/p>\n<\/td>\n<td>\n<p align=\"left\">3f7ff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000244<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.500000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3f000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.499878<\/p>\n<\/td>\n<td>\n<p align=\"left\">3efff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000122<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.333333<\/p>\n<\/td>\n<td>\n<p align=\"left\">3eaaaaab<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.333313<\/p>\n<\/td>\n<td>\n<p align=\"left\">3eaaa800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000020<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.250000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e800000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.249939<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e7ff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000061<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.200000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e4ccccd<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.199951<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e4cc000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000049<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.166667<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e2aaaab<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.166656<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e2aa800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000010<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">7<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.142857<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e124925<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.142822<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e124000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000035<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.125000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.124969<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dfff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000031<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.111111<\/p>\n<\/td>\n<td>\n<p align=\"left\">3de38e39<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.111084<\/p>\n<\/td>\n<td>\n<p align=\"left\">3de38000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000027<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.100000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dcccccd<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.099976<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dccc000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000024<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">11<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.090909<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dba2e8c<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.090897<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dba2800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000012<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">12<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.083333<\/p>\n<\/td>\n<td>\n<p align=\"left\">3daaaaab<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.083328<\/p>\n<\/td>\n<td>\n<p align=\"left\">3daaa800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000005<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">13<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.076923<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d9d89d9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.076920<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d9d8800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000004<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">14<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.071429<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d924925<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.071411<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d924000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000017<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">15<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.066667<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d888889<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.066650<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d888000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000016<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.062500<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d800000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.062485<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d7ff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000015<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">17<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.058824<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d70f0f1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.058807<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d70e000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000016<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">18<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.055556<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d638e39<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.055542<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d638000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000014<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">19<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.052632<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d579436<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.052620<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d578800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000012<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">20<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.050000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d4ccccd<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.049988<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d4cc000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000012<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"6\">\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">255<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.003922<\/p>\n<\/td>\n<td>\n<p align=\"left\">3b808081<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.003922<\/p>\n<\/td>\n<td>\n<p align=\"left\">3b808000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000000<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/h2>\n<p><a href=\"http:\/\/en.wikipedia.org\/wiki\/Long_division\" rel=\"noopener noreferrer nofollow\">\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/a>\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430\u043c \u0441\u043e \u0448\u043a\u043e\u043b\u044b.<\/p>\n<ol>\n<li>\n<p>\u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 <strong>\u043e\u0441\u0442\u0430\u0442\u043a\u0430<\/strong> \u0438 <strong>\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/strong>, \u0440\u0430\u0432\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0441\u0430\u043c\u044b\u0445 \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f, \u0442\u043e \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c <em>q<\/em>\u00a0:=\u00a0<em>\u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/em>\/<em>\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c<\/em>. \u042d\u0442\u043e \u0447\u0438\u0441\u043b\u043e, <strong>\u0440\u0430\u0437\u0440\u044f\u0434<\/strong>, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, 9] \u0434\u043b\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0432\u043d\u043e 0 \u0438\u043b\u0438 1 \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043d\u0430 <em>q<\/em>\u00a0\u22c5\u00a0<em>divisor<\/em>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u044f\u0434<strong> <\/strong><em>q<\/em> \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 <strong>\u043d\u0430\u0447\u0430\u043b\u043e<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u043c \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u044f\u0434\u044b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0443\u043d\u043a\u0442\u0443 2.<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0438 \u043e\u0441\u0442\u0430\u0442\u043a\u0430. \u0415\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 CPU.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u043c \u043c\u0438\u043d\u0443\u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435 \u043f\u043b\u044e\u0441 1. \u0412 \u043d\u0430\u0438\u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u0442\u0430\u043f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0430\u0437. \u0412\u043e\u0442 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">uint8_t long_div_u8(uint8_t dividend, uint8_t divisor) {     uint8_t reminder = 0;     uint8_t quotient = 0;      for (int i=7; i &gt;= 0; i--) {         \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f i-\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0432 0-\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438         reminder &lt;&lt;= 1;          \/\/ \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u0431\u0438\u0442         reminder |= (dividend &gt;&gt; i) &amp; 1;          if (reminder &gt;= divisor) {             \/\/ \u0437\u0430\u0434\u0430\u0451\u043c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f             quotient |= 1 &lt;&lt; i;              \/\/ \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a             reminder -= divisor;         }     }      return quotient; }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e8\/5e1\/0d9\/2e85e10d90a17af846145f5e492bcc46.gif\" width=\"636\" height=\"275\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e8\/5e1\/0d9\/2e85e10d90a17af846145f5e492bcc46.gif\"\/><\/figure>\n<p>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043a \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c. \u041d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u0415\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b \u0438\u043c\u0435\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u043a\u0438, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0422\u0430\u043a\u043a\u0430\u043a 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u043e\u0442 \u2212 128 \u0434\u043e 127, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u0445 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0430\u0432\u0435\u043d 0\u2026128. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u0431\u0438\u0442\u043e\u0432.<\/p>\n<h2>\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0438\u0437 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0441\u0442\u0430\u0442\u043e\u043a:<\/p>\n<pre><code class=\"cpp\">reminder = (reminder &lt;&lt; 1) | ((dividend &gt;&gt; i) &amp; 1);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u0434\u0430\u0451\u043c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a:<\/p>\n<pre><code class=\"cpp\">quotient |= 1 &lt;&lt; i; reminder -= divisor;<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>SSE \u0438 AVX2<\/h3>\n<h4>\u042d\u0442\u0430\u043f 1: \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430<\/h4>\n<p>\u0412 SSE \u0438 AVX2 \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043c\u043b\u0430\u0434\u0448\u0438\u0439 \u0431\u0438\u0442 0. \u041c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 \u043d\u0443\u043b\u0451\u043c \u0447\u0438\u0441\u043b\u043e, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043a\u0430\u043a <strong>\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c<\/strong>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 0x00 \u0438\u043b\u0438 0xff (\u00a0\u2212 1).<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0438\u043c\u043e\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u043b\u043e\u0441\u044c \u0432\u043b\u0435\u0432\u043e \u043d\u0430 1, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0432\u0441\u0435 \u0435\u0433\u043e \u0431\u0438\u0442\u044b.<\/p>\n<p>\u0421\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 1 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f.<\/p>\n<h4>\u042d\u0442\u0430\u043f 2: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435<\/h4>\n<p>\u0412 SSE \u0438 AVX2 \u043d\u0435\u0442 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c. \u041c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0434\u0432\u0430 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0447\u0438\u0441\u043b\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c: \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0438\u0445 \u0441\u0430\u043c\u044b\u0435 \u0441\u0442\u0430\u0440\u0448\u0438\u0435 \u0431\u0438\u0442\u044b. \u042d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 XOR \u0441 0x80.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c xor \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0434\u043b\u044f \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438 \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0430\u0437 \u0434\u043b\u044f \u043e\u0441\u0442\u0430\u0442\u043a\u0430.<\/p>\n<h4>\u042d\u0442\u0430\u043f 3: \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0432 \u043f\u043e\u0441\u043b\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u043a\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043c\u0430\u0441\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <strong>\u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 1 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c <strong>\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c<\/strong> \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u043c i-\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0430.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (SSE)<\/h4>\n<p>\u0412 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u043e\u0434\u0435 \u043d\u0430 C \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0441\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">uint8_t long_div_u8(uint8_t dividend, uint8_t divisor) {     uint8_t reminder = 0;     uint8_t quotient = 0;     uint8_t bit = 0x80;      uint8_t divisor_xored = divisor ^ 0x80;      for (int i=7; i &gt;= 0; i--) {          \/\/ msb =&gt; 0 \u0438\u043b\u0438 -1         const uint8_t msb = (int8_t)dividend &lt; 0 ? 0xff : 0x00;          \/\/ \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0438\u0442         reminder -= msb;          if ((int8_t)(reminder ^ 0x80) &gt;= (int8_t)(divisor_xored) {             \/\/ \u0437\u0430\u0434\u0430\u0451\u043c  i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f             quotient |= bit;              \/\/ \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a             reminder -= divisor;         }          bit &gt;&gt;= 1;         dividend &lt;&lt;= 1;         \/\/ \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f i-\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0432 0-\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438         reminder &lt;&lt;= 1;     }      return quotient; }<\/code><\/pre>\n<p>\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 SSE.<\/p>\n<pre><code class=\"cpp\">void sse_long_div_u8(const uint8_t* A, const uint8_t* B, uint8_t* C, size_t n) {     const __m128i msb  = _mm_set1_epi8(int8_t(0x80));     const __m128i zero = _mm_set1_epi8(0x00);      for (size_t i=0; i &lt; n; i += 16) {         __m128i dividend = _mm_loadu_si128((__m128i*)(&amp;A[i]));          const __m128i divisor = _mm_loadu_si128((__m128i*)(&amp;B[i]));         __m128i divisor_xored = _mm_xor_si128(divisor, msb);          __m128i bit      = msb;         __m128i reminder = _mm_set1_epi16(0);         __m128i quotient = _mm_set1_epi16(0);         for (int j=0; j &lt; 8; j++) {             \/\/ \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c msb \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u0441\u0442\u0430\u0442\u043e\u043a             const __m128i t0 = _mm_cmplt_epi8(dividend, zero);             reminder = _mm_sub_epi8(reminder, t0);              \/\/ \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438 \u043e\u0441\u0442\u0430\u0442\u043a\u0430             const __m128i reminder_xored = _mm_xor_si128(reminder, msb);             const __m128i gt = _mm_cmpgt_epi8(divisor_xored, reminder_xored);              \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435 \u0438 \u0431\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f             const __m128i cond_divisor      = _mm_andnot_si128(gt, divisor);             const __m128i cond_quotient_bit = _mm_andnot_si128(gt, bit);              \/\/ \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f             reminder = _mm_sub_epi16(reminder, cond_divisor);             quotient = _mm_or_si128(quotient, cond_quotient_bit);              \/\/ \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0442 \u0434\u043b\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f             bit = _mm_srli_epi32(bit, 1);              \/\/ \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0442 \u0438\u0437 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0432 MSB             dividend = _mm_add_epi8(dividend, dividend);              \/\/ \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0431\u0438\u0442\u0430 \u0438\u0437 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e             reminder = _mm_add_epi32(reminder, reminder);         }          _mm_storeu_si128((__m128i*)(&amp;C[i]), quotient);     } }<\/code><\/pre>\n<h3>AVX-512<\/h3>\n<h4>\u042d\u0442\u0430\u043f 1: \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/h4>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f SSE\/AVX2, \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0449\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0432 \u043d\u0443\u043b\u0435\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e. \u0417\u043d\u0430\u0447\u0438\u0442, \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u0431\u0438\u0442\u0430 \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u043e\u0434\u043d\u043e\u0439 <a href=\"http:\/\/0x80.pl\/notesen\/2015-03-22-avx512-ternary-functions.html\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439<\/a>.<\/p>\n<pre><code class=\"cpp\">reminder &lt;&lt;= 1; t0         = divisor &gt;&gt; i; reminder   = reminder | (t0 &amp; 1); \/\/ \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f<\/code><\/pre>\n<h4>\u042d\u0442\u0430\u043f 2: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435<\/h4>\n<p>AVX512 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442\u043e\u0432, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0443.<\/p>\n<h4>\u042d\u0442\u0430\u043f 3: \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/h4>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u043c\u0430\u0441\u043a\u0430\u043c\u0438.<\/p>\n<h4>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p>\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 AVX512. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 SSE-\u043a\u043e\u0434\u0430, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u043e\u0439, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0432 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cpp\">void avx512_long_div_u8(const uint8_t* A, const uint8_t* B, uint8_t* C, size_t n) {     const __m512i one = _mm512_set1_epi8(1);      for (size_t i=0; i &lt; n; i += 64) {         const __m512i dividend = _mm512_loadu_si512((const __m512*)(&amp;A[i]));         const __m512i divisor  = _mm512_loadu_si512((const __m512*)(&amp;B[i]));          const __m512i dividend_bit7 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 7), one);         const __m512i dividend_bit6 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 6), one);         const __m512i dividend_bit5 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 5), one);         const __m512i dividend_bit4 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 4), one);         const __m512i dividend_bit3 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 3), one);         const __m512i dividend_bit2 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 2), one);         const __m512i dividend_bit1 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 1), one);         const __m512i dividend_bit0 = _mm512_and_epi32(_mm512_srli_epi32(dividend, 0), one);          __m512i quotient = _mm512_set1_epi32(0);         __m512i reminder = dividend_bit7;          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit6);          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi32(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit5);          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi32(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit4);          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi32(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit3);          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi32(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit2);          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi32(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit1);          {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi32(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          reminder = _mm512_add_epi32(reminder, reminder);         reminder = _mm512_or_epi32(reminder, dividend_bit0);           {             const __mmask64 ge = _mm512_cmpge_epu8_mask(reminder, divisor);             reminder = _mm512_mask_sub_epi8(reminder, ge, reminder, divisor);             quotient = _mm512_add_epi8(quotient, quotient);             quotient = _mm512_mask_add_epi8(quotient, ge, quotient, one);         }          _mm512_storeu_si512((__m512*)&amp;C[i], quotient);     } }<\/code><\/pre>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430<\/h2>\n<p>\u041a\u0440\u0430\u0442\u043a\u0438\u0435 \u0438\u0442\u043e\u0433\u0438:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430 CPU Intel \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u0441 AVX-512.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430 Ryzen \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0441\u0435\u0445 \u0431\u044b\u043b \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c AVX2.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f GCC \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430 \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 AVX2, \u0438\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c\u044b\u0439 \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u043e\u043f\u0446\u0438\u044f\u043c\u0438 <code>-O3\u00a0-march=native<\/code>\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/p>\n<\/th>\n<th>\n<p>\u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0441\u0442\u043e\u0435 8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (unrolled x 4)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e 4 \u0440\u0430\u0437\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#long-div\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/a> \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div, autovect)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c \u0441 \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#div-with-rounding\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (no rounding)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#div-no-rounding\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f<\/a>\u00a0(\u0434\u0435\u043b\u0438\u043c\u043e\u0435 \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 256)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0443\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c (CVTTPS2DQ)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#rcp\" rel=\"noopener noreferrer nofollow\">\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE long div<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#long-div-sse\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 SSE<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#div-with-rounding\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0443\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c (CVTTPS2DQ)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#rcp\" rel=\"noopener noreferrer nofollow\">\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#long-div-avx2\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 AVX2<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u043e\u0432 \u0438 \u0443\u0441\u0435\u0447\u0435\u043d\u0438\u0435\u043c (CVTTPS2DQ)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#rcp\" rel=\"noopener noreferrer nofollow\">\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\"><a href=\"http:\/\/0x80.pl\/notesen\/2024-12-21-uint8-division.html#long-div-avx512\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 AVX-512<\/a><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>Ryzen 7<\/h3>\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440: gcc (Debian 14.1.0-5) 14.1.0<\/p>\n<\/li>\n<li>\n<p>CPU: AMD Ryzen 7 7730U \u0441 Radeon Graphics<\/p>\n<\/li>\n<\/ul>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>\u0432\u0440\u0435\u043c\u044f \u0432 \u0442\u0430\u043a\u0442\u0430\u0445 \u043d\u0430 \u0431\u0430\u0439\u0442<\/p>\n<\/th>\n<th colspan=\"2\" data-colwidth=\"140,0\" width=\"140\">\n<p>\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<th>\n<p>\u0441\u0440\u0435\u0434\u043d\u0435\u0435<\/p>\n<\/th>\n<th>\n<p>\u043b\u0443\u0447\u0448\u0435\u0435<\/p>\n<\/th>\n<th data-colwidth=\"140\" width=\"140\">\n<p>\u00a0<\/p>\n<\/th>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.777<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.759<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u258a<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (unrolled x 4)<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.881<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.869<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">0.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div)<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.548<\/p>\n<\/td>\n<td>\n<p align=\"left\">5.523<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">0.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div, autovect)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.418<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.414<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">4.2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.372<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.367<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">4.8<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (no rounding)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.334<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.331<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">5.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.330<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.327<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">5.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.751<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.741<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">2.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.220<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.218<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">8.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.215<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.212<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">8.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.376<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.372<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">4.7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a<\/sub><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>Skylake-X<\/h3>\n<ul>\n<li>\n<p>CPU: Intel(R) Xeon(R) W-2104, 3.20GHz<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440: gcc (GCC) 11.2.0<\/p>\n<\/li>\n<\/ul>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>\u0432\u0440\u0435\u043c\u044f \u0432 \u0442\u0430\u043a\u0442\u0430\u0445 \u043d\u0430 \u0431\u0430\u0439\u0442<\/p>\n<\/th>\n<th colspan=\"2\" data-colwidth=\"140,0\" width=\"140\">\n<p>\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<th>\n<p>\u0441\u0440\u0435\u0434\u043d\u0435\u0435<\/p>\n<\/th>\n<th>\n<p>\u043b\u0443\u0447\u0448\u0435\u0435<\/p>\n<\/th>\n<th data-colwidth=\"140\" width=\"140\">\n<p>\u00a0<\/p>\n<\/th>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.044<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.018<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (unrolled x 4)<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.020<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.016<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">1.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div)<\/p>\n<\/td>\n<td>\n<p align=\"left\">18.988<\/p>\n<\/td>\n<td>\n<p align=\"left\">18.176<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">0.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div, autovect)<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.003<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.991<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">8.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.168<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.163<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">6.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258f<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (no rounding)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.820<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.814<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">9.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.831<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.826<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">9.7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.907<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.903<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">8.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.096<\/p>\n<\/td>\n<td>\n<p align=\"left\">2.090<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">3.8<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.062<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.057<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">7.6<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.839<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.835<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">9.6<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.971<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.967<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">8.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.076<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.069<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">7.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258e<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.483<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.474<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">5.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.191<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.186<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">6.8<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.709<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.702<\/p>\n<\/td>\n<td data-colwidth=\"140\" width=\"140\">\n<p align=\"left\">11.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>IceLake<\/h3>\n<ul>\n<li>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440: gcc (GCC) 13.3.1 20240611 (Red Hat 13.3.1-2)<\/p>\n<\/li>\n<li>\n<p>CPU: Intel(R) Xeon(R) Gold 6338, 2.00GHz<\/p>\n<\/li>\n<\/ul>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p>\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>\u0432\u0440\u0435\u043c\u044f \u0432 \u0442\u0430\u043a\u0442\u0430\u0445 \u043d\u0430 \u0431\u0430\u0439\u0442<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<th>\n<p>\u0441\u0440\u0435\u0434\u043d\u0435\u0435<\/p>\n<\/th>\n<th>\n<p>\u043b\u0443\u0447\u0448\u0435\u0435<\/p>\n<\/th>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<th>\n<p>\u00a0<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.036<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.011<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u258b<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (unrolled x 4)<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.016<\/p>\n<\/td>\n<td>\n<p align=\"left\">6.012<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u258b<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div)<\/p>\n<\/td>\n<td>\n<p align=\"left\">9.865<\/p>\n<\/td>\n<td>\n<p align=\"left\">8.397<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2589<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">scalar (long div, autovect)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.581<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.578<\/p>\n<\/td>\n<td>\n<p align=\"left\">10.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.593<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.586<\/p>\n<\/td>\n<td>\n<p align=\"left\">10.3<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (no rounding)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.476<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.473<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.487<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.484<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258b<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.504<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.498<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SSE long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.247<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.240<\/p>\n<\/td>\n<td>\n<p align=\"left\">4.8<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.546<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.518<\/p>\n<\/td>\n<td>\n<p align=\"left\">11.6<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.447<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.442<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.6<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.445<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.431<\/p>\n<\/td>\n<td>\n<p align=\"left\">13.9<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258a<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX2 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.641<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.635<\/p>\n<\/td>\n<td>\n<p align=\"left\">9.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2589<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 (cvtt)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.827<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.814<\/p>\n<\/td>\n<td>\n<p align=\"left\">7.4<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 (rcp)<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.507<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.503<\/p>\n<\/td>\n<td>\n<p align=\"left\">12.0<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258d<\/sub><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">AVX512 long div<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.398<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.396<\/p>\n<\/td>\n<td>\n<p align=\"left\">15.2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><sub>\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588<\/sub><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/h2>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u043b\u043e\u0436\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/WojciechMula\/toys\/tree\/master\/u8div\" rel=\"noopener noreferrer nofollow\">GitHub<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/869094\/\"> https:\/\/habr.com\/ru\/articles\/869094\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 CPU Cannon Lake \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 10-15 \u0442\u0430\u043a\u0442\u043e\u0432, \u0430 \u043d\u0430 Zen4 \u2014 9-14 \u0442\u0430\u043a\u0442\u043e\u0432. \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0438 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 CPU \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 3-4 \u0442\u0430\u043a\u0442\u0430.<\/p>\n<p>\u041d\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 ISA SIMD (SSE, AVX, AVX-512, ARM Neon, ARM SVE) \u043d\u0435\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043e\u043d\u043e \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <a href=\"http:\/\/0x80.pl\/notesen\/2024-11-09-riscv-vector-extension.html\" rel=\"noopener noreferrer nofollow\">RISC-V Vector Extension<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 ISA \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 SIMD-\u0434\u0435\u043b\u0435\u043d\u0438\u044f 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0447\u0438\u0441\u0435\u043b:<\/p>\n<ol>\n<li>\n<p>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043d\u0438\u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 C++. \u041f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0438\u0439 \u043e \u0434\u0435\u043b\u0438\u043c\u044b\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0440\u0430\u0432\u043d\u044b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"http:\/\/en.wikipedia.org\/wiki\/Division_algorithm#Division_by_a_constant\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443<\/a>.<\/p>\n<pre><code class=\"cpp\">void scalar_div_u8(const uint8_t* a, const uint8_t* b, uint8_t* out, size_t n) {     for (size_t i=0; i &lt; n; i++) {         out[i] = a[i] \/ b[i];     } }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, GCC 14.1.0 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 (\u0432\u044b\u0440\u0435\u0437\u0430\u043d \u0432\u0435\u0441\u044c \u043c\u0443\u0441\u043e\u0440, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430):<\/p>\n<pre><code class=\"cpp\">2b40:       48 85 c9                test   %rcx,%rcx 2b43:       74 30                   je     2b75 &lt;_Z13scalar_div_u8PKhS0_Phm+0x35&gt; 2b45:       45 31 c0                xor    %r8d,%r8d 2b60:       42 0f b6 04 07          movzbl (%rdi,%r8,1),%eax 2b65:       42 f6 34 06             divb   (%rsi,%r8,1) 2b69:       42 88 04 02             mov    %al,(%rdx,%r8,1) 2b6d:       49 ff c0                inc    %r8 2b70:       4c 39 c1                cmp    %r8,%rcx 2b73:       75 eb                   jne    2b60 &lt;_Z13scalar_div_u8PKhS0_Phm+0x20&gt; 2b75:       c3                      ret<\/code><\/pre>\n<h2>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439<\/h2>\n<p>8-\u0431\u0438\u0442\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>\u041e\u0431\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ol>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 integer,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435 integer \u0432 \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 integer,<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e integer \u0432 8-\u0431\u0438\u0442\u043d\u044b\u0439 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<\/li>\n<\/ol>\n<h3>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435\u043c<\/h3>\n<p>\u0412\u043e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b SSE. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 integer \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0441\u0435\u0447\u044c \u0447\u0438\u0441\u043b\u043e \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u0442 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b (\u0441\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0435 \u043d\u0430 1).<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u043c\u044b\u0445.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_a; memcpy(&amp;buf_a, &amp;a[i], 4);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0418 \u0447\u0435\u0442\u044b\u0440\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_b; memcpy(&amp;buf_b, &amp;b[i], 4);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0438\u0445 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 SSE \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0439.<\/p>\n<pre><code class=\"cpp\">const __m128i a_u8  = _mm_cvtsi32_si128(buf_a); const __m128i a_u32 = _mm_cvtepu8_epi32(a_u8);  const __m128i b_u8  = _mm_cvtsi32_si128(buf_b); const __m128i b_u32 = _mm_cvtepu8_epi32(b_u8);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f 32-\u0431\u0438\u0442\u043d\u044b\u0445 integer \u0432\u043e float.<\/p>\n<pre><code class=\"cpp\">const __m128  a_f32 = _mm_cvtepi32_ps(a_u32); const __m128  b_f32 = _mm_cvtepi32_ps(b_u32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0441\u0435\u0447\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">const __m128  c_f32   = _mm_div_ps(a_f32, b_f32); const __m128  c_f32_2 = _mm_round_ps(c_f32, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c float \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 integer.<\/p>\n<pre><code class=\"cpp\">const __m128i c_i32 = _mm_cvtps_epi32(c_f32_2);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c 32-\u0431\u0438\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u0432 8-\u0431\u0438\u0442\u043d\u044b\u0439: \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043b\u0430\u0434\u0448\u0438\u0435 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<pre><code class=\"cpp\">const __m128i c_u8  = _mm_shuffle_epi8(c_i32, _mm_setr_epi8(     0, 4, 8, 12,     -1, -1, -1, -1,     -1, -1, -1, -1,     -1, -1, -1, -1 ));  const uint32_t buf = _mm_cvtsi128_si32(c_u8); memcpy(&amp;out[i], &amp;buf, 4);<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f ROUNDPS \u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0430 CPU Intel. \u041d\u0430 IceLake \u2014 8 \u0442\u0430\u043a\u0442\u043e\u0432, \u0430 \u043d\u0430 Zen4 \u2014 \u0432\u0441\u0435\u0433\u043e 3 \u0442\u0430\u043a\u0442\u0430.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u044f\u0442\u043e\u0439, \u0443\u043c\u043d\u043e\u0436\u0438\u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u0435 \u043d\u0430 256 (\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u0441\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 8 \u0431\u0438\u0442\u043e\u0432), \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0434\u0432\u0438\u043d\u0443\u0432 \u0432\u043f\u0440\u0430\u0432\u043e \u043d\u0430 8 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0421\u0434\u0432\u0438\u0433 \u0432\u043f\u0440\u0430\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0437\u0430\u0442\u0440\u0430\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0438 \u0442\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0435. \u0421\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 8 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f SSE-\u043a\u043e\u0434\u0430 \u2014 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0443 \u0431\u0430\u0439\u0442\u043e\u0432 (byte shuffle), \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0434\u0432\u0438\u0433 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 AVX2-\u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043e\u0432\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 128-\u0431\u0438\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u043a\u0442\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0431\u043e\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0432\u0432\u043e\u0434 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u042d\u0442\u0430 SSE-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430:<\/p>\n<ol>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0435\u043b\u0438\u043c\u044b\u0445.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_a; memcpy(&amp;buf_a, &amp;a[i], 4); const __m128i a_u8  = _mm_cvtsi32_si128(buf_a);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0435\u043b\u0438\u043c\u043e\u0435 &lt;&lt; 8\u00a0\u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">const __m128i a_u32 = _mm_shuffle_epi8(a_u8, _mm_setr_epi8(     -1, 0, -1, -1,     -1, 1, -1, -1,     -1, 2, -1, -1,     -1, 3, -1, -1 ));<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0438\u0445 \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430.<\/p>\n<pre><code class=\"cpp\">uint32_t buf_b; memcpy(&amp;buf_b, &amp;b[i], 4); const __m128i b_u8  = _mm_cvtsi32_si128(buf_b); const __m128i b_u32 = _mm_cvtepu8_epi32(b_u8);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0438\u043f \u0432\u0441\u0435\u0445 32-\u0431\u0438\u0442\u043d\u044b\u0445 integer \u0432\u043e float.<\/p>\n<pre><code class=\"cpp\">const __m128  a_f32 = _mm_cvtepi32_ps(a_u32); const __m128  b_f32 = _mm_cvtepi32_ps(b_u32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"cpp\">const __m128  c_f32   = _mm_div_ps(a_f32, b_f32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 32-\u0431\u0438\u0442\u043d\u044b\u0435 integer.<\/p>\n<pre><code class=\"cpp\">const __m128i c_i32 = _mm_cvtps_epi32(c_f32);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u043b\u0435\u043d\u0438\u044f &gt;&gt; 8\u00a0\u0432 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430: \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0431\u0438\u0442 1 \u043a\u0430\u0436\u0434\u043e\u0433\u043e 32-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430.<\/p>\n<pre><code class=\"cpp\">const __m128i c_u8  = _mm_shuffle_epi8(c_i32, _mm_setr_epi8(     0 + 1, 4 + 1, 8 + 1, 12 + 1,     -1, -1, -1, -1,     -1, -1, -1, -1,     -1, -1, -1, -1 ));  const uint32_t buf = _mm_cvtsi128_si32(c_u8); memcpy(&amp;out[i], &amp;buf, 4);<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b<\/h3>\n<p>\u0412 SSE \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430 RCPPS, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e \u0435\u0451 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:\u00a01\/<em>x<\/em>. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435  <em>\u0434\u0435\u043b\u0438\u043c\u043e\u0435 <\/em>\u22c5\u00a0<em>approx<\/em>(1\/<em>\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c<\/em>).<\/p>\n<p>\u0412 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u0441\u044f, \u0447\u0442\u043e <strong>\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f<\/strong> \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 1.5 \u22c5 2<sup>\u00a0\u2212 12<\/sup>. \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u0430\u044f \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e. \u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u044b\u0445 x \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u043c\u0430. <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.00025 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 RCPPS \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043e\u0442 1.00024 \u0434\u043e 1.00199.<\/p>\n<figure class=\"full-width\"><\/figure>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th rowspan=\"2\">\n<p>x<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>1 \/ x<\/p>\n<\/th>\n<th colspan=\"2\">\n<p>approx 1 \/ x<\/p>\n<\/th>\n<th rowspan=\"2\">\n<p>error<\/p>\n<\/th>\n<\/tr>\n<tr>\n<th>\n<p>float<\/p>\n<\/th>\n<th>\n<p>hex<\/p>\n<\/th>\n<th>\n<p>float<\/p>\n<\/th>\n<th>\n<p>hex<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1<\/p>\n<\/td>\n<td>\n<p align=\"left\">1.000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3f800000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.999756<\/p>\n<\/td>\n<td>\n<p align=\"left\">3f7ff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000244<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">2<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.500000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3f000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.499878<\/p>\n<\/td>\n<td>\n<p align=\"left\">3efff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000122<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">3<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.333333<\/p>\n<\/td>\n<td>\n<p align=\"left\">3eaaaaab<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.333313<\/p>\n<\/td>\n<td>\n<p align=\"left\">3eaaa800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000020<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">4<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.250000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e800000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.249939<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e7ff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000061<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">5<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.200000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e4ccccd<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.199951<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e4cc000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000049<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">6<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.166667<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e2aaaab<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.166656<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e2aa800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000010<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">7<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.142857<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e124925<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.142822<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e124000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000035<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">8<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.125000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3e000000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.124969<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dfff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000031<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.111111<\/p>\n<\/td>\n<td>\n<p align=\"left\">3de38e39<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.111084<\/p>\n<\/td>\n<td>\n<p align=\"left\">3de38000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000027<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.100000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dcccccd<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.099976<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dccc000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000024<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">11<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.090909<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dba2e8c<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.090897<\/p>\n<\/td>\n<td>\n<p align=\"left\">3dba2800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000012<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">12<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.083333<\/p>\n<\/td>\n<td>\n<p align=\"left\">3daaaaab<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.083328<\/p>\n<\/td>\n<td>\n<p align=\"left\">3daaa800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000005<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">13<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.076923<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d9d89d9<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.076920<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d9d8800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000004<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">14<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.071429<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d924925<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.071411<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d924000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000017<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">15<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.066667<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d888889<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.066650<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d888000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000016<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">16<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.062500<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d800000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.062485<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d7ff000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000015<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">17<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.058824<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d70f0f1<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.058807<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d70e000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000016<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">18<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.055556<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d638e39<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.055542<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d638000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000014<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">19<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.052632<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d579436<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.052620<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d578800<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000012<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">20<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.050000<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d4ccccd<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.049988<\/p>\n<\/td>\n<td>\n<p align=\"left\">3d4cc000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000012<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"6\">\n<p align=\"left\">&#8230;<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">255<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.003922<\/p>\n<\/td>\n<td>\n<p align=\"left\">3b808081<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.003922<\/p>\n<\/td>\n<td>\n<p align=\"left\">3b808000<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.000000<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/h2>\n<p><a href=\"http:\/\/en.wikipedia.org\/wiki\/Long_division\" rel=\"noopener noreferrer nofollow\">\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c<\/a>\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430\u043c \u0441\u043e \u0448\u043a\u043e\u043b\u044b.<\/p>\n<ol>\n<li>\n<p>\u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 <strong>\u043e\u0441\u0442\u0430\u0442\u043a\u0430<\/strong> \u0438 <strong>\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f<\/strong>, \u0440\u0430\u0432\u043d\u043e\u0433\u043e \u043d\u0443\u043b\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430\u0442\u0435\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u044f\u0434 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0441\u0430\u043c\u044b\u0445 \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f, \u0442\u043e \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c <em>q<\/em>\u00a0:=\u00a0<em>\u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/em>\/<em>\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c<\/em>. \u042d\u0442\u043e \u0447\u0438\u0441\u043b\u043e, <strong>\u0440\u0430\u0437\u0440\u044f\u0434<\/strong>, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 [0, 9] \u0434\u043b\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0432\u043d\u043e 0 \u0438\u043b\u0438 1 \u0434\u043b\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u0435\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u043d\u0430 <em>q<\/em>\u00a0\u22c5\u00a0<em>divisor<\/em>.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u044f\u0434<strong> <\/strong><em>q<\/em> \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 <strong>\u043d\u0430\u0447\u0430\u043b\u043e<\/strong> \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u043c \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u044f\u0434\u044b, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0443\u043d\u043a\u0442\u0443 2.<\/p>\n<\/li>\n<\/ol>\n<p>\u0423\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u0438 \u043e\u0441\u0442\u0430\u0442\u043a\u0430. \u0415\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u0442\u0430\u043f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043d\u0435\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 CPU.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u043c \u043c\u0438\u043d\u0443\u0441 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435 \u043f\u043b\u044e\u0441 1. \u0412 \u043d\u0430\u0438\u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u043e \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0440\u0430\u0437\u0440\u044f\u0434\u043e\u0432 \u0432 \u0434\u0435\u043b\u0438\u043c\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u0442\u0430\u043f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u0432\u043e\u0441\u0435\u043c\u044c \u0440\u0430\u0437. \u0412\u043e\u0442 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">uint8_t long_div_u8(uint8_t dividend, uint8_t divisor) {     uint8_t reminder = 0;     uint8_t quotient = 0;      for (int i=7; i &gt;= 0; i--) {         \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u0435\u043c \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f i-\u0442\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0432 0-\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438         reminder &lt;&lt;= 1;          \/\/ \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0442\u043e\u0442 \u0431\u0438\u0442         reminder |= (dividend &gt;&gt; i) &amp; 1;          if (reminder &gt;= divisor) {             \/\/ \u0437\u0430\u0434\u0430\u0451\u043c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f             quotient |= 1 &lt;&lt; i;              \/\/ \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a             reminder -= divisor;         }     }      return quotient; }<\/code><\/pre>\n<figure class=\"full-width\"><\/figure>\n<p>\u0414\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u043b\u0431\u0438\u043a\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0438 \u043a \u0446\u0435\u043b\u044b\u043c \u0447\u0438\u0441\u043b\u0430\u043c \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c. \u041d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u043b\u0438\u043c\u043e\u0433\u043e \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u0415\u0441\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b \u0438\u043c\u0435\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u043d\u0430\u043a\u0438, \u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>\u0422\u0430\u043a\u043a\u0430\u043a 8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u043e\u0442 \u2212 128 \u0434\u043e 127, \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438\u0445 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0430\u0432\u0435\u043d 0\u2026128. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u043b\u0431\u0438\u043a \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0441\u0435\u043c\u044c \u0431\u0438\u0442\u043e\u0432.<\/p>\n<h2>\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0438\u0437 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044f \u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c \u0435\u0433\u043e \u0432 \u043e\u0441\u0442\u0430\u0442\u043e\u043a:<\/p>\n<pre><code class=\"cpp\">reminder = (reminder &lt;&lt; 1) | ((dividend &gt;&gt; i) &amp; 1);<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u0438 \u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c;<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u043b\u043e\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u0434\u0430\u0451\u043c i-\u0442\u044b\u0439 \u0431\u0438\u0442 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a:<\/p>\n<pre><code class=\"cpp\">quotient |= 1 &lt;&lt; i; reminder -= divisor;<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>SSE \u0438 AVX2<\/h3>\n<h4>\u042d\u0442\u0430\u043f 1: \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0442\u043a\u0430<\/h4>\n<p>\u0412 SSE \u0438 AVX2 \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043c\u043b\u0430\u0434\u0448\u0438\u0439 \u0431\u0438\u0442 0. \u041c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441 \u043d\u0443\u043b\u0451\u043c \u0447\u0438\u0441\u043b\u043e, \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043a\u0430\u043a <strong>\u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0441\u043e \u0437\u043d\u0430\u043a\u043e\u043c<\/strong>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 0x00 \u0438\u043b\u0438 0xff (\u00a0\u2212 1).<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043b\u0438\u043c\u043e\u0435 \u0441\u0434\u0432\u0438\u0433\u0430\u043b\u043e\u0441\u044c \u0432\u043b\u0435\u0432\u043e \u043d\u0430 1, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0432\u0441\u0435 \u0435\u0433\u043e \u0431\u0438\u0442\u044b.<\/p>\n<p>\u0421\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 1 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f.<\/p>\n<h4>\u042d\u0442\u0430\u043f 2: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435<\/h4>\n<p>\u0412 SSE \u0438 AVX2<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-443255","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/443255","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=443255"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/443255\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=443255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=443255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=443255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}