thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 1 час назад, repstosw сказал: Данный полином не удвовлетворил кодек Рида -Соломона. Конечно. рс это 2^m-1. На счет медленнее - быстрее. Есть ветвление - будут тормоза. Это правило. Избегать ветвлений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 ноября, 2023 Опубликовано 2 ноября, 2023 (изменено) · Жалоба 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 Изменено 2 ноября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 ноября, 2023 Опубликовано 2 ноября, 2023 (изменено) · Жалоба 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 не умеет нормально загружать произвольные константы в свои регистры. Изменено 2 ноября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба Тут ещё попутно обнаружил, что компилятор создаёт монстров. Функция: 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 Как раз тот случай, когда считаешь компилятор дрУгом, а он оказывается врагом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 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 Интересно, что-ж его понесло? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 2 часа назад, repstosw сказал: Даёт неверное значение при x=65535. Должно быть 0, возвращает 65535. Не. Не надо на компилятор наезжать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба On 11/2/2023 at 6:15 PM, thermit said: Не. Не надо на компилятор наезжать. я просто скопировал из статьи в лоб - у них наверняка еще "за кадром" изменения есть, жаль они не опубликовали исходники Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 20 минут назад, sasamy сказал: я просто скопировал из статьи в лоб - у них наверняка еще "за кадром" изменения есть, жаль они не опубликовали исходники Остается только на калькуляторе посчитать. Потом удивляемся, что ракеты не туда летят. Ну нажми на клавиши, продай талант. С какого хера 0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 ноября, 2023 Опубликовано 2 ноября, 2023 (изменено) · Жалоба On 11/2/2023 at 6:59 PM, thermit said: Остается только на калькуляторе посчитать. Потом удивляемся, что ракеты не туда летят. Ну нажми на клавиши, продай талант. С какого хера 0? modnn1 - вариант из оригинального кода, для 65535 возвращает 0 https://godbolt.org/z/M453na8zs внезапно остаток от деления 65535 на 65535 - 0 Изменено 2 ноября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба x=(x>>16)+(x&65535); при x=65535? Вы чего, издеваетесь? Я тут затрудняюсь что-либо возразить. Да хер с ним. Промолчу. Вам виднее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 2 ноября, 2023 Опубликовано 2 ноября, 2023 (изменено) · Жалоба On 11/2/2023 at 7:53 PM, thermit said: x=(x>>16)+(x&65535); при x=65535? Вы чего, издеваетесь? Я тут затрудняюсь что-либо возразить. код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете - я предложил вариант из статьи про оптимизацию но он не подходит напрямую Изменено 2 ноября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба Только что, sasamy сказал: код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете Ну давайте разберем.x=65535. Мы его эндим с 65535. Получаем 65535. И это чудо мы суммируем с 0. Что получится? Я пойду нахрен застрелюсь, если это будет 0. Обещаю. 7 минут назад, sasamy сказал: код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете Самый древний и убогий компилятор парсит эту конструкцию совершенно однозначно. Не надо фантазировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 6 minutes ago, thermit said: Ну давайте разберем.x=65535. Мы его эндим с 65535. Получаем 65535. И это чудо мы суммируем с 0. Что получится? Я пойду нахрен застрелюсь, если это будет 0. Обещаю Никто не спорит, что данное выражение даст 65535. Но нам это не нужно! Нам нужен остаток от деления на 65535. Данное выражение не реализует остаток от деления на 65535. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 1 минуту назад, repstosw сказал: Никто не спорит, что данное выражение даст 65535. Но нам это не нужно! Нам нужен остаток от деления на 65535. Данное выражение не реализует остаток от деления на 65535. Да. Так и есть. Все вычисления только через таблицу. Вы-то что хотите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться