Size: a a a

Ассемблер

2020 December 21

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
А вообще, сделать бы профилирование.
И посмотреть, где самое узкое место...
Может, на Си стоит сделать сначала?
источник

s

s54816 in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
А вообще, сделать бы профилирование.
И посмотреть, где самое узкое место...
Может, на Си стоит сделать сначала?
Сделать на Си и на этом остановиться.
источник

ST

Saenro T in Ассемблер
Да ну не верю я что алгоритм займет больше 1кб кода, ну может 2кб...
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
А вообще, сделать бы профилирование.
И посмотреть, где самое узкое место...
Может, на Си стоит сделать сначала?
я это с си/с++ и переписываю
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
я это с си/с++ и переписываю
А сишный код вообще по скорости как?
источник

楽園松本 in Ассемблер
s54816
Сделать на Си и на этом остановиться.
:) супер
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
А сишный код вообще по скорости как?
Его вообще спрофилировать-то проще (как минимум под винду), чем асм-код под DOS.
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Я глянул мельком.
Что вижу?

1. Штуки вроде
        fld1
       fxch
       fsubp
можно заменить на
        fld1
       fsubrp
Т.е. убрать лишние шаги.
Посмотреть где ещё что-то подобное делается.

2. Оптимизировать:
macro deg2rad {
       fmul  qword[pi_180]
}
 pi_180        dq 0.01745329251994 ; Pi/180
Мы избавляемся от деления и лишних этапов (3 инструкции превратились в 1).
Соответственно, удаляем все деления, какие только можем, заменяя их умножением на обратную величину.
Видел у тебя там fdiv qword[_0.5], когда можно fmul qword[_2.0] сделать. И не только _0.5, а много таких мест.

3. Далее, переведи сопроцессор в режим работы с числами одинарной точности. Не могу гарантировать, но что-то мне подсказывает, что так будет работать быстрее. Нужно через fldcw загрузить нужный режим. Плюс, замени все числа qword на dword. Зачем тебе такая точность?

4. Вот такие штуки замечены:
        fld     qword[bx+LABITEM.L]
       fadd    qword[bx+LABITEM.L]
Можно же написать без лишнего обращения к памяти:
        fld     qword[bx+LABITEM.L]
       fadd    st0,st0

5. Если не принципиальна поддержка 386 (или что там у тебя), используй fcomi* вместо fcom*, а лучше — вообще SSE.
Если важен 386, то замени sahf + .if CARRY? на test ah,1.

6. Где можно обойтись целочисленной арифметикой, веди расчёт в целых числах (без f-инструкций).

7. Но это всё, мне кажется, даст прирост несущественный :)
Может, 10%, а может 5%, а может 0.5%.

А существенный прирост даст переработка алгоритма.
Что-то мне подсказывает, что 90% (95%) кода можно вообще в топку отправить.
Во-первых, найдя другой метод.
Во-вторых, оптимизировав алгоритм (сначала на бумажке, сократив какие-то множители или т.п.).
В-третьих, вероятно можно циклы сократить как-то. Ну или уменьшить их хотя бы, сделать где-то через один и пр.
В-четвёртых, убрать лишние преобразования туда-сюда (может, можно и без LAB обойтись, а как-то в RGB сделать? Не cпеши говорить "нет", подумай).
понижение точности исказит резкльтаты тестов при сравнения двух lab,там довольно таки огромные величины.

.if carry?
это тоже самое что сразу jnc. ты же предлагаешь test-jcc.

принципиально чтоб в досе работало сразу, предположительно 286/386.
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
А сишный код вообще по скорости как?
а фиг его знает он для винды/линуха наверное писался
источник

楽園松本 in Ассемблер
Всё умножить на 1000 и работать в целочисленной арифметике
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
楽園松本
Всё умножить на 1000 и работать в целочисленной арифметике
разрядов не хватит
источник

楽園松本 in Ассемблер
С этими хвостами после запятой возиться
источник

楽園松本 in Ассемблер
Там 16 цветов, отсекай хвосты
источник

楽園松本 in Ассемблер
Действительно, надо ли тебе переходить в lab?
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Aiwan ╭∩╮ (òÓ,) ╭∩╮bot
понижение точности исказит резкльтаты тестов при сравнения двух lab,там довольно таки огромные величины.

.if carry?
это тоже самое что сразу jnc. ты же предлагаешь test-jcc.

принципиально чтоб в досе работало сразу, предположительно 286/386.
- Насколько огромные? Неужели больше 38 десятичных разрядов?
- sahf медленный, поэтому test лучше юзать, чем sahf.
- SSE можно тоже в ДОСе, но не 286/386, конечно.

Кстати, у тебя переменные выравнены по размеру данных?
Не думаю тоже, что сильно существенно, но хуже точно не будет.
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
- Насколько огромные? Неужели больше 38 десятичных разрядов?
- sahf медленный, поэтому test лучше юзать, чем sahf.
- SSE можно тоже в ДОСе, но не 286/386, конечно.

Кстати, у тебя переменные выравнены по размеру данных?
Не думаю тоже, что сильно существенно, но хуже точно не будет.
_pow25to7     dq 6103515625.0

там где в формуле это учавствует
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Пфф. Ты думаешь это в dd не влезет?
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Ещё, кстати, вот такая идея есть.
Нагенерить таблиц и работать по таблицам.
Весь расчёт в одну таблицу вряд ли ты засунешь, но какие-то отдельные части можно.
И потом оперировать этими частями.
Условно говоря, есть цвет. Ты его преобразовал во что-то, вытащил данные из одной таблицы, второй, третьей. Потом слепил их вместе по формуле — выдал результат. Ну это если получится :)
Таблицы синусов, степеней, преобразования каких-то величин и пр.
источник

A

Aiwan ╭∩╮ (òÓ,) ╭∩╮b... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Ещё, кстати, вот такая идея есть.
Нагенерить таблиц и работать по таблицам.
Весь расчёт в одну таблицу вряд ли ты засунешь, но какие-то отдельные части можно.
И потом оперировать этими частями.
Условно говоря, есть цвет. Ты его преобразовал во что-то, вытащил данные из одной таблицы, второй, третьей. Потом слепил их вместе по формуле — выдал результат. Ну это если получится :)
Таблицы синусов, степеней, преобразования каких-то величин и пр.
а эт уже дркгой алгоритм, трехтоновый дизеринг, его я еще не делал
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
А что, здесь негде таблицы использовать?
источник