April 16th, 2020

QuatCore

Быстрый QuatCore: вычисление масштаба

По третьему разу пишем этот код: первый раз для ещё несуществующего процессора, второй раз уже для существующего,но медленного, и вот теперь под новый, с конвейером. По логике вещей, достаточно лишь перекомпилить на новом трансляторе, но хочется всё же ещё раз самому посмотреть, может, получится что упростить. Скажем, вернуть пересылки "память-память" :) И переставить местами некоторые команды, чтобы избежать Hazard'ов и NOPов.

Выиграть по числу команд не удалось, но по крайней мере удалось обойтись без NOPов и чуть-чуть ускориться, "развернув" один цикл на 2 итерации :)



Collapse )

Надеюсь, детские болячки худо-бедно вылечили, каждый следующий кусок даётся всё легче. По алгоритму захвата остался заключительный этап, а потом пора будет подключить ввод-вывод - и поиграться на реальном железе.
QuatCore

Быстрый QuatCore: финал аффинного алгоритма

Крен посчитан, масштаб посчитан, осталось за малым - посчитать вектор параллельного переноса. Он же, но в сферических координатах - это дальность и "активные углы", тангаж и курс.

Для этого нужно найти величину, обратную к масштабу (по методу Ньютона), а затем домножить на неё двумерный вектор параллельного переноса, который мы нашли вместе с матрицей 2х2.

Мы это уже делали раз для гипотетического процессора, второй раз (раз, два) - для медленного. Могли бы просто "перекомпилить" под быстрый, но транслятор пока что справляется лишь с задачей выдать КОРРЕКТНЫЙ код, за что ему спасибо. Но самостоятельно оптимизировать его он пока не умеет. Вообще, можно было бы ввести эвристики, когда он обнаруживает команды, которые можно "безболезненно" поменять местами, и если это позволяет избавиться от Hazard - он так и сделает. Но, может, позже. А пока ручками поковыряемся.

Collapse )

Ура, работает. На всё про всё 209 мкс, вместо старых 1,15 мс - улучшение в 5,5 раз. И что самое удивительное, размер программы при этом уменьшили со 182 слов кода до 173.

Отступать некуда - пора повторно подружить QuatCore со своей периферией, а потом подключать камеру :) Собственно, всё ковыряние с ускорением вызвано было нежеланием использовать две тактовые частоты, 25 МГц под видео и 4 МГц для процессора, и нагромождать хитрые цепи синхронизации между двумя (crossing clock domains). Эта эпопея началась 12 марта, чуть больше месяца назад. Конечно, я надеялся, что управлюсь за недельку-другую, но ладно, и так нормально.