|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.06.2015, 13:13 | #1 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
процедура Exchange на BASM
Вот оно ДЕТИЩЕ
Код:
|
05.06.2015, 13:13 | #2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Это еще чё. Было вот так
Код:
|
08.09.2015, 15:21 | #3 |
Регистрация: 19.11.2010
Сообщений: 7
|
По хорошему, надо бы ещё EBX в стеке сохранять
|
08.09.2015, 17:10 | #4 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,770
|
Что это за фигня? Почему нет ни одной инструкции XCHG?
|
09.09.2015, 12:10 | #5 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Насколько я понял, если компилятор чтит паскалевские соглашения, то не нужно. EBX не будет после отработки этой подпрограммы использоваться как указатель. На тестах всё было нормально.
Но я могу ошибаться. Я на счет ESI тоже до конца не понял, собственно поэтому и сохраняю его в стек. Обработка предполагалась однопотоковая + вот это: http://www.programmersforum.ru/showthread.php?t=279011 Последний раз редактировалось Sibedir; 09.09.2015 в 12:13. |
09.09.2015, 13:45 | #6 |
Регистрация: 19.11.2010
Сообщений: 7
|
С XCHG значительно медленнее.
Предложу свою модификацию: Код:
2Sibedir Практика показывает, что EBX тоже нужно сохранять. Последний раз редактировалось Dmitro25; 09.09.2015 в 13:51. |
09.09.2015, 14:28 | #7 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Dmitro25, да, есть и такое. Многое зависит от объема перемещаемой партии, частоты вызовов, выравнивания данных, модели процессора и пр.
Я уже 1000 вариантов перепробовал. От простых типа: Код:
Последний монстр отложен на неопределённый срок в виду того, что основная цель (образовательная) достигнута. |
09.09.2015, 15:37 | #8 |
Регистрация: 19.11.2010
Сообщений: 7
|
Sibedir
Свой вариант тестировал только на Core i3 с выравниванием 4 и размером данных от 57 до 64 байт. Наблюдал устойчивый прирост. А так да, в современных процессорах наличие хитрого конвейера и кэша сделало задачу оптимизации весьма нетривиальной. Вот пример: недавно в библиотеке mORMot наткнулся на процедуру вычисления CRC-32, которая на поверку оказалась в 5 (пять!) раз быстрее, чем моя самопальная процедура на ассемблере. Спасибо, что поделились свои кодом, заодно и меня на небольшое творчество сподвигли. Я тут пишу свою реализацию списка, который будет хранить не указатели на записи, а сами записи (по типу TDIVector из DIContainers, только попроще, но и побыстрее). Понадобилось для процедуры сортировки сделать Exchange области памяти, стал искать, через google нашёл ваше решение. |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Почта Exchange | Nemesis9 | Работа с сетью в Delphi | 1 | 18.12.2013 10:54 |
Dynamic Data Exchange | tolikman | Microsoft Office Excel | 2 | 12.08.2011 20:34 |
Странное поведение BASM | Sibedir | Общие вопросы Delphi | 8 | 31.01.2011 12:02 |
Оптимизация sin() на BASM | InternetStranger | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 5 | 11.02.2010 00:56 |