ПредишенСледващото

Проектът всъщност представлява онлайн хранилище на отворен код. Неговото развитие може да бъде поставен тук всички желаещи, както и проекти за достъп са достъпни за всички потребители навсякъде по света.

  • В момента има библиотека, в която много интересни примери с код в различни програмни езици.

Смяна разделение умножение Assembler


Смяна разделение умножение Assembler

Когато пишете в монтажен алгоритми с използване на постоянна разделение, операцията по разделянето може да бъде заменен от операциите умножение. Защо е необходимо? Фактът, че процесорът извършва операция умножение е няколко пъти по-бързо от операция деление. Например, умножение 5-9 процесорни цикли, прекарани (подписан умножение) или 4-8 (неподписана умножение), а необходимостта от разделяне на 22-47 цикъла (подписан дивизия) или 17-41 цикли (неподписан деление). В силно оптимизирани алгоритми, като криптиране, математически изчисления, архивиране на големи обеми от данни, изчисляване на контролни суми и други подобни проблеми, спестяване на всеки процесор часовник може да осигури значително увеличаване на общата скорост на програмата.

Ръчният оптимизация "AMD Athlon процесор x86 код ръководство за оптимизация", като се умножи по въпроса за подмяна на разделението е боядисан в големи подробности. Специфични случаи на разделяне, като например разделяне с мощност от две, описва алгоритъм избор за подписан и неподписан разделяне и кода за изчисляване на помощни стойности за корекция. В допълнение, ръководството описва техники за оптимизация и други математически операции. Дори ако никога няма да се използва в практиката, като се умножи отдела за подмяна, прочетете за други начини за оптимизация ще бъде много полезен.

Първо, помислете за оптимизиране на неподписан разделение число. Има няколко варианта, в зависимост от стойностите на делител. Първи вариант - ако сплитер е в границите от 1 до (231 - 1):

Вид алгоритъм, факторът и отместване коефициент се изчислява на базата на стойността на делителя. Ръководството за тази програма са дадени на изходния код в C. Тя е ясна и лесна за разбиране.

Второ изпълнение неподписан разделяне - когато делител е в границите от 231 до (232 - 1). В този случай, отношението може да отнеме само две стойности - 0 или 1. Съответно, оптимизиран алгоритъм има следната форма:

Ако стойността на предмета на дивидент за по-нататъшни изчисления, този вариант може да се оптимизира малко, се отказва от използването на допълнителни регистри:

Ръчният другото, на това място има печатна грешка. Преговорите за текстови около да се отървем от втория регистър, а след това се разбиват код със същия регистър (страница 117, ако се чудите). Copy-паста не винаги е от полза. Също така в ръководството, се препоръчва да се използва възможността за допълнителен регистър, въпреки че аз лично се направят някои съществена разлика в това не виждам. Същите яйцата, само от едната страна.

Във всеки случай, спомням специални случаи неподписан разделение число. Нула числа не могат да я споделят с опции, така че за оптимизация не може да има никакво съмнение. Когато се раздели с един частен винаги е делим, е, че вие ​​също трябва да се помни, дори и в училище. Разпределение по степен на две в Assembler оптимизират посредством команда малко отклонение в дясно СБР рег, stepen_dvoyki:

По същото правило, по принцип е възможно да се закрепи и разделяне единица защото 20 = 1.

Цяло число подписан разделение малко по-трудно, тъй като при изготвянето на резултатите трябва да се вземе предвид знака на дивидент и делителя. Следващите алгоритми работят само с положителни стойности на разделителя. Ако делител е отрицателен, то се изчислява първи модул, който се използва в по-нататъшните изчисления, и в резултат на разделяне се прилага NEG асемблер команда. Това следва от математическите аксиоми п / -d = - (N / D). делител на число трябва да бъде в диапазона от 2 до (231 - 1).

Както и при неподписан разделение, тип алгоритъм, множител и отместване коефициент се изчислява въз основа на разделителя на стойност, или по-скоро неговите модули. Изходният код в C е в ръководството.

Специфични случаи на разделението число на знака също е различно от неподписан. Ето, например, разделете на две и с мощност от два различни знаци.

Както знаете, всички операции по разделяне оптимизация на предварително известна константа на сцената на писане на програмата, и не се изчисляват динамично по време на работа. В противен случай, какъв вид оптимизация е всичко това? От това следва, че използването на такива алгоритми за честа смяна на разделители не е необходимо.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!