nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

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

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

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

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


Само умножение матриц описывалось здесь, первая реализация на "настоящем" QuatCore здесь.

Приведём код:
		;состояние регистров к этому моменту
		;Y = Points2D
		;X = Fx3
		;Z = Fx2
		;i=j=k=0
		;Inv неизвестен
		;C, Acc - неважно
		Compute4PointAffine	proc
					X		AffineMat
					Z		Matrix ;вообще AfTransf, но это промежуточная матрица, её занесём сюда (пока не наступило сопровождение, эти ячейки напрочь не нужны!)
		;по сути, Z = X * Y, где все операнды - матрицы.
					k		1	;номер строки результата (и строки AffineMat)
			@@k_loop:	j		2	;номер столбца результата (и столбца Points2D)
			@@j_loop:	i		3	;номер столбца AffineMat и строки Points2D
					ZAcc		RoundZero	;обнулить до 1/2 мл. разр
			@@i_loop:	C		[X+4j+i]
					FMA		[Y+2i+k]
					iLOOP		@@i_loop
		;очередной результат готов...
					[Z+2j+k]	Acc
					jLOOP		@@j_loop
					kLOOP		@@k_loop
		;вот, какбе и всё...	
		Compute4PointAffine	endp


Как ни странно, в нём ни одного Hazard'а нет. Между инициализацией i и его использованием мы обнуляем аккумулятор.

12 слов кода, красота. Правда, выполняется он довольно долго. Одних только умножений с накоплением надо 24 штуки, столько же присвоений регистра C, и по крайней мере столько же прыжков, отжирающих по 3 такта (прыгнуть, а потом выкидывать команды из конвейера). 18 тактов на FMA, 1 на C, 3 на прыжки, уже 22, умножить на 24 выходит 528 тактов, и 40 наносекунд на каждый - получаем 21 мкс. Ладно, у нас симуляция до 100 мкс, пока хватит.

Посмотрим, как оно заработает.

Опять Can't find fit, как же он задолбал... В этот раз помогло уменьшение ширины аккумулятора, правда, это может отразиться на точности. Сейчас посмотрим.



Из хорошего: ОНО РАБОТАЕТ. Полное время выполнения (не учитывая "вывода на экран"): 87 мкс.

Из не очень хорошего: с аккумулятором шириной 19 бит вместо 32 бита, наврали знатно. Тут должна была получиться матрица



а получилась:



ошибка до 3 единиц младшего разряда.

И сейчас наконец-то проверил одну свою догадку: когда я в качестве Top Level ставлю QuatCore, прямо в основном своём проекте, у меня оказывается очень много задействованных вводов-выводов: для подключения АЦП, SRAM, UART, SPI на 3 разных устройства, 8 светодиодов, 5 кнопок, RS485 и так далее. А выводы QuatCore: DataBus, DestAddr, SrcAddr, PC синтезатор пытается посадить на НЕЗАДЕЙСТВОВАННЫЕ НОЖКИ, коих уже не так много! И получается довольно основательно зажат.

Попробовал создать новый проект, исключительно для тестирования ядра "в одиночку", где все ножки свободны, окромя clk. И что же - тут же всё отсинтезировалось, прямо при ширине аккумулятора в 32 бита.

Вот другое дело:



Хорошо на свежем воздухе работается! Но пора спать идти :)
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 2 comments