Вычисление троичного арктангенса

32-разрядные микроконтроллеры разработки ОАО "НИИЭТ"

Модераторы: pip, _sva_

tnsfloat
Сообщения: 6
Зарегистрирован: 01 авг 2017, 12:08
Предприятие: usptu

год спустя

Сообщение tnsfloat » 20 июл 2018, 17:57

К своему стыду, спустя почти год, я так и не смог достучаться до отладочных регистров микроконтроллера K1921BK01T. Зато удалось запустить арктангенс из троичной библиотеки tssix10digit4k1921 на STM32F4NIH6 из под Keil 5.
Время работы функций замерялось с помощью модуля Data Watchpoint and Trace Unit (DWT), проект прилагается.
Функции стандартной библиотеки atan и atan2 (double версии) исполняются за 5843 и 2968 соответственно. Функции atanf и atan2f (float версии) выполняются за 106 и 137 тактов. Логично предположить, что float версии реализованы аппаратно.
Функция atanTss10Digit из прошлогодней версии библиотеки tssix10digit4k1921 выполнятся за 24980 тактов. Это не приемлемо много, хорошим результатом можно было бы считать 1500-2000 тактов.
Оптимизация производилась за счет сокращения разрядности с 10 трит до 8 (примерная экономия 20%) и замены ветвлений на логические выражения (в сложении удалось убрать все if else, примерная экономия в 3 раза). Ожидаемое время работы около 6000 тактов (исходные тексты библиотек прилагаются). На деле оптимизированный atanTss8Digit выполняется за 28135 тактов, на 3 тысячи тактов МЕДЛЕННЕЕ. :shock:
В CORDIC реализации арктангенса используются: сдвиг, сравнение с нулем, изменение знака, вычитание и сложение. В таблице приведено количество тактов за которое выполняются функции версий 8Digit и 10Digit.
tabl01.JPG
tabl01.JPG (9.76 КБ) 146 просмотров
Проигрыш укороченной версии обнаруживается в оптимизированном сложении. Функция addTss8Digit короче на 500 строк, в ней нет ветвлений, следовательно, конвейер не сбрасывается, а работает медленнее на 150 тактов!? :twisted:
В связи с этим хотелось бы знать, сколько тактов будут тратить описанные функции на K1921 с использованием отладочных регистров.
P.S. Кроме Keil проекта, во вложении имеется версия 8Digit библиотеки, для MS Visual Studio 10, с демонстрацией корректности вычислений. Эта версия библиотеки незначительно отличается, вместо типа int используется uint32.
Вложения
atan2VS10_18_07_20.zip
(3.79 КБ) 6 скачиваний
keil5_18_07_20.zip
(10.73 КБ) 6 скачиваний
Умение забывать глупости, дает
возможность помнить главное.

редактор
Сообщения: 6
Зарегистрирован: 08 ноя 2016, 09:10

Re: Вычисление троичного арктангенса

Сообщение редактор » 23 июл 2018, 16:40

Почему вы думаете, что эмуляция 3-х уровневой логики на МК будет быстрее чем работа с бинарной логикой?
Из практики известно, что максимальная разрядность аналого – цифровых преобразователей (АЦП) равна 14 битам. Мощность 14 битового числа составляет 2 в степени 14 = 16384, а вот мощность 9 тритового числа несколько больше 3 в степени 9 = 19683. Тогда можно использовать следующий ТСС формат – 10 тритовое число с фиксированной запятой, 7 разрядов на дробную часть, 3 разряда до запятой на целую часть, кроме того самый старший разряд – это ещё и признак переполнения. Такое ТСС число может храниться в 20 младших разрядах 32 битного int.
20 бит бинарной логики обеспечивают большую точность чем 10 бит троичной.
Все это представляет интерес для моделирования на VS.
Для МК гораздо проще складывать, сдвигать и проверять двоичные числа, большая часть операций выполняется аппаратно.
Библиотека подразумевает вызов функций для выполнения тех же самых действий троичной логики.
Стоит ли огород городить если стандартная библиотека с float работает много быстрее?
Функции стандартной библиотеки atan и atan2 (double версии) исполняются за 5843 и 2968 соответственно. Функции atanf и atan2f (float версии) выполняются за 106 и 137 тактов. Логично предположить, что float версии реализованы аппаратно.
Функция atanTss10Digit из прошлогодней версии библиотеки tssix10digit4k1921 выполнятся за 24980 тактов. Это не приемлемо много.
Что вы подразумеваете под отладочными регистрами? Регистры общего назначения?? Тогда доступ к ним возможен из ASM файлов. Компиляоры (Си) неохотно дают к ним доступ, поскольку сами используют эти регистры, согласно стандарту, для передачи параметров и локальных переменных. За год, вероятно, можно было найти и адаптировать реализацию алгоритмов CORDIC для бинарных вычислений. Это было бы более разумной тратой времени (на мой взгляд).
хотелось бы знать, сколько тактов будут тратить описанные функции на K1921 с использованием отладочных регистров
Откомпилируйте в KEIL свой проект. Далее можно в эмуляторе KEIL посмотреть время выполнения в тактах, либо посчитать такты по asm-листингу (где то на сайте arm видел таблицу длительности каждой команды в татктах).

tnsfloat
Сообщения: 6
Зарегистрирован: 01 авг 2017, 12:08
Предприятие: usptu

Re: Вычисление троичного арктангенса

Сообщение tnsfloat » 24 июл 2018, 12:55

Изумление вызывает факт замедления работы функции, при уменьшении разрядности операнда (с 10 до 8 трит).
Хотелось бы знать времена работы функций addTss8Digit и addTss10Digit на микроконтроллере K1921BK01T. В прошлом году на курсах в МЭИ нам показывали отладочные переменные Debug1..4, но самостоятельно я не ими воспользоваться не смог.
Умение забывать глупости, дает
возможность помнить главное.

Ответить

Вернуться в «32-разрядные микроконтроллеры на ядре ARM Cortex»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость