Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-май-29 20:23

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 121 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2016-дек-06 15:21 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Еще один пример демонстрации новых возможностей ВН28\34.
Ранее, в тесте БПФ 1К, я использовал таблицу синусов-косинусов, которую получил, используя Microsoft Visual Studio (MVS).

void tw_gen (double *w, int n)
{
int i, j, k;
const double PI = 3.141592654;

for (j = 1, k = 0; j <= n >> 2; j = j << 2)
{
for (i = 0; i < n >> 2; i += j)
{
w[k] = cos (2 * PI * i / n);
w[k + 1] = sin (2 * PI * i / n);
w[k + 2] = cos (4 * PI * i / n);
w[k + 3] = sin (4 * PI * i / n);
w[k + 4] = cos (6 * PI * i / n);
w[k + 5] = sin (6 * PI * i / n);
k += 6;
}
}
}
С помощью этой функции, для n=1024, были получены результаты W[i] и помещены в файл tw_1K_R4_dp.dat, который использовался в БПФ.

Сейчас я решил проверить насколько эффективна реализация функций синуса и косинуса, используемых компилятором СМ-LYNX.
Для этого я нагенерил файл значений углов, для которых MVS считал синусы и косинусы. Значения углов в файле tw_1K_rad.dat

Убедившись, что встроенная в CM-LYNX функция синуса-косинуса считает в среднем за 800-900 тактов
и точность её очень низкая, я написал собственные реализации синуса и косинуса(файл BY_sin.asm).
В приложении проект который считает для входных значений углов tw_1K_rad.dat значения
синуса и косинуса, а затем сравнивает с эталонными tw_1K_R4_dp.dat(полученными в MVS).

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

Пример одной из 13-ти ошибок:

угол равен 0x400b18a2f6e8b2ba (double in hex).
в десятичном выражении это {llv=0x400b18a2f6e8b2ba dv=3.3870295800937500 } l64_or_d64

MVS говорит,что синус этого угла равен 0xBFCF19F9_7C0D3789
BY_sind дает ответ 0xBFCF19F9_7C0D378B

Как видим, разница равна 2 и это считается ошибкой.

Проверяю этот угол в https://www.wolframalpha.com/input/?i=s ... 5800937500)+in+hex
получаю ответ 0xBFCF19F9_7C0D378А

Можно посчитать максимально точное значение синуса для данного угла и определить кто больше врёт :)
Скорость вычисления BY_sind, BY_cosd в районе 70-80 тактов.
Можете использовать эти реализации(файл BY_sin.asm) для проверки других значений углов.
Если обнаружите значение угла на котором синус или косинус вычисленный с
помощью BY_sind, BY_cosd имеет значительное расхождения с истинным, просьба сообщить.
Заранее благодарен

PS. проект работает только в среде CM-LYNX компинии Миландр.


Вложения:
BY_SINCOS.ZIP [22.06 КБ]
Скачиваний: 24
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2016-дек-08 09:29 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
если кто-то использует среду отладки VisualDSP, но желает воспользоваться новыми функциями
синуса, косинуса или БПФ, то можно скомпилить эти функции в СМ-LYNX, а далее использовать
.doj файлы в среде VisualDSP. Нужно только заранее позаботиться о корректных именах функций
и корректной передаче параметров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2016-дек-22 13:46 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Наткнулся я в сети на документ
https://electronix.ru/forum/index.php?s ... &start=120
от коллег по бизнесу (файл FIR_ELCore_30M.pdf).
В нем примеры числа тактов ядра Elcore 30M на FIR фильтрах для действительных чисел float.
Вот и я решил посмотреть как будет смотреться ВН28 на этой полезной задаче.
Для ориентира я нашел в библиотеке VisualDSP нужную функцию _fir и почитал её характеристики.
Согласно приведенной в тексте функции формуле расчета, для
- 256 отсчетов и длине фильтра 32 количество тактов равно 5330 (Elcore 30M - 2560).
- 512 отсчетов и длине фильтра 64 количество тактов равно 18834 (Elcore 30M - 16384).
-1024 отсчетов и длине фильтра 128 количество тактов равно 70418 (Elcore 30M - 57344).

Сделал проект с использованием _fir и убедился, что ВН28 работает на этой программе ничуть
не быстрее заявленных характеристик. Даже чуть хуже.

Посмотрел на сайте TI как дела с этим FIR у С6678.
Есть данные для 128\16 и 256\16. Для этих параметров у ВН28 на _fir получается
- 128 отсчетов и длине фильтра 16 количество тактов равно 1807 (С6678 - 1345).
- 256 отсчетов и длине фильтра 16 количество тактов равно 3567 (С6678 - 2625).

Как видим - везде пролёт. Конкретный пролёт по сравнению с конкурентами.
Пришлось взять в руки клавиатуру и потратить день на свежую версию подобного FIR фильтра
с учетом новинок архитектуры ВН28 (текст процедуры и её .doj файл для VisualDSP прилагаю).

После прогона различных вариантов числа сэмплов и длин фильтра
получил (к-во сэмплов\длина фильтра - количество тактов):
128\16 - 855
256\16 - 1671
256\32 - 2695
512\64 - 9447
1024\128 - не считал.
Процедура для всех случаев одна и таже. Как видно из результатов, только на 256\32 ВН28 немного уступил лидерство 30М.
В остальных случаях вполне достойные результаты.
Можно посмотреть текст функции. Может я где и ошибся.
Уж больно сильно всех обогнал,что даже сомнения закрадываются :)
Требования к параметрам процедуры внутри текста функции.
Все массивы (сэмплы, константы, буфер линий задержек,
указатель на структуру параметров) должны быть выравнены на границе квадрослова.
Для расчета параметра длины буфера задержек используется спец формула.
Работу функции проверил по результатам сравнения с функцией _fir.
Длина фильтра и количество сэмплов всегда должны быть кратны 4.
Если нужна иная длина фильтра - выравнивайте дополнительными нулями до кратности 4 :).
На ВН34 эта функция не пойдет т.к. в текущей версии процессора нет расширенных возможностей для обработки float.


PS. Спасибо за включение функций синуса, косинуса и целочисленного деления в библиотеку.
Жаль что деление взяли не самое оптимальное.


Вложения:
BY_fir_example.zip [2.51 КБ]
Скачиваний: 27
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2016-дек-23 16:02 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
пример выше, функции FIR, можно ускорить если одну итерацию цикла реализовать вне цикла
и за счет этого сократить накладные расходы на пролог и эпилог. Немного увеличится размер кода,
но цифры количества тактов будут такие (включая вызов функции и возврат):
128\16 - 778
256\16 - 1514
256\32 - 2538
512\64 - 9130
1024\128 - 34602.
выигрыш не такой уж и большой, но уже не будет проигрыша и на комбинации 256\32 :)
Прилагаю и этот вариант реализации. В нем нет ограничения выравненности на Q-слово указателя на передаваемые
параметры, а также размер буфера линий задержек немного уменьшен и сейчас равен (К+3)*4.
Если функция FIR вызывается повторно, количество тактов уменьшается на 13, т.к. в буфере предсказаний уже имеются
записи на необходимые переходы.
Функция работает только на ВН28. Длина фильтра >=8 и кратна 4.


Вложения:
BY_fir_SF.zip [3.1 КБ]
Скачиваний: 23


Последний раз редактировалось BY_man 2016-дек-26 17:33, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2016-дек-26 11:22 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Поискал ещё информацию о FIR фильтрах у Аналог Дэвайс для нового
SHARC+ ядра. Только в одном документе (ищите в сети док EE375v01.pdf) нашел пример для FIR 256\255.
Такты очень скромные (сейчас в моде FIR-IIR ускорители) и где-то в 2 раза хуже чем у ВН28 .
Но в этом документе приведен пример количества тактов для фильтра с расширенной точностью.
Поэтому, чтобы закончить тему с FIR, я переделал код SF версии для работы с double.
Пример функции прилагаю. Количество тактов примерно в 2 раза больше
чем для варианта с одинарной точностью. Случай фильтра
256\256 - 16874 для float
256\256 - 33446 для double
Код проще т.к. работаем только с 2-мя сэмплами одновременно
и имеем только 2 линии задержек. Размер буфера задержек (К+1)*4.
В остальном требования одинаковые.
Эта функция может работать как на ВН28, так и на ВН34.
Длина фильтра >=8 и кратна 4.


Вложения:
BY_fir_DF.zip [2.61 КБ]
Скачиваний: 23
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-янв-12 16:03 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Активизируем тему в наступившем году :)
Приведу пример реализации стандартной функции powd(), которая показалась мне очень интересной.
В приложении тестовый проект в котором собраны несколько вариантов Си-шных реализаций этой функции,
а также мой ассемблерный вариант. Чтобы не печатать здесь много слов, более подробная инфа в
прилагаемом файле pow_read_me.txt.
Ассемблерный вариант в 4--5 раз быстрее текущего библиотечного. Есть только вопросы с допустимой точностью.
Проект работает как на ВН28 так и на ВН34.


Вложения:
powd_example.zip [36.89 КБ]
Скачиваний: 22
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-янв-14 11:02 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
В предыдущем примере я добавил в список файлов .doj файл ассемблерной
функции BY_powd() чтобы эту функцию можно было использовать в Visual DSP.
Однако когда сам попробовал использовать BY_pow_v2.doj в Visual DSP,
то обнаружилась проблема с командой j11 = B[j3+base_P_x_love*4] (SE);
Линковщику не понравилось использование адреса байта base_P_x_love*4.
В связи с этим я переделал проект под Visual DSP (директория pow_vdsp), который и прилагаю.
Особенность использования новых функций (использующих функционал ВН28\34, который отсутствует в TS201)
в Visual DSP, это использование (вместо исходника) уже скомпилированного .doj файла.
При этом Visual DSP прекрасно проводит отладку по телу новой функции
(которую можно хранить в соседней директории pow_src). Единственное неудобство - нужен отдельный ассемблер ВН28\34 чтобы
при необходимости скомпилить новый .doj файл после коррекции исходника.

Та же стандартная библиотечная функция powd() в Visual DSP работает уже медленнее (нет аппаратной поддержки double).
Поэтому BY_powd() ускоряет её раз в 20 (на плате ВН34 я получил для BY_powd худшее время 238 тактов,
а для библиотечной powd() 4744 такта).
В директории pow_int функция BY_powd() (исходник и .doj), но скомпилированная с //#define DISABLY_INT_LRY
(для тех кто не может сам скомпилить такой вариант).


Вложения:
powd_for_VDSP.zip [121.43 КБ]
Скачиваний: 33
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-фев-15 19:06 
Не в сети

Зарегистрирован: 2009-май-25 10:03
Сообщения: 35
Откуда: АО "ПКК Миландр"
В приложении начальный вариант библиотеки драйверов (будет обновляться по мере дополнения).
Доступны функции: sys, link, interrupt, dma.


Вложения:
hal_028.7z [96.77 КБ]
Скачиваний: 21
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-фев-16 07:46 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 941
Откуда: Тула
hal_1967VN028.h
Код:
#ifndef __HAL_1967VC3R1_H__
#define __HAL_1967VC3R1_H__
Пожалуй стОит обновить дефайны.

hal_typedef.h
Код:
typedef enum  {   intKERNEL,  intTMR0LP=2, intTMR1LP, intLINK0=6, intLINK1, intLINK2, intLINK3,
            intDMA0=14, intDMA1, intDMA2, intDMA3, intDMA4 = 22, intDMA5, intDMA6, intDMA7,
            intDMA8 = 29, intDMA9, intDMA10, intDMA11, intDMA12=37, intDMA13,
            intIRQ0 = 41, intIRQ1, intIRQ2, intIRQ3, intVIRPT=48,  intBUSLK=50, intTMR0HP=52,
            intTMR1HP, intHW=57} InterruptRequest_type;
В этом случае принято присваивать значение каждому полю индивидуально.
Код:
<....>intIRQ0 = 41,
intIRQ1 = 42,
intIRQ2 = 43,
intIRQ3 = 44,
intVIRPT = 48, 
intBUSLK = 50,
intTMR0HP = 52,
intTMR1HP = 53,
intHW = 57} InterruptRequest_type;

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-мар-20 09:47 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
На прошедшей неделе пришлось освежить в памяти алгоритм БПФ.
Чтобы труды не совсем пропали зря, решил активизировать тему и выложить пример проекта БПФ 1К для ВН28.
Поскольку , как писал ПростоРоман,смотреть ассемблерный код жутко скучно, то я потратил пару часов
на небольшой док. Порой и самому проще прочитать текстовый документ, чем лезть в код и вспоминать чего там было написано.
Проект сделан под VisualDSP, а не СМ-LYNX.
Правда и без СМ-LYNX никак, т.к. новые возможности процессора проще реализовывать
с новым ассемблером. Док писал быстро, поэтому если какие-то неточности, то просто не обращайте внимания.


Вложения:
FFT_1K_SP_BH28.pdf [428.54 КБ]
Скачиваний: 38
FFT_1K_SP.ZIP [40.55 КБ]
Скачиваний: 25
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-мар-24 16:03 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Как-то недавно мне на глаза попалась статья на https://habrahabr.ru/post/206264/
Так хорошо было написано, что даже подумал, что начал разбираться в этом вопросе.
Вот и захотелось мне посмотреть как задачу дискретного косинусного
преобразования (FDCT-IDCT) можно решить на ВН28(34). В итоге родился проект под VisualDSP
(но не без помощи СМ-LYNX) и небольшой комментарий :)
Основная цель данного проекта - показать пример использования новых возможностей
процессора ВН28, а именно - работа с константами в вычислительных модулях Х и Y.
Также можно просто посмотреть как можно писать код на ВН28 и сравнить с АRM или
любым другим процессором (кто какой знает и любит).


Вложения:
DCT_on_BH28.pdf [441.7 КБ]
Скачиваний: 27
BY_DCT.ZIP [31.53 КБ]
Скачиваний: 24
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-мар-30 14:23 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Еще одна реализация БПФ. 1К, в которой я попытался обогнать С667х и что из этого получилось.
На этом наверное и закончу свою "рекламную компанию" для ВН28 :)
В приложении проект под СМ-Lynx и описание к нему.
PS1. в файле fft_sp.c я забыл переместить данные и константы в отдельную от кода область.
Например,
ptr_w = get_sb_tw(0x80000); // twid address pointer
ptr_x_i = get_sb_smp(0xc0000); // samples address pointer

PS2: хочу добавить, что приведенная реализация имеет хороший резерв ускорения и при
желании количество тактов можно сократить. Сделать меньше 6000 тактов не проблема :)


Вложения:
FFT_1K_R4_SP.ZIP [33.58 КБ]
Скачиваний: 24
FFT_1K_SP_R4_BH28.pdf [600.69 КБ]
Скачиваний: 46


Последний раз редактировалось BY_man 2017-мар-31 16:13, всего редактировалось 4 раз(а).
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-мар-30 15:19 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 941
Откуда: Тула
BY_man писал(а):
На этом наверное и закончу свою рекламную компанию для ВН28 :)

Но знайте же, что было приятно и интересно Вас читать.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-мар-30 17:30 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
Спасибо, Roman :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1967ВН028
СообщениеДобавлено: 2017-апр-03 09:25 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 60
Откуда: Миландр
К проекту выше, прилагаю свежий (4970 тактов) вариант функции для 1К. Для хорошей цифры лучше разнести
код,входы и выходы по разным банкам памяти. Константы лучше не в банке с кодом.
У кого есть ВН28 и среда отладки СМ-Lynx, тот может поэкспериментировать с текущей реализацией и попытаться её улучшить.
P.S. обратное БПФ, несмотря на некоторые причуды и шкалирование на выходе, можно поместить в эти же такты.


Вложения:
FFT_SP_1K_R4_BY.zip [2.36 КБ]
Скачиваний: 20
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 121 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9  След.

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB