- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
#include <inttypes.h>
uint64_t pow_(uint64_t num, uint8_t pow)
{
static const void *array_pow[] = { &&l0, &&l1, &&l2, &&l3, &&l4, &&l5, &&l6,/* ....*/ };
uint64_t ret = 1;
goto *array_pow[pow];
/* ... */
l6: ret *=num;
l5: ret *=num;
l4: ret *=num;
l3: ret *=num;
l2: ret *=num;
l1: ret *=num;
l0:
return ret;
}
Царский анролл возведения в степень через gcc-шные goto. Сам придумал. Но тут еще вот какая западня. Оптимизируется он хреново. Например, если взять возведение в степень 6 http://goo.gl/6SK2et
то можно обойтись 3 инструкциями imul в то время как в хрени с метками их целых 6.
j123123 10.02.2016 12:06 # +3
dxd 10.02.2016 12:11 # +3
myaut 10.02.2016 12:12 # +2
1. Избавиться от "лишней" инструкции перехода (и dec)
2. Избавиться от инструкции перехода, ломающей бранч-предиктор
3. Использовать в разных ветках цикла разные регистры чтобы команды бежали параллельно
goto не позволяет выполнить ни первое ни второе условие :) Да и не думаю, что jmp *rax также хорошо реализован в предсказателях
А общая переменная ret ломает третье (хотя его, наверное, можно как-то соблюсти).
j123123 10.02.2016 12:34 # +1
Всего 4 штуки.
Dummy00001 10.02.2016 17:19 # +4
j123123 10.02.2016 20:34 # 0
Dummy00001 10.02.2016 20:48 # +2
j123123 10.02.2016 21:12 # 0
Ну не верю я в крутизну компиляторов, глядя на все это безобразие
Dummy00001 10.02.2016 21:51 # +2
Я тебе попытался объяснить что на IAR своя конвенция, и трахания с байт-свопом можно просто полностью обойти. Во-первых. Во-вторых, сила компилера не в том как он отдельно-стоящую функцию оптимизирует - а как он целую программу оптимизирует.
Propovednik_01 10.02.2016 22:09 # −7
Это грех перед лицом б-га. Покайтесь, пока-а-айтесь, греховодники!..
j123123 10.02.2016 21:24 # +1
То, что коммерческие компиляторы однозначно всегда круче опенсорсных - миф. Да, наверняка есть какие-то там коммерческие компиляторы под экзотические платформы, на которых опенсорсных компилей или нет вообще, или они там плохо оптимизируют (например какой-нибудь SDCC), но это просто потому, что никто этими опенсорсными компиляторами под эмбеддед не занимается плотно
bormand 11.02.2016 06:26 # 0
Bobik 10.02.2016 12:33 # +1
j123123 10.02.2016 12:41 # 0
https://web.archive.org/web/20130203094813/http://www.insidepro.com/kk/031/031r.shtml
Оптимизация switch
Балансировка логического древа
Dummy00001 10.02.2016 13:31 # 0
1. зачем лейблы если можно по индексу свитч делать? но это не самое главное.
2. почитай про алгоритмы возведения в степень. проблема не новая. тупое гугление даёт например:
http://stackoverflow.com/questions/101439/the-most-efficient-way-to-implement-an-integer-based-power-function-powint-int
j123123 10.02.2016 13:46 # +1
Именно поэтому я этот говнокод тут разместил
>1. зачем лейблы если можно по индексу свитч делать?
Свич не гарантирует что это будет переведено в нужную форму. Возможно что какой-то комплиятор налепит там кучу cmp je инструкций. Если через метки на лейблы нельзя, можно сделать кучу функций для возведения в степень от 1 до n и сделать массив указателей на функции, потом вызывать их в зависимости от того, в какую степень возводится
>2. почитай про алгоритмы возведения в степень. проблема не новая.
Надо специализированный JIT писать для возведения в степень для бигинтов короче
Dummy00001 10.02.2016 13:51 # 0
> Свич не гарантирует что это будет переведено в нужную форму.
потому что пара тиков для предсказуемого джампа + префетч будут таким большим тормозом по сравнению с умножением... *roll eyes* *premature optimization is root of all evil*
> > 2. почитай про алгоритмы возведения в степень. проблема не новая.
> Надо специализированный JIT писать для возведения в степень для бигинтов короче
зачем тебе вообще возведение в степень надо?
j123123 10.02.2016 20:36 # +1
Ну, может я пишу свою CAS и у меня бигинты и надо чтоб большие степени быстро возводить всякие там
besprincypniycentner 10.02.2016 15:35 # 0
myaut 10.02.2016 16:22 # +3
Поэтому используется GCC-изм, чтобы гарантировать, какой компилер и что будет лепить? :)
j123123 10.02.2016 20:35 # 0
bormand 10.02.2016 17:43 # +5
Dummy00001 10.02.2016 18:19 # +2
http://stackoverflow.com/questions/101439/the-most-efficient-way-to-implement-an-integer-based-power-function-powint-int
- "squaring".
даже компилер ему выше (возведение в константную степень 16) это как бы пытается подсказать.
3_14dar 10.02.2016 19:32 # 0
j123123 10.02.2016 21:40 # 0
bormand 10.02.2016 22:56 # 0
Дык умножение на современных процах и так выполняется примерно как сложение... У аппаратного умножителя, емнип, самый тормоз в том же месте, где и у сумматора - в распространении переноса на всю длину регистра в самом-самом конце.
Вот умножение чисел произвольной размерности - да, серьёзно можно оптимизнуть. Почитай в GMP как они это делают. Там очень нетривиальные алгоритмы, никак не связанные с байтоёбством.
3_14dar 11.02.2016 03:41 # 0
j123123 11.02.2016 04:26 # 0
Но там не рассматривается сценарий, когда мы неким хитрым образом анализируем само число и делаем через JIT некую специализированную функцию, которая потом это все очень быстро умножает через сдвиги какие-нибудь
bormand 11.02.2016 06:33 # 0
Ну а для пачек подряд идущих умножений (возведение в степень) всякие монтгомери есть, которые тоже делают меньше действий. На RSAшных масштабах профит, емнип, тоже есть.
3_14dar 11.02.2016 18:03 # 0
3_14dar 11.02.2016 03:42 # 0
bormand 11.02.2016 17:49 # 0
3_14dar 11.02.2016 18:04 # 0
bormand 11.02.2016 18:15 # 0
Multiplication of large long integers is now much faster thanks to an implementation of Karatsuba multiplication, an algorithm that scales better than the O(n*n) required for the grade-school multiplication algorithm. (Original patch by Christopher A. Craig, and significantly reworked by Tim Peters.)
#define MPD_KARATSUBA_BASECASE 16
bormand 11.02.2016 18:23 # 0
3_14dar 11.02.2016 20:11 # 0
bormand 11.02.2016 21:33 # +2
The version of BigInteger in jdk8 switches between the naive algorithm, The Toom-Cook algorithm, and Karatsuba depending on the size of the input to get excellent performance.
Умножение-в-столбик-бляди соснули?
http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/math/BigInteger.java#l1471
P.S. Ну вот FFT не завезли, но это и понятно, числа по 30000+ бит на практике хуй найдёшь.
bormand 11.02.2016 21:40 # 0
3_14dar 11.02.2016 22:23 # 0
bormand 11.02.2016 22:31 # +1
3_14dar 11.02.2016 22:19 # 0
Получишь конфетку красный богатырь
А вот хер тебе
private static final int KARATSUBA_SQUARE_THRESHOLD = 128;
4 кибилота
Можешь еще тут почитать http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/math/BigInteger.java#l1883
Он когда появился, кстати, неужто в 8? Жавабляди и тут соснули? (я в старой версии изучал)
bormand 11.02.2016 22:30 # 0
3_14dar 11.02.2016 23:40 # 0
Abbath 11.02.2016 22:53 # 0
bormand 11.02.2016 23:00 # 0
Abbath 12.02.2016 22:45 # 0
bormand 13.02.2016 08:52 # 0
3_dar 13.02.2016 14:07 # 0
3_14dar 13.02.2016 21:15 # 0
3_dar 17.02.2016 22:49 # 0
Никогда не слышал о более-менее вменяемых хотябы за N^2
3_dar 17.02.2016 22:55 # 0
И я не думаю, что это будет работать так же быстро, как и умножение.
3_14dar 18.02.2016 02:58 # 0
3_14dar 18.02.2016 02:59 # 0
3_dar 18.02.2016 20:43 # 0
Почитал на русской педии - так и не понял что он дает. Один хер там нужно большое число нужно брать по модулю большого числа (см. return у функции MonPro)
Может ты прояснишь?
bormand 18.02.2016 20:54 # 0
Там, емнип, деление на n совсем читерское получается - сравнение да вычитание.
З.Ы. На русской вики хуйня какая-то вместо статьи. Посмотри английскую, там с примерами и т.п.
kegdan 18.02.2016 21:02 # +1
Так какая-то хуйня вместо русской вики
fixed
bormand 18.02.2016 21:05 # 0
kegdan 18.02.2016 21:59 # 0
Прошло время и мир изменился. Сашка стал Александром Семеновичем, школа сменилась работой, беззаботное детство - ежедневной рутиной. Мороженное незаметно исчезло из его жизни совершенно неожиданно. В студенческие годы его заменило пиво, после - различные суши и роллы. Забылось-то самое ощущение приятной прохлады и сладких липких пальцев
Как-то после работы Александру Семеновичу позвонили. Он снял трубку и услышал голос своей беременной жены
- Саш, купи мороженное.
- Какое опять мороженное?
- Хочется. Пломбира. Шоколадного
- С вафелькой?
- Да, конечно с вафелькой.
- Штукатуркой сверху намазать?
- Дурак ты, Саша. -ответила жена и положила трубку.
По пути домой Александр Семенович заехал в магазин и, подойдя к стойке с мороженным, увидел давно забытое им лакомство. "48 копеек. Шоколадное" - гласила надпись на несколько изменившийся упаковке. В порыве ностальгии он купил сразу все брикеты, коих насчиталось 28 штук.
kegdan 18.02.2016 21:59 # 0
- Я трубую менеджера - сказал он молодой кассирше, которая была так испугана его гневным взглядом, что не смогла ничего возразить.
Менеджер был значительно моложе и гораздо гораздо наглее Александра Семеновича
- Так это не то мороженное. Тут нет надписи "нестле". Это наше, российское. с местного молокозавода.
- А где тогда то само, не российское?
- А нигде. Импортозамещение
Мужчина хотел что то ответить, но замер с открытым ртом. Он поставил пакет на кассу и молча вышел из магазина. впервые за много лет ему стало так обидно, что по щеке покатилась скупая слеза
3_14dar 19.02.2016 01:08 # +1
>Nestle
Толсто же.
3_14dar 19.02.2016 01:06 # 0
fixed #2
3_14dar 19.02.2016 01:06 # 0
Вот оно после каждого умножения и берет модуль. Алгоритм не осилил, и, скорее всего, и не осилю, т.к. уже вышел из среды в которой это изучали.
Касательно нашего обсуждения- какая там сложность?
3_dar 11.02.2016 20:26 # 0
Только хз почему его не юзают в стандартных библиотеках питона и джавы.
3_14dar 11.02.2016 20:48 # 0
bormand 11.02.2016 21:17 # 0
А если найду?
https://github.com/python/cpython/blob/1fe0fd9feb6a4472a9a1b186502eb9c0b2366326/Modules/_decimal/libmpdec/mpdecimal.c#L5484
1024 блока (32000+ бит) получается
3_dar 11.02.2016 21:23 # 0
bormand 11.02.2016 21:35 # +1
j123123 11.02.2016 21:48 # +2
Надо короче компилтайм макросы с гомоиконностью в сях лепить, чтоб можно было писать обычный двоичный поиск, и потом анролить его в нужных местах
nihau 10.02.2016 17:53 # +3
j123123 10.02.2016 21:14 # +2