Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
С целью ускорения целочисленной 64-битной арифметики решил попробовать использовать ассемблерную вставку с использованием регистров MMX (которые 64-битные и как нельзя лучше подошли бы для моей задачи). Не знаю, как сделать цикл со счётчиком или условный переход по равенству/неравенству содержимого одного из MMX-регистров 0. Некоторая сложность в том, что счётчик (кол-во повторений цикла) у меня тоже 64-битный. Возможно ли это сделать? Инструкции JZ, JNZ я так понимаю, для MMX-регистров не при делах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 16:20 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Старшие разряды счётчика будут константами много миллионов лет. И зачем оно тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 18:30 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Какие разряды Вы считаете старшими? Мне будут нужны количества повторений цикла, лежащие в диапазоне 33-41 бит. Всё это работает на "чистом" C++ в пределах 1 суток, но хотелось бы быстрее, вот за этим оно и нужно. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 19:45 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
MMX это каменный век, 90-е, сейчас есть AVX-*, наверно надо в эту сторону копать. Как в асме их использовать не знаю, но все компиляторы С/С++ имеют соответствующий ключик для разрешения использования этого набора команд проца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 20:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TMMX это каменный век, 90-е, сейчас есть AVX-*, наверно надо в эту сторону копать. Как в асме их использовать не знаю, но все компиляторы С/С++ имеют соответствующий ключик для разрешения использования этого набора команд проца. Возможно, возможно. Но мне ещё важна совместимость с разными компами, некоторые из них довольно старые, хотя SSE 4 есть уже на всех проверенных. Мне не критично использование именно MMX, а нужна быстрая 64-битная арифметика (сложение-вычитание, сдвиги, and-or-xor). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 21:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Не нужен asm Достаточно воспользоваться intrinsics инструкциями. https://software.intel.com/sites/landingpage/IntrinsicsGuide/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 21:47 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Я правильно понял, что Вы предлагаете не выписывать явно работу с требуемыми регистрами, а довериться компилятору C ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2018, 21:53 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Какие разряды Вы считаете старшими? Мне будут нужны количества повторений цикла, лежащие в диапазоне 33-41 бит. Всё это работает на "чистом" C++ в пределах 1 суток, но хотелось бы быстрее, вот за этим оно и нужно. :) Сделай цикл в цикле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 08:25 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Вряд ли цикл в цикле будет способствовать достижению главной цели (сделать быстрее, чем на C++ с оптимизациями). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 08:41 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Вряд ли цикл в цикле будет способствовать достижению главной цели (сделать быстрее, чем на C++ с оптимизациями). Попробуй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 08:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Вряд ли цикл в цикле будет способствовать достижению главной цели (сделать быстрее, чем на C++ с оптимизациями). если индекс не нужен, то скорее всего быстрее будет раза 1.5-3 если у тебя в задаче нет использования сопроцессора, лучше не лезть в него, особенно при многопоточке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 09:53 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Я правильно понял, что Вы предлагаете не выписывать явно работу с требуемыми регистрами, а довериться компилятору C ? Работа с регистрами - явная, Что касается набора команд - разные версии кода под разные наборы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 10:10 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Толстый длинный регистр нормально сравнивается. Но я-бы делал по возможности 32-разрядные counters а в теле цикла добавлял 41-битные константы если есть такая крайняя необходимость. В конце концов основное мясо цикла приходится на полезную работу а не на проверки счетчиков. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 11:06 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Вряд ли цикл в цикле будет способствовать достижению главной цели (сделать быстрее, чем на C++ с оптимизациями). Не получится. Я пробовал. Как ни выкручивайся, чаще всего руками написанный ассемблерный код получается медленнее, чем сгенерированный GCC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 13:47 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Ага. Или руками написанный LLVM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2018, 14:22 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКак ни выкручивайся, чаще всего руками написанный ассемблерный код получается медленнее, чем сгенерированный GCC. Пока могу лишь подтвердить это. :) Сделал тело цикла в ассемблерной вставке, получается в 1,5 раза дольше. Но работает правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 11:19 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonНо я-бы делал по возможности 32-разрядные counters а в теле цикла добавлял 41-битные константы если есть такая крайняя необходимость. В конце концов основное мясо цикла приходится на полезную работу а не на проверки счетчиков. Количество возможных проходов цикла лежит в диапазоне чисел разрядностью 33-41 бит (это пока). Было бы естественно использовать 64-битный регистр для этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 11:23 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Всё это работает на "чистом" C++ в пределах 1 суток, но хотелось бы быстрее А какова реальная задача? Может быть, есть алгоритмические пути оптимизации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 11:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®maytonНо я-бы делал по возможности 32-разрядные counters а в теле цикла добавлял 41-битные константы если есть такая крайняя необходимость. В конце концов основное мясо цикла приходится на полезную работу а не на проверки счетчиков. Количество возможных проходов цикла лежит в диапазоне чисел разрядностью 33-41 бит (это пока). Было бы естественно использовать 64-битный регистр для этого. Используй. Фрагмент gcc-шного ассемблерного выхода ты видел. Но не забывай что РОН-ы это ценный ресурс. И если ты решил взять 1 регистр и прибить его гвоздями к счетчику циклов то ты лишаешь себя возможности использовать его в других целях. Кстати что у тебя внутри тела цикла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 12:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, Расчетное - в mmx, переменную цикла - в обычный регистр (rcx, например). У меня так некоторые вставки (например - фильтры-свёртки) отлично работают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 13:05 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Количество возможных проходов цикла лежит в диапазоне чисел разрядностью 33-41 бит (это пока). Даже пустой цикл такого размера займёт туеву хучу времени. На фоне полезной нагрузки в его теле расходы на сам цикл обычно ничтожны. Не парься, пиши цикл в С++ с long long счётчиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 13:56 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAR®Количество возможных проходов цикла лежит в диапазоне чисел разрядностью 33-41 бит (это пока). Даже пустой цикл такого размера займёт туеву хучу времени. На фоне полезной нагрузки в его теле расходы на сам цикл обычно ничтожны. Не парься, пиши цикл в С++ с long long счётчиком. Мы занимаемся совершенно ненужным делом. Пытаемся додумать зачем ему (автору) нужен счетчик с 41 битом. Чисто теоретически я могу предположить что у него шаг цикла растет или стартовое выражение уже изначально велико. Вобщем мой вопрос о "реальной задаче" по прежнему актуален. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 14:11 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Зачем нужен MMX регистр в x64? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 14:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Ценное замечание. Я вот с любезного разрешения Intel сделал скриншотик с доки Introduction to x64 Assembly Регистр RAX,RDX который участвовал в loop condition моего тестового примера архитектурно отделен от пачки регистров FPU/MMX. И наверное есть здравый смысл в том что GCC собрал исходник без него. У компиллятора тоже есть свои метрики стоимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 14:58 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНе парься, пиши цикл в С++ с long long счётчиком. Так написан, работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 19:24 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
[quot MBo]AR®Может быть, есть алгоритмические пути оптимизации? Мне они не известны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 19:25 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
ИзопропилЗачем нужен MMX регистр в x64? В x86. Было бы в x64, не было бы разговора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2018, 19:26 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
В общем, вести с полей малоутешительны: "чистый" C++ - 20 секунд тело цикла на асм-вставке - 30 секунд intrinsics-функции - 50 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 12:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Опиши реальную задачу + показывай код ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 13:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®ИзопропилЗачем нужен MMX регистр в x64? В x86. Было бы в x64, не было бы разговора. Исторически первыми появились FPU регистры. А они нужны оуенно. Об этом скажет всякий кто уважает AutoCad. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 13:48 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevОпиши реальную задачу + показывай код ))) Не буду. Задачу должен решить я. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 14:28 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Мне они не известны. Вероятнее всего это из-за узости твоего кругозора. Потому и говорят тебе чтобы опубликовал задачу. У коллективного-то разума кругозор поширше будет. AR®В x86. Было бы в x64, не было бы разговора. А в чём проблема собрать под 64 бита? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 14:42 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА в чём проблема собрать под 64 бита? В имеющихся студии и процессоре в компе. ) Ну и в желании иметь результат, совместимый со старым оборудованием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 14:58 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Leonid KudryavtsevОпиши реальную задачу + показывай код ))) Не буду. Задачу должен решить я. ) Ты хитрый и лукавый. Не будет тебе респекта. Давай сорцы! Ставлю коньяк что тебе ассемблер не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2018, 20:07 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
mayton Ставлю коньяк что тебе ассемблер не нужен. Я таки выписал свой алгоритм на ассемблерной вставке на 32 битах без использования регистров MMX. Результат опять-таки малоутешителен: 37 секунд при прочих равных условиях. Т.е. хуже, чем с MMX и хуже чем то, что сделал компилятор C++. Куда за коньяком-то? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 21:42 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Вообще, насколько можно верить тому .asm, который остаётся рядом с .obj, если в свойствах проекта задать Assembly Output = "Assembly With Source Code (/FAs)"? В смысле верить, что то, что там написано и будет в .exe ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 21:52 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Вообще, насколько можно верить тому .asm, который остаётся рядом с .obj, если в свойствах проекта задать Assembly Output = "Assembly With Source Code (/FAs)"? В смысле верить, что то, что там написано и будет в .exe ? Можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 21:59 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, А пруфы где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 22:06 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, Если компилятор породил код лучше - значит есть к чему стремиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 22:07 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Без сорцов - никакого коньяка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2018, 22:10 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Dimitry SibiryakovА в чём проблема собрать под 64 бита? В имеющихся студии и процессоре в компе. ) Ну и в желании иметь результат, совместимый со старым оборудованием. Однако выше... AR®Но мне ещё важна совместимость с разными компами, некоторые из них довольно старые, хотя SSE 4 есть уже на всех проверенных. Мне не критично использование именно MMX, а нужна быстрая 64-битная арифметика (сложение-вычитание, сдвиги, and-or-xor). Кажется, во всех процессорах, в которых есть SSE4, есть и поддержка 64 бит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2018, 12:07 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
BarloneКажется, во всех процессорах, в которых есть SSE4, есть и поддержка 64 бит.банально 32-битная винда, из-за принтера, например, старого ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2018, 12:23 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
BarloneКажется, во всех процессорах, в которых есть SSE4, есть и поддержка 64 бит. Вот интересно, позволяет ли какая-нибудь студия скомпилировать 32-битное приложение, но в asm-вставках обращаться к регистрам R8-R15 (64-битным )? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2018, 16:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR® Вот интересно, позволяет ли какая-нибудь студия скомпилировать 32-битное приложение, но в asm-вставках обращаться к регистрам R8-R15 (64-битным )? большинство команд к регистрам преобрауется в один и тот же код, что в 32-битном, что 64 битном коде. Например, xor RAX,RAX и xor EAX,EAX даёт один и тот же бинарный код для своей разрядности. Просто в одном случае они интерпретируются как 32-битные, а в другом как 64-битные в 64-битном коде обращение к 32-битным регистрам добавляет префиксы смены разряда перед командой,обратно насколько мне известно такого префикса нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2018, 17:16 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®BarloneКажется, во всех процессорах, в которых есть SSE4, есть и поддержка 64 бит. Вот интересно, позволяет ли какая-нибудь студия скомпилировать 32-битное приложение, но в asm-вставках обращаться к регистрам R8-R15 (64-битным )? Нет. И дело не в студии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2018, 22:45 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
ИзопропилИ дело не в студии 32-битное приложение устанавливает режим процессора, делающий недоступными дополнительные регистры? А вообще склоняюсь к мысли о безнадёжности темы. В Intel'овском "Introduction to x64 Assembly.pdf" сказано "although it is difficult to outperform a good C++ compiler for most programmers". Похоже, MS Visual Studio имеет вполне себе a good C++ compiler. Вчера вечером сделал новую версию с асм-вставкой (без MMX), в которой минимизировал количество JMP'ов всех видов, но результат ещё хуже - 45 секунд вместо 37. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 10:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Похоже, MS Visual Studio имеет вполне себе a good C++ compiler. Интеловский еще лучше, тут замеряли 18108708 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 10:06 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®32-битное приложение устанавливает режим процессора, делающий недоступными дополнительные регистры? да AR®В Intel'овском "Introduction to x64 Assembly.pdf" сказано "although it is difficult to outperform a good C++ compiler for most programmers". AR®Вчера вечером сделал новую версию с асм-вставкой (без MMX), в которой минимизировал количество JMP'ов всех видов, но результат ещё хуже - 45 секунд вместо 37. код покажи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 10:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Кроме кол-ва Jump'ов они должы быть еще и "правильные". Дабы с Intel Pentium существуют достаточно простые правила для оптимизатора переходов. Т.ч. например условный jump с переходом наверх по коду и условный jump с переходом далее по коду - для процессора очень сильно отличаются. AFAIK JMP'ы для современных процессоров уже не проблема. Тут скорее важнее, что бы арифметические операции между собой по операндам были не связаны и пенальти не получать. AFAIK Ну и опять таки, нужно понимать, а под какой конкретно процессор ты собираешься оптимизировать. Первый Pentium от современных - все же очень сильно отличается. IMHO & AFAIK собираешься оптимизировать Intel VTune иметь на компьютере обязательно. А уж дальше, читать про пенальти которые он тебе выдаст. Ну или выучивать пару томов Intel'овской документации с правилами оптимизаци под твой процессор p.s. На первых пентиумах и Pentium II, у меня в коде все время пенальти по частичному обращению к памяти лезли /обращение к байту, когда до этого по адресу записывали слово/. Банальный цикл преобразующий RGB <--> RGBA работал медленнее, чем декомпрессия JPEG'а ))) из оптимизированной Intel'ом библиотеки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 11:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Разоблачение чёрной магии. Не спрашивайте про постановку задачи целиком. Она большая и скучная. Важна суть, а не постановка, а она - ниже. Есть функция: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Вот что сделал компилятор: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Контрольный пример: f(4294967337, 8589934591) = 1. Это числа длиной 33 бита. Требуется версия на ассемблере, работающая быстрее, чем скомпилированная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:08 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Кинь тогда хоть какие-то примерные входные данные и что должно получится. На мой взгляд, код вполне можно упростить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:34 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Сорри, сразу не заметил Контрольный пример: f(4294967337, 8589934591) = 1. Это числа длиной 33 бита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, напрашивается декремент b вместо инкремента c ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovAR®, напрашивается декремент b вместо инкремента c Пробовал. А точнее, был декремент c при начальном c = b: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Результат был хуже на ~5%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:45 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНа мой взгляд, код вполне можно упростить. Буду благодарен. Но у меня теперь большие сомнения в этом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:48 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
маска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovAR®, напрашивается декремент b вместо инкремента c Пробовал. А точнее, был декремент c при начальном c = b: Результат был хуже на ~5%. нафига тут вообще нужна доп. переменная с? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 15:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovмаска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d I think so + вместо __int64 для цикла, можно использовать два вложенных цикла по __int32. Максимум избавиться от арифметики над __int64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:05 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Я так понимаю это обращение к памяти, если использовать регистр проца, то быстрее должно стать AR® Код: plaintext 1. 2. 3. У меня вот во что откомпилировалось MSVC 2015 Release x64 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Время 9.3 сек. на i7-6700K Если не секрет - в чем суть этого цикла? что он делает? Может алгоритм можно сменить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:11 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovнафига тут вообще нужна доп. переменная с? Для её инкремента от 0 до b, т.к. вариант с декрементом оказался медленнее, хотя и не очень сильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:29 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Leonid KudryavtsevНа мой взгляд, код вполне можно упростить. Буду благодарен. Но у меня теперь большие сомнения в этом. Дай еще каких нибудь циферек для проверки. А то я в циклах запустался ))) твой код 23-24 с., мой вариант 18 сек ассемблер не смотрел. На C давно не программировал (лет 12), т.ч. извеняюсь за говно-код и плохое оформление))) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:30 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovмаска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d Затестил. Втрое медленнее как ни странно Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:31 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev+ вместо __int64 для цикла, можно использовать два вложенных цикла по __int32. Максимум избавиться от арифметики над __int64 Мы избавлены от неё 32-битным компилятором. Напомню, что всё делается на 32-битном компе. И два 32-битных счётчика нам организовал сам компилятор. В случае инкремента так: Код: plaintext 1. 2. А в случае декремента так: Код: plaintext 1. 2. Последнее оказалось немного медленнее (почему?). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Тут между командами взаимозависимость по регистру флагов. Т.е. теоретически "плохо". Но теоретически, практически там возможны исчезающие доли процентов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:39 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevДай еще каких нибудь циферек для проверки. А то я в циклах запустался ))) f(6777995264, 8589934591) = 1 f(5033164800, 8589934591) = 1 Второе число не трогайте (это маска 33 бита == 1), а первое можете уменьшить-увеличить на 1, функция должна вернуть 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:44 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TЗатестил. Втрое медленнее как ни странно Код: plaintext 1. 2. 3. 4. 5. 6. 7. Это не странно. Первоначальный алгоритм содержал if / else, а затем от них избавились путём подбора масок (000..00 и 111..11), позволяющих всегда делать одинаковые действия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TAleksandr Sharahovмаска e = -(d & 1) может иметь всего два значения (-1 или 0) в зависимости от младшего бита d соответственно e & a может иметь 2 значения (a или 0) в зависимости от младшего бита d поэтому для вычисления этого выражения проще всего использовать условную пересылку после проверки бита d Затестил. Втрое медленнее как ни странно Код: plaintext 1. 2. 3. 4. 5. 6. 7. Ну так компилер не такой же умный, чтоб понять, что о от него требуется надо что-то вроде этого e=0; if (d and 1) e=a; d^=e; или сразу всю функцию на асме с условной пересылкой написать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TУ меня вот во что откомпилировалось Так это всё под x64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:50 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
В продолжение 21476642 добавлю x32 вариант, тут тоже нет обращений к памяти внутри цикла Так компилируется в x32 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 13.7 сек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovНу так компилер не такой же умный, чтоб понять, что от него требуется Мне теперь кажется, что он даже умнее, чем просто чтоб понять, что от него требуется. :) Aleksandr Sharahovсразу всю функцию на асме с условной пересылкой написать Писал (как вставку в C) 3 версии, все работают дольше, чем "компиляторская". :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:54 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovНу так компилер не такой же умный, чтоб понять, что от него требуется Мне теперь кажется, что он даже умнее, чем просто чтоб понять, что от него требуется. :) Aleksandr Sharahovсразу всю функцию на асме с условной пересылкой написать Писал (как вставку в C) 3 версии, все работают дольше, чем "компиляторская". :) с использованием CMOV получилось медленнее? не верю ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 16:59 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovНу так компилер не такой же умный, чтоб понять, что о от него требуется надо что-то вроде этого e=0; if (d and 1) e=a; d^=e; или сразу всю функцию на асме с условной пересылкой написать тоже тормоз Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:01 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TВ продолжение 21476642 добавлю x32 вариант, тут тоже нет обращений к памяти внутри цикла Так компилируется в x32 Очень интересно. Особенно, в чём глубокий смысл "and edx, 29h "? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TAleksandr SharahovНу так компилер не такой же умный, чтоб понять, что о от него требуется надо что-то вроде этого e=0; if (d and 1) e=a; d^=e; или сразу всю функцию на асме с условной пересылкой написать тоже тормоз Код: plaintext 1. 2. 3. 4. Интересно, а if(d & 1) e = a; компилируется с переходом или с CMOV'ом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:05 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima Tтоже тормоз Код: plaintext 1. 2. 3. 4. Не мучайтесь. :) Разные варианты этого алгоритма с ветвлениями были испытаны, и все были в 2-3 раза медленнее. Причём это верно и для чисел до 32 бит (когда всё без __int64). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:09 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Dima Tтоже тормоз Код: plaintext 1. 2. 3. 4. Не мучайтесь. :) Разные варианты этого алгоритма с ветвлениями были испытаны, и все были в 2-3 раза медленнее. Причём это верно и для чисел до 32 бит (когда всё без __int64). тут нет ветвления, если у компилятора есть AI ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:16 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov..... с использованием CMOV получилось медленнее? не верю ) А я такую полезную инструкцию даже и не помнил ))) Хорошая же идея. После сдвига в >> в регистре флагов окажется младший бит. Т.ч. можно & на ассемблере и не делать. Но все равно. код можно сделать компактным, но скорости не добавит. Все шаги завязанны на переменную d, спекулятивное вычисление фиг получишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:18 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevAleksandr Sharahov..... с использованием CMOV получилось медленнее? не верю ) А я такую полезную инструкцию даже и не помнил ))) Просветите меня тёмного, CMOV - это что-то только для x64? Или и для x86 она есть? MS VS C++ её знает? Что она делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:25 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Leonid Kudryavtsevпропущено... А я такую полезную инструкцию даже и не помнил ))) Просветите меня тёмного, CMOV - это что-то только для x64? Или и для x86 она есть? MS VS C++ её знает? Что она делает? есть везде, если комп не ископаемый, ассемблер точно знает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 17:34 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
IMHO Т.к. от длинного счетчика цикла вполне можно уйти. Скорее всего, от MMX выйгрышь будет. Избавление от ненужных __int64 дало +25% ( 24 сек -> 18 сек), наверное и MMX даст примерно столько же. Но дальше - уже чисто тактовая частота процессора. Тут оптимизировать особо нечего, одно число (d) в цикле крутится. Т.ч. все конвееры современных процессоров идут лесом. Тут только в математику вдумываться. Т.к. мне кажется, что близкие циклы зависят только от младших битов A. Т.ч., мне кажется, вполне можно за одну операцию обрабатывать сразу несколько битов в D. "Перепрыгивая" циклы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 18:22 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Dima TВ продолжение 21476642 добавлю x32 вариант, тут тоже нет обращений к памяти внутри цикла Так компилируется в x32 Очень интересно. Особенно, в чём глубокий смысл "and edx, 29h "? Похоже компилятор перестарался 4294967337 = 0x00000001000000 29 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 18:27 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
чуть больше 9 сек на i5-2300, не отлаживал, параметры передаются по адресу Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 18:44 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
увидел опечатку, наверно теперь пострадает скорость ) sbb ecx, 0 заменить на sbb ecx, ecx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 18:50 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov shrd esi, edi, 1 sbb ecx, 0 Красиво. А я даже не знал, что в Intel есть инструкции с двойной точностью ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 18:57 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov Код: pascal 1. 2. 3. 4. 5. 6. Это проверка на выход из цикла. А где сам декримент переменной цикла? Или я совсем ослеп ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 19:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevAleksandr Sharahov Код: pascal 1. 2. 3. 4. 5. 6. Это проверка на выход из цикла. А где сам декримент переменной цикла? Или я совсем ослеп ((( Действительно, забыл, исправленный вариант с новыми ошибками (менее 13 сек на i7-7700) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 20:44 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, Пробовал развернуть цикл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 20:52 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Исправил неточность с выходом из цикла, даже не надеюсь, что багов не осталось Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 20:58 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Финальное исправление все 3x3 контрольных примера проходят Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 21:14 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonAR®, Пробовал развернуть цикл? В каком смысле развернуть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 21:32 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevAleksandr Sharahov shrd esi, edi, 1 sbb ecx, 0 Красиво. А я даже не знал, что в Intel есть инструкции с двойной точностью ((( Только она не совсем двойной точности. Она двигает первый операнд, а второй использует только чтобы взять из него замещающие биты биты, а сам он остаётся не сдвигается. Просветите пожалуйста: CMOV меняет состояние флага CF ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 21:40 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®maytonAR®, Пробовал развернуть цикл? В каком смысле развернуть? Ну... обычно если число итераций заранее известно то делают копи-пасту тела цикла. Выглядит по индусски... Но работает для highload. У тебя второй аргумент - всегда константа? На этом можно сыграть. Твой код похож на криптографию. Есть раунд. Внутри некая последовательность операций над ключом. Только крипто-раунд возвращает шифро-блок. А ты возвращаешь какой-то булевый признак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 21:53 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Просветите пожалуйста: CMOV меняет состояние флага CF ? не меняет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 21:57 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonAR®пропущено... В каком смысле развернуть? Ну... обычно если число итераций заранее известно то делают копи-пасту тела цикла. Выглядит по индусски... Но работает для highload. У тебя второй аргумент - всегда константа? На этом можно сыграть. Твой код похож на криптографию. Есть раунд. Внутри некая последовательность операций над ключом. Только крипто-раунд возвращает шифро-блок. А ты возвращаешь какой-то булевый признак. Ну, не очень-то и по идусски. В данном случае даже один лишний переход будет иметь большое значение, т.к. их тут немалая концентрация. В общем, обязательно стоит попробовать. ща только сериальчик досмотрю ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 22:17 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonAR®пропущено... В каком смысле развернуть? ... обычно если число итераций заранее известно... У тебя второй аргумент - всегда константа? Второй аргумент - максимальное возможное число проходов цикла, а фактическое число проходов заранее неизвестно. Для тех значений первого аргумента, для которых f() = 0, оно может быть и очень небольшим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 22:19 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, Постановка задачи неверная. Нужно внешний цикл вызова твоей f параллелить. Причем параллелить с SSE. В лоб при таких условиях хороший компилятор не обогнать никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 22:25 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Siemargl, насколько я понял автор ведет борьбу на ниве 32х битных легаси машин с ММХ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 22:29 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
SiemarglAR®, Постановка задачи неверная. Нужно внешний цикл вызова твоей f параллелить. Причем параллелить с SSE. В лоб при таких условиях хороший компилятор не обогнать никак. Дык обогнал уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 22:30 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Тут цена вопроса какая? Можно сделать мемоизацию. Сделаем табличку на 2^33 bits = 2^(33-3) bytes. Для аргумента а. Аргумент b y нас константа. Его можно хардкодить. И заполним табличку расчитанными значениями функции f(a,b)==f'(a). Редукция подразумевается. Аргумент b уже учтен в новой функции b' На расчет таблички уйдет много времени. Но это можно делать постепенно. И сохранять результат на диск. Вобщем насколько далеко готов автор зайти в попытке ускорить эту функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 22:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
mayton, надежды не оправдались: проверил развертывание цикла в 2 раза - ускорение ~ 0.6% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 23:01 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonSiemargl, насколько я понял автор ведет борьбу на ниве 32х битных легаси машин с ММХ.про ммх пора забыть, sse2 существенно быстрее и есть ну очень давно (лет этак 11c 2001г) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 23:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovmayton, надежды не оправдались: проверил развертывание цикла в 2 раза - ускорение ~ 0.6% Мда.. тут не те условия. В исходниках крипто-алгоритмов я часто видел такой хардкод Код: plaintext 1. А в основном коде шла копи-паста эдак штук 16 или 32 раза ROUND_ENC(...). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 23:07 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Перестановка операторов дает небольшой прирост скорости (итого 12.64 сек на i7-7700) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 23:08 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Небольшой флешбек. AR®Не спрашивайте про постановку задачи целиком. Она большая и скучная. Важна суть, а не постановка, а она - ниже. Знаешь ты всё таки заслужил коньяк. И хотя ты, хитрый лис не показал мне оригинальную полный стек (а я всегда смотрел в суть вызова. Кто ? Зачем? Как часто? Какие цели .... и я всегда нудный и дотошный в постановках и пытаюсь убедить бизнес-аналитика что тот не прав... и этот велосипед на костылях нелетает просто по причине само-противоречий в ТЗ) я согласен тебе его отправить. Скажи куда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 23:15 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Еще немного ускорил (итого 10.14 сек на i7-7700) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2018, 23:37 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
mayton, занафига все это, если есть теория ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 00:14 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Какая теория? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 00:16 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
mayton, о которой молчит автор-партизан ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 00:21 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Хм.. да. Видимо топик живет своей жизнью. Отдельно от автора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 00:26 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Наверное крякает что-то. Стесняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 00:28 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Еще ускорил - отнес сравнения подальше от вычислений (итого 9.75 сек на i7-7700) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 01:36 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
это уже за рамками добра и зла: Код: plaintext 1. 2. 3. 4. 5. 6. резулт: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 08:48 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)это уже за рамками добра и зла Нормально все. Ты же r нигде не используешь, вот компилятор его и выкинул. Добавь printf(r) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 08:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima T, вот полный код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 08:55 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)вот полный код: Т.е. получается компилятор сам посчитал f(4294967337, 8589934591) ? Однако слишком вумный Долго компилировал? И что за компилятор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 08:59 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima T, студия 15-я да ничего он не посчитал, просто вызов GetTickCount всего 1 сделал (см листинг) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:00 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima T, вернее он местами поменял вызовы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Dima T, студия 15-я да ничего он не посчитал, просто вызов GetTickCount всего 1 сделал (см листинг) Он расчет тебе в printf() заинлайнил, т.е. так получилось Код: plaintext 1. Веселый замер времени получился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima T, нет Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. видишь, вызов GetTickCount идёт раньше чем вызов f ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:13 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)видишь, вызов GetTickCount идёт раньше чем вызов f Я про это и писал: как понимаю компилятор посчитал что эти вызовы никак не связаны меж собой поэтому соптимизировал: выкинул r и воткнул вызов f в printf(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:18 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
ы [SRC с++]f(unsigned long long, unsigned long long): vmovdqa xmm0, XMMWORD PTR .LC0 push ebx vmovq xmm3, QWORD PTR [esp+8] vmovq xmm2, QWORD PTR [esp+16] vmovd eax, xmm0 vpextrd edx, xmm0, 1 .L2: vmovdqa xmm1, XMMWORD PTR .LC0 mov ecx, eax mov ebx, edx shrd ecx, edx, 1 sar ebx vpand xmm0, xmm0, xmm1 vpxor xmm1, xmm1, xmm1 vpsubq xmm0, xmm1, xmm0 vpand xmm1, xmm0, xmm3 vmovd xmm0, ecx vpinsrd xmm0, xmm0, ebx, 1 vpxor xmm0, xmm1, xmm0 vpcmpeqd xmm1, xmm1, xmm1 vpaddq xmm2, xmm2, xmm1 vpunpcklqdq xmm2, xmm2, xmm2 vmovd eax, xmm0 vpextrd edx, xmm0, 1 vmovdqa xmm1, XMMWORD PTR .LC0 vpxor xmm1, xmm0, xmm1 vpunpcklqdq xmm1, xmm1, xmm1 vptest xmm1, xmm1 sete cl vptest xmm2, xmm2 sete bl test cl, cl jne .L4 test bl, bl je .L2 .L4: and ecx, ebx pop ebx movzx eax, cl ret[/SRC] это для Sandy Bridge (2011) и новее https://godbolt.org/g/yzz7VJ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:18 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima T, он функции переставляет потому что f ни на что не ссылается, добавил GetTickCount в f и перестановки уже нет Код: plaintext 1. 2. 3. 4. 5. Time = 14673 как-то дофига блин ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:18 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovзанафига все это, если есть теория ) Теорий много. Все теории стоят одна другой ©. )) Спасибо за примеры кода. Будет времечко, изучу. Пара заметок: 1) корректно приводить время работы не просто для модели процессора, но с указанием его тактовой частоты 2) по ходу экспериментов я наступал как на "ложное срабатывание", так и на "ложное несрабатывание" своих асм-версий функции. Поэтому вот более серьёзный тест: все числа от 4294967297 до 4294967550 в качестве 1-го аргумента функции, второй аргумент прежний - 8589934591. Весь цикл (254 шага) не займёт больше 20 минут. Должно быть ровно 20 случаев f()==1. Если не 20, то в алгоритме ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:21 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
если обратить внимание - то заинлайненный код вызова с параметрами-константами отличается от абстрактной функции. наверно, при этих значениях, что то упростилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:21 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Siemarglесли обратить внимание - то заинлайненный код вызова с параметрами-константами отличается от абстрактной функции. наверно, при этих значениях, что то упростилось просто расчет пошел для int32_t - константы влезли в 32бита ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:23 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)Time = 14673 как-то дофига блин там 8589934591 итераций цикла. Еще там другой прикол компилятора есть в x32: нельзя писать f(4294967337, 8589934591), он магические числа в код вставляет 21477188 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:25 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr Sharahovзанафига все это, если есть теория ) Теорий много. Все теории стоят одна другой ©. )) Конкретно по тому, что ты делаешь, есть довольно развитая теория. Но ссылок не дам, т.к. "Задачу должен решить ты" (с). AR®Спасибо за примеры кода. Будет времечко, изучу. Что там изучать, просто используй, ибо: a) Delphi+BASM=страшная сила, б) хороший компилятор не заменяет мозг. AR®Пара заметок: 1) корректно приводить время работы не просто для модели процессора, но с указанием его тактовой частоты Начать надо сам знаешь с кого. Частоты легко гуглятся, если чё. AR®2) по ходу экспериментов я наступал как на "ложное срабатывание", так и на "ложное несрабатывание" своих асм-версий функции. Поэтому вот более серьёзный тест: все числа от 4294967297 до 4294967550 в качестве 1-го аргумента функции, второй аргумент прежний - 8589934591. Весь цикл (254 шага) не займёт больше 20 минут. Должно быть ровно 20 случаев f()==1. Если не 20, то в алгоритме ошибка. А вот это проверим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Dima TЕще там другой прикол компилятора есть в x32: нельзя писать f(4294967337, 8589934591), он магические числа в код вставляет Я для теста передаю их как аргументы командной строки консольного приложеньица, зовущего f(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:47 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonНебольшой флешбек. Знаешь ты всё таки заслужил коньяк. Полагаю, что не заслужил. Ибо конкретно у меня пока быстрее C++ не получилось. Работаем... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 09:55 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Как будет угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 10:02 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Поэтому вот более серьёзный тест: все числа от 4294967297 до 4294967550 в качестве 1-го аргумента функции, второй аргумент прежний - 8589934591. Весь цикл (254 шага) не займёт больше 20 минут. Должно быть ровно 20 случаев f()==1. Если не 20, то в алгоритме ошибка. алгоритм 21477774 на i5-2300 проверку прошел, затратив 995.5 сек тест с 4294967297 на i5-2300 проходится за 15.99 сек частота i5-2300 плавает от 2.8 до 3.1, считаем 3.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 10:18 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Версия на С++: на i3-2120 @3.3 ГГц вышеописанный цикл из 254 шагов делается за 800..845 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 10:30 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, значит, считаем 2.8 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 10:57 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
алгоритм 21477774 на i5-3470 (3.2 GHz) проверку прошел, затратив 758.7 сек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 11:34 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Выяснил, что работу существенно тормозят ассемблерные команды сравнения вида cmp ecx, <что-нибудь> если в них стоит регистр не ecx и не edx. Полагаю, бывалым ассемблерщикам эта ситуация ясна, но мне как новичку - нет. Так и должно быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 12:59 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Выяснил, что работу существенно тормозят ассемблерные команды сравнения вида cmp ecx, <что-нибудь> если в них стоит регистр не ecx и не edx. Полагаю, бывалым ассемблерщикам эта ситуация ясна, но мне как новичку - нет. Так и должно быть? так не должно быть, сейчас должно быть пофигу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 13:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
"Команды" нынче вообще НЕ тормозят. Нет такого понятия. Есть конвееры, есть throughtinput, есть latency, есть пенальти (например зависимость от пред. значений, неверное предсказание перехода) Более того, есть даже Zero Time Instruction (или как-то так, т.е. иструкции выполняемые за 0 тактов прямо декодером команд). AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 13:14 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
В каком смысле сейчас? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 13:14 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®В каком смысле сейчас? в смысле на твоем процессоре ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 13:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
В моём процессоре оно, к сожалению, есть. Причём не имеет значения, что будет 2-м аргументом CMP - память, константа, другой регистр. Требовать замены проца? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 13:55 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®В моём процессоре оно, к сожалению, есть. Причём не имеет значения, что будет 2-м аргументом CMP - память, константа, другой регистр. Требовать замены проца? )) ... или попробовать переименовать регистры в программе. Что-то другое влияет и подставляет регистры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:01 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Что же это за процессор такой ? ))) Дело не в регистре, важно что с этим регистром происходило до этого. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:17 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:17 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Если собираетесь разбираться в производительности, ставьте Intel VTune (коммерческая цена от 800$) он Вам и покажет, какие пенальти возникают и пр. А так, это гадание на кофейной гуще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:19 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
SiemarglВремя на прогон от 4294967297 до 4294967550 169сек Это была реклама китайского i7-3770@4GHz И получено 20 раз f()=1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:24 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Коллеги. У меня предложение. Абсолютные цифры в секундах что вы постите - неинформативны для других железяк. Предлагаю взять за 100% первый вариант автора и если вы сделали удачную оптимизацию - укажите секунды и проценты ускорения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:50 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Еще бы хорошо компилятор указывать. У меня QT ((( у него формат inline ассемблера совсем для меня не привычный ((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 14:58 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЕсли собираетесь разбираться в производительности, ставьте Intel VTune (коммерческая цена от 800$) он Вам и покажет, какие пенальти возникают и пр. А так, это гадание на кофейной гуще Лирическое отступление: ваши слова, между прочим, неплохо иллюстрируют суть англосаксонской цивилизации: вещью владеешь, но полноценно воспользоваться ей просто так не сможешь, а только заплатив дополнительно. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 15:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЕсли собираетесь разбираться в производительности, ставьте Intel VTune (коммерческая цена от 800$) он Вам и покажет, какие пенальти возникают и пр. А так, это гадание на кофейной гуще Это подлинная магия, тасование инструкции ассемблера круче гадания на картах ) maytonКоллеги. У меня предложение. Абсолютные цифры в секундах что вы постите - неинформативны для других железяк. Предлагаю взять за 100% первый вариант автора и если вы сделали удачную оптимизацию - укажите секунды и проценты ускорения. А нету как такового вариант автора. Предлагаю автору запостить *полный* *ассемблерный* листинг тестируемой функции. Я пока остановился на таком варианте 1) 14.617 сек (i5-2300@2.8) 11.809 сек (i5-3470@3.2) 20) 910.780 сек (i5-2300@2.8) 727.574 сек (i5-3470@3.2) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 15:15 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevДело не в регистре, важно что с этим регистром происходило до этого. Вы оказались абсолютно правы. Поигрался с "кадровыми перестановками" и выяснил: "долго" сравниваются cmp регистры, участвовавшие в shrd и shr, а "быстро" - участвовавшие только в add / adc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 15:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovА нету как такового вариант автора. Есть вариант С++ без ассемблера на i3-2120 @3.3 ГГц. Одиночный вызов f(4294967337, 8589934591) - 19..20 секунд. Вышеописанный цикл из 254 шагов - 800..845 секунд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 15:47 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovА нету как такового вариант автора. Есть вариант С++ без ассемблера на i3-2120 @3.3 ГГц. Одиночный вызов f(4294967337, 8589934591) - 19..20 секунд. Вышеописанный цикл из 254 шагов - 800..845 секунд. хотелось бы наконец увидеть ассемблерный листинг этого варианта С++ без ассемблера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 16:37 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®SiemarglВремя на прогон от 4294967297 до 4294967550 169сек Это была реклама китайского i7-3770@4GHz И получено 20 раз f()=1 ?да. и тесты с примерами ранее тоже прошли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 16:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Так был же: 21476315 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 16:57 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, если нетрудно, чтобы просто скопипастиь *всю* функцию от пушей до попов с ретами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 17:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovAR®пропущено... Есть вариант С++ без ассемблера на i3-2120 @3.3 ГГц. Одиночный вызов f(4294967337, 8589934591) - 19..20 секунд. Вышеописанный цикл из 254 шагов - 800..845 секунд. хотелось бы наконец увидеть ассемблерный листинг этого варианта С++ без ассемблера Я тоже голосую за C++. Ассемблер заводит нас в дебри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 17:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Так был же: 21476315 Ну ок. Давайте все брать его за эталон сравнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 17:36 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonAleksandr Sharahov хотелось бы наконец увидеть ассемблерный листинг этого варианта С++ без ассемблера Я тоже голосую за C++. Ассемблер заводит нас в дебри. Никто и не против C++. Просто покажите ассемблерный код функции. А в Африку гулять пойдут только желающие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 18:52 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, это что, часть функции вычисления дискретного логарифма? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 19:40 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)AR®, это что, часть функции вычисления дискретного логарифма? Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 21:19 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovА в Африку гулять пойдут только желающие. Тут надо бы решить, стоит ли туда, так сказать, идти. ) Пока я всё больше склоняюсь к мысли, что не стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 21:22 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovAR®, если нетрудно, чтобы просто скопипастиь *всю* функцию от пушей до попов с ретами Завтра постараюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 21:23 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
SiemarglAR®пропущено... И получено 20 раз f()=1 ?да. и тесты с примерами ранее тоже прошли. >mmx64ompivy ....................result == 1 counter is 20 Time = 627404437 - 627586359 Time = 181922 каждая точка это единичка. добавил счетчик и синхронных вывод - результат чуть ухудшился ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2018, 22:29 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Вы тут ассемблером балуетесь... А компилятор например не забывает перед началом цикла воткнуть .align 16 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 07:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
результат компиляции clang (в AT&T формате): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Ну или так (дисассемблер в intel формат, с ручной вставкой .align вместо nop) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 07:56 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
BarloneВы тут ассемблером балуетесь... А компилятор например не забывает перед началом цикла воткнуть .align 16 оно вроде как на современных процах не имеет значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 08:10 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)BarloneВы тут ассемблером балуетесь... А компилятор например не забывает перед началом цикла воткнуть .align 16 оно вроде как на современных процах не имеет значенияАвтору же надо на старых процессорах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 08:26 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
обещанный полный код f() от MS VC++ на аcсемблере Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 10:02 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Моя последняя ассемблерная версия. Увы, 44 секунды (( [SPOILER версия с ассемблерной вставкой] Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. [/SPOILER ] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 10:53 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Barlone, AR®, спасибо за код. На первый взгляд везде примерно одно и то же, оптимизировать практически нечего. Дальше можно пойти по пути использования свойств алгоритма, например, учитывать четность параметра и/или 33-битность, если, конечно, автор не заинтересован в реализации тупого перебора ) Кода уже понаписано немало, самое время прояснить цель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 11:00 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Самое интересное: если убрать в моей версии блок проверки d == 1, работает 13-14 секунд. Именно эти проверки ломают intel'овский конвейер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 11:02 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Все ручные оптимизации - бесполезная трата времени. Один исходник на чистом С, разные компиляторы: msvc, 32bit - 41 sec clang, 32bit - 18 sec gcc, 64bit - 9.5 sec ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 13:08 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
еще msvc 64bit - 18sec gcc 32bit -27sec ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 13:15 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
КМК этот алгоритм балансирует на грани алгоритмизации и практики использования железа. Алгоритмически например первый шаг расчета e=-(d & 1) определяет битовую маску. Которая влияет на ход вычисления всего кода дальше. В некоторых высокоуровневых ЯП можно было-бы поставить if который при прочих генерализовнных условиях мог-бы повлиять на сложность алгоритма. Типа раньше выйти из цикла. Или что-то в этом роде. Но помня о штрафных санкциях за неверный переход тут надо подумать. Для ассемблера возможно оно и лучше оперировать флажками но сохранять непрерывный поток команд без веток. Тоесть это тот случай когда алгоритмист-теоретик проиграет практикующему ассебмлерщику. Тот-же 33й бит как-то связывает руки. Так можно было-бы попробовать развернуть 2 раунда вычислений в 1 спаренный на ММХ 2 по 32. Вобщем злая постановка. Напоминает язык Malbolge, который создан чтобы поиздеваться над мозгом. Или потренировать смекалку. Впрочем без особой практической пользы для отрасли. Чисто организационно я-бы развернул для себя do{}while в for{}. Просто так привычнее. Только надо учеть 1 безусловную итерацию перед входом в цикл. Но возможно для ассемблера с его пост-условными переходами назад этот подход чуть-чуть отдаляет оригинальный код С++ от результирующего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 13:21 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
maytonАлгоритмически например первый шаг расчета e=-(d & 1) определяет битовую маску. Заметьте, в моей последней асм-версии я от него избавился. maytonТот-же 33й бит как-то связывает руки. Увы. Для 32 бит всё уже успешно проделано. И 33-й - это только начало и почва для отладки. Нет ли идей, что у меня ломает конвейер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 13:40 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Barlone, clang понравился: -без фрейма, -догадался насчет декремента, -заменил работу с маской -1 на условную пересылку, -все сравнения or-ами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 14:14 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®...И 33-й - это только начало и почва для отладки... Т.е. процедура должна работать и на 34 бита? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 14:17 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 14:43 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovТ.е. процедура должна работать и на 34 бита? И на 34, и на 35..64. 32-битная версия удовлетворительно работала на C#. Переход к 64-битной арифметике вынудил вспомнить про C и написание dll. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 14:58 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)AR®, как то жёстко 21481207 , на i7 42 секунды по сравнению с 14.8 на плюсах Закомментируйте часть с метки test_d: до метки test_c:, на Вашем i7 будет секунд 10-12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 15:00 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, попробуй вот этот вариант как Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 18:40 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)AR®, попробуй вот этот вариант Попробовал, но только, к сожалению, на другом компе: С++ - 30 сек., мой асм - 80 сек., Ваш - 53 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2018, 19:51 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, нет в мире таких крепостей, которые не взять за 529 секунд на i7-7700, используя Delphi+BASM Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 00:43 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
чего то пока далековато до моих 160-180с, которые достигаются одной строчкой =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 02:31 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
то ли еще будет ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 07:26 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Сравнение состояния по частям дает 470.5 sec на i7-7700 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 10:42 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
529 с, 160-180 с - в обоих случаях речь идёт про тест, где 254 числа и из них 20 f()==1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 10:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovто ли еще будет ) А Делфи позволяют посмотреть, во что ассемблерное превратил компилятор ассемблер в исходнике? В MS VC бывают незначительные отличия типа je вместо jz и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 11:49 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®je вместо jz Это разные мнемоники одной и той же машиной команды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 12:06 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®529 с, 160-180 с - в обоих случаях речь идёт про тест, где 254 числа и из них 20 f()==1 ? У меня все по-честному, без параллелей. Кстати простыню можно немного сократить. И второй цикл лучше выравнивать, если компилятор позволяет, - будет еще быстрее (477 сек). Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 12:38 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, опечатка: не 477, а 447 сек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 12:46 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov Хотел потестить Ваши примеры, но, похоже, в C++ нельзя использовать ebp для собственных нужд. Компилируется с warning'ами, а при запуске падает на первом mov ebp. Есть более фундаментальный вопрос: откуда уверенность, что initial state обязательно повторится? У Вас его повторение является единственным условием выхода из цикла, а в исходном алгоритме ещё и достижение предела счётчиком цикла. Возможно, повторение initial state неизбежно, но я не знаю, так ли это. Вы, возможно знаете теорию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 19:45 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Хотел потестить Ваши примеры, но, похоже, в C++ нельзя использовать ebp для собственных нужд. Компилируется с warning'ами, а при запуске падает на первом mov ebp. В последних функциях регистр edi не используется. Замените. AR®Есть более фундаментальный вопрос: откуда уверенность, что initial state обязательно повторится? У Вас его повторение является единственным условием выхода из цикла, а в исходном алгоритме ещё и достижение предела счётчиком цикла. Возможно, повторение initial state неизбежно, но я не знаю, так ли это. Вы, возможно знаете теорию. Вы бы не задавали этот вопрос, если бы грызли гранит до основания, а не чисто периодически ) Но, как мы помним, эту "Задачу должен решить я" (с). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 20:42 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Увы. Для 32 бит всё уже успешно проделано. И 33-й - это только начало и почва для отладки. Нет ли идей, что у меня ломает конвейер? Идей нет. Конвейер команд ломают условные переходы. Но в нашем случае 99% переходов - назад. Как определить состояние конвейера в нашем случае - ХЗ. У меня нет мыслей. Самое правильное - это воспользоваться утилитой тонкого тюнинга Intel Vtune и посмотреть ее отчоты. Я по ссылкам от этого топика пошёл читать про PAPI. Не думаю что выйду с предложением. Тут Шарахов тебе хорошо помогает. А я уже свои мысли сказал. Если-б я делал эту функцию - то использовал-бы мемоизацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 20:52 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovВы бы не задавали этот вопрос, если бы грызли гранит до основания, а не чисто периодически ) Э-э, я-то делаю это скорее даже а периодически. )) Aleksandr SharahovНо, как мы помним, эту "Задачу должен решить я" (с). И решу, не сумневайтесь. ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 21:14 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovВы бы не задавали этот вопрос, если бы грызли гранит до основания, а не чисто периодически ) Э-э, я-то делаю это скорее даже а периодически. )) Главное, все читать внимательно, чтоб случайно не пропустить идею какую или подсказку ) AR®Aleksandr SharahovНо, как мы помним, эту "Задачу должен решить я" (с). И решу, не сумневайтесь. ) Подкину еще дровишек (191 сек на i7-7700). Решать - не перерешать ) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. Написано неоптимально, просто демонстрация идеи. Алгоритм каждой из процедур можно улучшить + использовать ассемблер. Еще больше оптимизаций можно подсмотреть здесь: http://guildalfa.ru/alsha/node/2 http://guildalfa.ru/alsha/node/4 http://guildalfa.ru/alsha/node/10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 22:37 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr Sharahov Хотел потестить Ваши примеры, но, похоже, в C++ нельзя использовать ebp для собственных нужд. Компилируется с warning'ами, а при запуске падает на первом mov ebp. Есть более фундаментальный вопрос: откуда уверенность, что initial state обязательно повторится? У Вас его повторение является единственным условием выхода из цикла, а в исходном алгоритме ещё и достижение предела счётчиком цикла. Возможно, повторение initial state неизбежно, но я не знаю, так ли это. Вы, возможно знаете теорию. если грубо перевести Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 23:34 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, вот только я что-то не вижу где у него счётчик проверяется, вижу что меняется, а что каждый раз проверяется - нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2018, 00:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)AR®, вот только я что-то не вижу где у него счётчик проверяется, вижу что меняется, а что каждый раз проверяется - нет Именно. Не проверяется вовсе. Только 1 раз в конце при принятии решения о возвращаемом значении. Выше было по этому поводу: Aleksandr SharahovAR®Есть более фундаментальный вопрос: откуда уверенность, что initial state обязательно повторится? У Вас его повторение является единственным условием выхода из цикла, а в исходном алгоритме ещё и достижение предела счётчиком цикла. Возможно, повторение initial state неизбежно, но я не знаю, так ли это. Вы, возможно знаете теорию. Вы бы не задавали этот вопрос, если бы грызли гранит до основания, а не чисто периодически ) Но, как мы помним, эту "Задачу должен решить я" (с). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2018, 00:16 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, как движется изучение? Сейчас проверил, таблица на 2K значений, как в статье по CRC32, позволяет прогнать длинный тест менее, чем за 66 сек. Чистый паскаль, без других оптимизаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 01:20 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovAR®, как движется изучение? Без Вашей магии - никуда. )) Подтверждаю пока лишь, что Ваши асм-версии (все) переиграли компилятор C++ на довольно старом компе с VS2008. Примерно 20 сек вместо 30 у C++ . Самые последние - 18-19 сек. Откройте тайну: это достигнуто с использованием хвалёного интеловского тьюнера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 01:45 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr SharahovAR®, как движется изучение? Без Вашей магии - никуда. )) Подтверждаю пока лишь, что Ваши асм-версии (все) переиграли компилятор C++ на довольно старом компе с VS2008. Примерно 20 сек вместо 30 у C++ . Самые последние - 18-19 сек. Откройте тайну: это достигнуто с использованием хвалёного интеловского тьюнера? Без. Хотя этим и заниматься не стоило, не знаю даже, почему задело. Считая биты, очень трудно заметно ускорить функцию. Нужны, как минимум, байты и более широкие типы. Успехов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 02:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovБез. Значит, интуиция и немалый опыт. Aleksandr Sharahov Хотя этим и заниматься не стоило, В моём случае стоило. К масштабной переделке всего и вся я пока не готов морально. ) Прирост в 30-40% меня бы устроил. Aleksandr Sharahov не знаю даже, почему задело. Потому что мой вариант 21481207 , например, с моей точки зрения безупречен (а с Вашей в нём есть лишняя проверка - счётчика цикла, не нужная в теории), но работает почему-то долго. )) Косметика типа замены инкремента на декремент ничего не меняет. Отказаться от использования CMOV ? От SHRD ? В общем, гадание на процессорной гуще, да и только. Ваши же примеры - чёрная асм-магия! ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 10:17 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Прирост в 30-40% меня бы устроил. Только до тех пор, пока вы ограничиваетесь 33 битами. Хотя, думаю, конкретно 33 бита можно ускорить чуть изменив 32-битную функцию. А пойдете дальше - и прирост уже не устроит. В то время как хорошая теория легко дает ускорение на 1.5 порядка. С ассемблером, наверно, можно и чуть больше отжать. А очень хорошая теория может вообще сделать все эти пляски ненужными. В зависимости от решаемой задачи. Так выпьем же за кибернетике! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 10:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovТак выпьем же за кибернетику! И за математику! CMOV - это красивый, но ложный след. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2018, 18:31 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov 21484030 Подкину еще дровишек (191 сек на i7-7700). Решать - не перерешать ) Честно говоря, не понял идею. Ещё не понял в Вашем примере, что означает ca(...) - приведение к типу ca? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 15:48 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Aleksandr Sharahov 21484030 Подкину еще дровишек (191 сек на i7-7700). Решать - не перерешать ) Честно говоря, не понял идею. Идея простая: 1. Вы запрограммировали работу регистра сдвига с линейной обратной связью (LFSR) в конфигурации Галуа. 2. Последовательность состояний LFSR - чисто периодическая с максимальным периодом 2^N-1. Длина периода зависит от значения обратной связи. 3. Ваша функция определяет, дает ли указанная обратная связь максимальный период. 4. Обратная связь на K следующих тактах работы LFSR (у меня K=8) полностью определяется последними К битами текущего состояния LFSR и может быть сохранена в XOR-таблице размером 2^K. Т.о. вместо прогона K тактов LFSR достаточно выполнить XOR элемента таблицы со сдвинутым состоянием. Понятно, что хотелось бы прогонять достаточно большое количество тактов за один вызов процедуры. Понятно также, что в любом случае мы проскочим за повтор начального состояния. 4. Т.к. начальное состояние и непосредственно следующие за ним состояния в точности повторятся после прогона полного периода LFSR, то их можно хранить в RUN-таблице и использовать для определения повтора. AR®Ещё не понял в Вашем примере, что означает ca(...) - приведение к типу ca? ca - это массив переменных типа DWORD, расположенных по указанному адресу (у меня по адресу переменной типа int64). Т.о. ca(@x)[0] - это младшие 32 бита переменной x, а ca(@x)[1] - старшие 32 бита переменной x. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 18:33 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovВы запрограммировали работу... Честно говоря, чувствую себя немного О.Бендером в роли шахматного гроссмейстера (который не знал, что играет вполне известные специалистам партии, и что они даже имеют названия). Независимо от этого, благодарю. Предлагаю участнику mayton отправить ранее обещанный мне коньяк Вам. ) При случае могу быть третьим, но совсем не фанат этого дела. ) Жаль, времени особо нет на эксперименты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 22:03 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
P.S. Ваша асм-версия с "зеркальным" отражением и сдвигом влево через сложение (вместо сдвига вправо) работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 22:06 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Независимо от этого, благодарю. Предлагаю участнику mayton отправить ранее обещанный мне коньяк Вам. ) При случае могу быть третьим, но совсем не фанат этого дела. ) Жаль, времени особо нет на эксперименты. Шарахов - молодец. Но коньяк я ему не отправлю. У меня договорённость была только с вами. А я - чту договорённости. Могу выслать вам а вы уж сами решайте с кем пить и где. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 22:06 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®, mayton, да ладно вам, забудьте ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2018, 23:55 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov1. Вы запрограммировали работу регистра сдвига с линейной обратной связью (LFSR) в конфигурации Галуа. А, ну вот, мне не зря показалось, что где-то я это уже видел. Там же есть известные необходимые условия для максимального периода. Для теста "все числа от ... до ..." можно будет как минимум половину сразу выкинуть (с нечетным числом единичных битов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2018, 09:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Barloneвыкинуть (с нечетным числом единичных битов). Это сделано у меня в основной программе. LFSR, Галуа, Фибоначчи - лишь терминология. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2018, 11:34 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2018, 15:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Barlone теория Ой, как много там теории... ) И автор употребляет какую-то специфичную символику, портящую зрение. Раз уж с подачи Шарахова мы ввели в оборот понятие LFSR, можно для начала прочесть: https://web.archive.org/web/20060315203220/http://www.yikes.com/~ptolemy/lfsr_web/index.htm От себя добавлю лишь, что "Type 1 or External LFSRs" - это конфигурация Фибоначчи, а "Type 2 or Internal LFSRs" - это конфигурация Галуа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2018, 14:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Barlone теория Ой, как много там теории... ) И автор употребляет какую-то специфичную символику, портящую зрение. Раз уж с подачи Шарахова мы ввели в оборот понятие LFSR, можно для начала прочесть: https://web.archive.org/web/20060315203220/http://www.yikes.com/~ptolemy/lfsr_web/index.htm От себя добавлю лишь, что "Type 1 or External LFSRs" - это конфигурация Фибоначчи, а "Type 2 or Internal LFSRs" - это конфигурация Галуа.Ну да, много. Только там помимо теории есть еще программка с исходниками, которая находит неприводимые полиномы за меньше чем одну секунду (и не для 33, а для 62 степени). Aleksandr Sharahov А очень хорошая теория может вообще сделать все эти пляски ненужными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2018, 15:44 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
BarloneТолько там помимо теории есть еще программка с исходниками, которая находит неприводимые полиномы за меньше чем одну секунду (и не для 33, а для 62 степени). Видел. Только она решает немного не мою задачу. Насколько я понял, она ищет "какой-нибудь", т.е. первый подходящий многочлен для заданных степени и модуля. Мне же интересно быстро проверить любую в пределах заданной степени конфигурацию на предмет того, порождает ли такой LFSR m-последовательность. Хотя стоит, безусловно, посмотреть, что и как там сделано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2018, 20:30 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Хотя там и сказано You can also test a given polynomial for primitivity and find all primitive polynomials. , но про время выполнения этой задачи там ничего нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2018, 20:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®Хотя там и сказано You can also test a given polynomial for primitivity and find all primitive polynomials. , но про время выполнения этой задачи там ничего нет.Такое же время - миллисекунды. Там еще можно получить все примитивные полиномы, но вот это уже будет дольше - их же много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 12:28 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
BarloneТакое же время - миллисекунды. Проверяли сами? BarloneТам еще можно получить все примитивные полиномы, но вот это уже будет дольше - их же много. Для 33 бит, по моим скромным познаниям, 211016256. Смущает, что автор программы использует некие готовые таблицы, полученные от кого-то. Я тоже могу взять таблицы всех LFSR'ов (их есть у меня от 3 до 32 бит включительно), и вся работа сведётся к работе с БД. :) Но будет ли это решением задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 12:53 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Уточнение: 211016256 - это по модулю 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 13:35 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
AR®BarloneТакое же время - миллисекунды. Проверяли сами? BarloneТам еще можно получить все примитивные полиномы, но вот это уже будет дольше - их же много. Для 33 бит, по моим скромным познаниям, 211016256. Смущает, что автор программы использует некие готовые таблицы, полученные от кого-то. Я тоже могу взять таблицы всех LFSR'ов (их есть у меня от 3 до 32 бит включительно), и вся работа сведётся к работе с БД. :) Но будет ли это решением задачи?Проверял. И там алгоритм так построен - генерируем полином, проверяем его на примитивность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 13:54 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
А из "готовых таблиц" там только таблицы разложения на множители чисел p^n-1. Для вашего случая p=2 и n<=64 таблица будет совсем маленькой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 14:04 |
|
||
|
Ассемблер - регистры MMX - команды условного перехода.
|
|||
|---|---|---|---|
|
#18+
Barlone там только таблицы разложения на множители чисел p^n-1 Факторизация - не проблема. См. тему Простые числа простыми средствами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2018, 15:14 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1340094]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
221ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 441ms |

| 0 / 0 |
