nabbla (nabbla1) wrote,
nabbla
nabbla1

Испытания новой АЛУ, нахождение вектора

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

;состояние регистров:
;X=AfTransf
;Y=QuatY
;Z=MetricW
;i=k=0
;j=Exp
;Inv=1
;Acc=Scale
;C = 2*Acc (побоч эффект DIV2S)
FindVector	proc	
		k	3
		C	43648	;наше нулевое приближение к обр. величине
@@Newton:	Acc	0		;занести двойку
		UFMS	[SP]	;Acc = 2 - a * x
		MULU	UAC		;Acc = Acc * x = x * (2- a*x), т.е итерация метода Ньютона
		C	UAC
		kLOOP	@@Newton			
	;золотой ключик почти у нас в кармане
	;если на входе было 16384, то правильный результат 65536 не влезет в 16 бит, сократившись до нуля. 
	;это мы должны заметить по переполнению, только вот не соображу, оно должно ПОЯВИТЬСЯ, или исчезнуть?
		Z	Exp	
		JGE	@@SkipOflo
		j++	0 			;раз не вмещается в мантиссу, значит добавим экспоненту, а в мантиссу нужно 32768 теперь.Ща найдём...
		ZAcc	MinusOne 	;вместо бесхозной минус двойки
@@SkipOflo:	[Z+i]	j						
		[Z+1]	UAC
;и ещё осталось найти Ty, Tz
		i	1
		Y	Rx
		X	Ty
@@vector:	MULSU	[Y+i]
		[X+i]	Acc
		iLOOP	@@vector
FindVector	endp


Комментарии здесь безнадёжно устарели!


Регистр Z в начале процедуры вовсе не равен MetricW, такого адреса вообще больше нет, т.к с появлением "таблицы непосредственных значений" нужда хранить два этих числа в памяти отпала. Вместо этого регистр Z указывает на Matrix, это наша самая большая матрица 6х6, представленная в треугольной форме, только пока мы её использовали в качестве временного хранилища.

И побочных эффектов DIV2S больше нет! Когда-то действительно команда DIV2S получилась "случайно" - под неё АЛУ не проектировалось, но оказалось, что она там есть. Только вот управляющий сигнал для регистра C отхватывал слишком много адресов - и по DIV2S значение с шины данных заносилось туда. Потом, когда оказалось, что команда очень даже нужная, декодер чуть подправили - и теперь команда как команда :)

Теперь по исполнению. Метод Ньютона для взятия обратной величины конвейеризуется плохо. Да, один такт выигрываем, когда Acc и UFMS накладываются друг на друга, но потом дожидаемся окончания, чтобы результат ещё раз умножить на предыдущее приближение. А после этого - снова ожидание, чтобы положить результат в регистр C.

Сейчас хотел было перенести эту строку в начало цикла, но передумал: очень уж удобно, чтобы ответ появился именно в регистре C, чтобы потом на него домножить два других значения.

И заодно обнаружил нехорошую ошибку в программе: если наступит этот специально рассмотренный случай, когда мы брали обратную величину от 16384, получили в итоге 65536, но он несколько не влез в наши 16 бит, мы корректно исправляли экспоненту и компоненту X, с 65536/32768 * 29 на 32768/32768 * 210. А вот компоненты Y,Z в результате занулялись, т.к подправить регистр C мы забыли!

Получается как-то так:
FindVector	proc	
		k	3
		C	43648	;наше нулевое приближение к обр. величине
@@Newton:	Acc	0		;занести двойку
		UFMS	[SP]	;Acc = 2 - a * x
		MULU	UAC		;Acc = Acc * x = x * (2- a*x), т.е итерация метода Ньютона
		Y	Rx								
		Z	Exp	
		i	1				
		C	UAC				
		kLOOP	@@Newton			
;золотой ключик почти у нас в кармане
;если на входе было 16384, то правильный результат 65536 не влезет в 16 бит, сократившись до нуля. 
;это мы должны заметить по переполнению, только вот не соображу, оно должно ПОЯВИТЬСЯ, или исчезнуть?
		JGE	@@SkipOflo
		j++	0 			;раз не вмещается в мантиссу, значит добавим экспоненту, а в мантиссу нужно 32768 теперь.Ща найдём...
		C	32768 
@@SkipOflo:	[Z+k]	j						
		[Z+1]	C


;и ещё осталось найти Ty, Tz
@@vector:	MULSU	[Y+i]
		X	Ty						
		[X+i]	Acc
		iLOOP	@@vector
FindVector	endp	


Почему применён именно JGE, чтобы обнаружить "ноль", объяснено здесь.

Как видно, в этом специально рассмотренном случае мы изменяем регистр C, и только его используем дальше в процедуре.

Ну и, традиционно, инициализацию всевозможных регистров мы убрали внутрь циклов, там, где всё равно мы будем ждать завершения работы АЛУ.

Ожидаю здесь экономии в 8 тактов, опять "зависимости" не позволяют АЛУ развернуться как следует.

На старом АЛУ старая программа начинает выполнять эту процедуру на T=198,8 мкс, заканчивает на 208,22 мкс, то есть выполняется за 235 тактов. Результаты работы: Exp = 9, Tx = 0x95E9 = 38377, Ty = 2, Tz = 0xFFE6 = -26.

На новом АЛУ подправленная программа начинает эту процедуру на T=187,84 мкс, заканчивает на 196,96 мкс, то есть выполняется 228 тактов, на 7 меньше. Результаты работы полностью идентичны.


Ура, аффинный алгоритм "отыграли" от начала до конца с новым АЛУ. На этом практически все имеющиеся команды проверили - знаковые, беззнаковые, смешанные, взятие модуля и возведения в квадрат в разных вариантах. Работа ускорилась на 5,4%.

Отступать некуда, надо уже доделывать обнаружение!
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Нахождение двух самых отдалённых точек

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

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Огари разговаривают

    Сегодня по пути на работу встретил огарей прямо в Лосином острове, на берегу Яузы. Эти были на удивление бесстрашны, занимались своими делами, не…

  • Ковыряемся с сантехникой

    Наконец-то закрыл сколько-нибудь пристойно трубы, подводящие к смесителю, в квартире в Москве: А в воскресенье побывал на даче, там очередная…

  • Мартовское велосипедное

    Продолжаю кататься на работу и с работы на велосипеде, а также в РКК Энергию и на дачу. Хотя на две недели случился перерыв, очередная поломка,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments