April 13th, 2020

QuatCore

Сортировка против часовой стрелки на быстром QuatCore

Куй железо, пока горячо! Надо поскорее отладить весь аффинный алгоритм на "разогнанном" QuatCore. Первую часть проверили, заработала (программа и транслятор были не виноваты, это я в сам процессор влез "грязными руками", в одном месте поменял, в другом забыл. Теперь всё нормально). Пора за вторую из 5 браться, за сортировку оставшихся точек, приняв самую отдалённую за начало координат.

Применив очередной финт ушами, удалось не только избежать очередного NOP, но и укоротить программу в этом месте на 2 команды, с 26 до 24 команд (-8%).

Collapse )
QuatCore

Вычисление матрицы аффинного преобр. на быстром QuatCore

Поехали дальше. Точки теперь всегда стоят в правильном порядке, независимо от того, под каким креном и ракурсами мы их увидели. Стоит матрицу 4х2, составленную из этих точек, умножить слева на предварительно посчитанную и уже лежащую в памяти матрицу 3х4 - и мы получим матрицу 3х2, состоящюю из матрицы 2х2 аффинного преобразования и вектора.

Тут всё замечательно: перемалывание чисел, которое за счёт наших команд умножения с накоплением и адресации с 2 масштабированными индексными регистрами выполняется весьма и весьма эффективно и точно.

И похоже, Зоркий Глаз через полгода работы наконец-то сообразил, почему Fitter (Place&Route) работает всё хуже и хуже!

Collapse )

Хорошо на свежем воздухе работается! Но пора спать идти :)
QuatCore

Нахождение крена на быстром QuatCore

У нас есть матрица 2х2 аффинного преобразования. Первым делом нужно "вычленить" из неё крен, а точнее: записать этот крен в форме кватерниона поворота вокруг оси X, а также представить матрицу 2х2, из которой этот крен убран, а остались только масштаб и ракурсы.

Алгоритм описан здесь, его первое "реальное" исполнение на медленном QuatCore - здесь.

Пока изобретал ассемблер и вставлял туда самые странные команды (ABSP1D2 - взять модуль числа, прибавить 1, и поделить на два) - код получался на 48 слов. Когда в итоге эти команды логично "впихнуть" в железо не удалось, код увеличился до 52 слов. А теперь ещё и Hazard'ы появились, которые могут потребовать ещё NOPов повставлять здесь и там. Но и мы немножко поднаторели! И вместо дальнейшего увеличения объёма, удалось его сократить до 47 слов, причём с небольшой дополнительной функциональностью. Раньше эта процедура оставляла "мусор" в компонентах Y,Z кватерниона, и туда надо было заносить нули позже. Теперь у нас формируется корректный кватернион. Без этого и вовсе было бы 45 :)

Collapse )

Продолжение следует...