thermit 1 November 2, 2023 Posted November 2, 2023 · Report post 1 час назад, repstosw сказал: Данный полином не удвовлетворил кодек Рида -Соломона. Конечно. рс это 2^m-1. На счет медленнее - быстрее. Есть ветвление - будут тормоза. Это правило. Избегать ветвлений. Quote Share this post Link to post Share on other sites More sharing options...
sasamy 11 November 2, 2023 Posted November 2, 2023 (edited) · Report post On 11/2/2023 at 11:28 AM, repstosw said: В чём фокус? Функция попала целиком в кеш? Или аппаратное выполнение по условию? скорей всего в вашем наборе большинство данных меньше 65535, кстати попробуйте вариант modnn3() https://godbolt.org/z/449ex98M7 https://scindeks-clanci.ceon.rs/data/pdf/1821-3251/2022/1821-32512202056S.pdf Edited November 2, 2023 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
repstosw 19 November 2, 2023 Posted November 2, 2023 (edited) · Report post 2 hours ago, sasamy said: скорей всего в вашем наборе большинство данных меньше 65535, кстати попробуйте вариант modnn3() https://godbolt.org/z/449ex98M7 unsigned int modnn3(unsigned int x) { x=(x>>16)+(x&65535); x=(x>>16)+(x&65535); return x; } Даёт неверное значение при x=65535. Должно быть 0, возвращает 65535. А так, всё верно - тормоза при сравнении и вычитании, оно выходит составное: sub r0, r0, #65280 subs r0, r0, #255 Всё потому, что ARM не умеет нормально загружать произвольные константы в свои регистры. Edited November 2, 2023 by repstosw Quote Share this post Link to post Share on other sites More sharing options...
repstosw 19 November 2, 2023 Posted November 2, 2023 · Report post Тут ещё попутно обнаружил, что компилятор создаёт монстров. Функция: unsigned int __attribute__ ((noinline)) modnnF(unsigned int x) { while(x>=NN) { x-=NN; x=(x>>MM)+(x&NN); } return x; } Ассемблируется в полне нормальный вид: modnnF: movw r2, #65534 cmp r0, r2 bxls lr .L3: sub r0, r0, #65280 sub r0, r0, #255 uxth r3, r0 add r0, r3, r0, lsr #16 cmp r0, r2 bhi .L3 bx lr Но если сделать так: unsigned int __attribute__ ((noinline)) modnn1(unsigned int x) { while(x>=NN)x-=NN; return x; } То на выходе будет ужас: Spoiler modnn1: movw r3, #65534 mov r2, r0 cmp r0, r3 bxls lr sub r0, r0, #65280 movw r1, #32769 movt r1, 32768 sub r0, r0, #255 movw r3, #65527 umull ip, r1, r1, r0 movt r3, 7 cmp r0, r3 lsr r1, r1, #15 add r1, r1, #1 bls .L8 vdup.32 q8, r2 vldr d18, .L14 vldr d19, .L14+8 vldr d22, .L14+16 vldr d23, .L14+24 vldr d20, .L14+32 vldr d21, .L14+40 vadd.i32 q8, q8, q9 lsr r0, r1, #2 mov r3, #0 .L9: vmov q9, q8 @ v4si add r3, r3, #1 cmp r0, r3 vadd.i32 q8, q8, q11 vadd.i32 q9, q9, q10 bne .L9 bic r3, r1, #3 cmp r1, r3 sub r3, r3, r3, lsl #16 vmov.32 r0, d19[1] add r2, r2, r3 bxeq lr sub r0, r2, #65280 sub r0, r0, #255 .L8: movw r3, #65534 cmp r0, r3 bxls lr mov r0, #2 movt r0, 65534 add r0, r2, r0 cmp r0, r3 bxls lr mov r0, #3 movt r0, 65533 add r0, r2, r0 cmp r0, r3 bxls lr sub r0, r2, #261120 sub r0, r0, #1020 cmp r0, r3 bxls lr mov r0, #5 movt r0, 65531 add r0, r2, r0 cmp r0, r3 bxls lr mov r0, #6 movt r0, 65530 add r0, r2, r0 cmp r0, r3 bxls lr mov r0, #7 movt r0, 65529 add r0, r2, r0 cmp r0, r3 movhi r0, #8 movthi r0, 65528 addhi r0, r2, r0 bx lr .L15: .align 3 .L14: .word 0 .word -65535 .word -131070 .word -196605 .word -262140 .word -262140 .word -262140 .word -262140 .word -65535 .word -65535 .word -65535 .word -65535 .size modnn1, .-modnn1 GCC v. 10.3 Флаги компиляции: CFLAGS=-DNDEBUG -DUSE_JPWL -Ofast -marm -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4 -mfpu=neon \ -ftree-vectorize -fno-math-errno -fmax-errors=1 -ffunction-sections -fdata-sections Как раз тот случай, когда считаешь компилятор дрУгом, а он оказывается врагом Quote Share this post Link to post Share on other sites More sharing options...
repstosw 19 November 2, 2023 Posted November 2, 2023 · Report post 20 minutes ago, repstosw said: То на выходе будет ужас: Если добавить барьер компилятору: unsigned int __attribute__ ((noinline)) modnn1(unsigned int x) { while(x>=NN) { x-=NN; asm volatile ("" ::: "memory"); } return x; } То выглядит воплне прилично: modnn1: movw r3, #65534 cmp r0, r3 bxls lr .L8: sub r0, r0, #65280 sub r0, r0, #255 cmp r0, r3 bhi .L8 bx lr Интересно, что-ж его понесло? Quote Share this post Link to post Share on other sites More sharing options...
sasamy 11 November 2, 2023 Posted November 2, 2023 · Report post On 11/2/2023 at 5:13 PM, repstosw said: Интересно, что-ж его понесло? думаю такие вещи надо руками писать, так работает ? unsigned int modnn3(unsigned int x) { unsigned int tmp = 65535; asm volatile ("cmp %0, %1\n\t" "subhs %0, %0, %1" :: "r" (x), "r" (tmp)); return x; } https://godbolt.org/z/dd55Wjo68 Quote Share this post Link to post Share on other sites More sharing options...
thermit 1 November 2, 2023 Posted November 2, 2023 · Report post 2 часа назад, repstosw сказал: Даёт неверное значение при x=65535. Должно быть 0, возвращает 65535. Не. Не надо на компилятор наезжать. Quote Share this post Link to post Share on other sites More sharing options...
sasamy 11 November 2, 2023 Posted November 2, 2023 · Report post On 11/2/2023 at 6:15 PM, thermit said: Не. Не надо на компилятор наезжать. я просто скопировал из статьи в лоб - у них наверняка еще "за кадром" изменения есть, жаль они не опубликовали исходники Quote Share this post Link to post Share on other sites More sharing options...
thermit 1 November 2, 2023 Posted November 2, 2023 · Report post 20 минут назад, sasamy сказал: я просто скопировал из статьи в лоб - у них наверняка еще "за кадром" изменения есть, жаль они не опубликовали исходники Остается только на калькуляторе посчитать. Потом удивляемся, что ракеты не туда летят. Ну нажми на клавиши, продай талант. С какого хера 0? Quote Share this post Link to post Share on other sites More sharing options...
sasamy 11 November 2, 2023 Posted November 2, 2023 (edited) · Report post On 11/2/2023 at 6:59 PM, thermit said: Остается только на калькуляторе посчитать. Потом удивляемся, что ракеты не туда летят. Ну нажми на клавиши, продай талант. С какого хера 0? modnn1 - вариант из оригинального кода, для 65535 возвращает 0 https://godbolt.org/z/M453na8zs внезапно остаток от деления 65535 на 65535 - 0 Edited November 2, 2023 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
thermit 1 November 2, 2023 Posted November 2, 2023 · Report post x=(x>>16)+(x&65535); при x=65535? Вы чего, издеваетесь? Я тут затрудняюсь что-либо возразить. Да хер с ним. Промолчу. Вам виднее. Quote Share this post Link to post Share on other sites More sharing options...
sasamy 11 November 2, 2023 Posted November 2, 2023 (edited) · Report post On 11/2/2023 at 7:53 PM, thermit said: x=(x>>16)+(x&65535); при x=65535? Вы чего, издеваетесь? Я тут затрудняюсь что-либо возразить. код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете - я предложил вариант из статьи про оптимизацию но он не подходит напрямую Edited November 2, 2023 by sasamy Quote Share this post Link to post Share on other sites More sharing options...
thermit 1 November 2, 2023 Posted November 2, 2023 · Report post Только что, sasamy сказал: код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете Ну давайте разберем.x=65535. Мы его эндим с 65535. Получаем 65535. И это чудо мы суммируем с 0. Что получится? Я пойду нахрен застрелюсь, если это будет 0. Обещаю. 7 минут назад, sasamy сказал: код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете Самый древний и убогий компилятор парсит эту конструкцию совершенно однозначно. Не надо фантазировать. Quote Share this post Link to post Share on other sites More sharing options...
repstosw 19 November 2, 2023 Posted November 2, 2023 · Report post 6 minutes ago, thermit said: Ну давайте разберем.x=65535. Мы его эндим с 65535. Получаем 65535. И это чудо мы суммируем с 0. Что получится? Я пойду нахрен застрелюсь, если это будет 0. Обещаю Никто не спорит, что данное выражение даст 65535. Но нам это не нужно! Нам нужен остаток от деления на 65535. Данное выражение не реализует остаток от деления на 65535. Quote Share this post Link to post Share on other sites More sharing options...
thermit 1 November 2, 2023 Posted November 2, 2023 · Report post 1 минуту назад, repstosw сказал: Никто не спорит, что данное выражение даст 65535. Но нам это не нужно! Нам нужен остаток от деления на 65535. Данное выражение не реализует остаток от деления на 65535. Да. Так и есть. Все вычисления только через таблицу. Вы-то что хотите? Quote Share this post Link to post Share on other sites More sharing options...