Перейти к содержанию
    

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

On 9/17/2023 at 6:50 PM, repstosw said:

Сделал архив с сорцами, всё что касается INTC

 

On 9/17/2023 at 6:50 PM, repstosw said:

В общем этот китаец взял описание регистров R_INTC из Tina Linux T113-s3

а можно куда-нибуть скинуть весь SDK ? то что я видел на гитхабе - там нет этого, возможно и xcc там есть и лицензия. Я так понял инструментарий (компилятор) для кастомных инструкций TIE генерируется средой разработки - какие расширения заложили в ядро xtensa только allwinner знает, они и должны дать оптимизированный компилятор, а китаец ещё и сторонние бинарнные библиотеки и конфиг (оверлей) откуда то взял - явно не из астрала

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

48 minutes ago, sasamy said:

а можно куда-нибуть скинуть весь SDK ?

В своё время Tina T113-s3 Linux SDK выкачивал с baidu.com через Motrix. Проверил, сейчас эта ссылка дохлая.

Попытаюсь закачать то что есть.

48 minutes ago, sasamy said:

то что я видел на гитхабе - там нет этого, возможно и xcc там есть и лицензия.

На гитхабе не полная версия Тины для T113-s3.

48 minutes ago, sasamy said:

Я так понял инструментарий (компилятор) для кастомных инструкций TIE генерируется средой разработки - какие расширения заложили в ядро xtensa только allwinner знает, они и должны дать оптимизированный компилятор

Честно говоря, в свое время я задолбался возиться с этим китайским(точнее - японским) оверлеем!  Он ни в какую не видел настройки для ABI=call0.  Пришлось брать оригинальный оверлей от xtensa и пробовать с ним.  Получилось. Но позже обнаружил, что не все регистры и инструкции прописаны.  В итоге, я сделал свой оверлей - который легко сетапится на ABI=call0 + все дефайны и инструкции взял от китайского японского оверлея.  Получил то, что надо 🙂

48 minutes ago, sasamy said:

а китаец ещё и сторонние бинарнные библиотеки и конфиг (оверлей) откуда то взял - явно не из астрала

Кто-то накидал ему для оверлея описание регистров и инструкций - именно для T113-s3. Так как lx7 и hifi4 от xtensa подходят не 100% и содержат меньше информации.

 

Кроме того, libc, которую собрал китаец японец - НЕ поддерживает printf с %f и %x.  Собрал свой libc (пока на уровне библиотеки libstdio.a) -  с полной поддержкой printf.

 

Сделал приоритеты внешним прерываниям. Сейчас разбираюсь с вложенными прерываниями.  Теперь стало ясно, зачем группа регистров pintc_regs->resp,resp1,resp2 - они позволяют замаскировать источник прерывания, чтобы не было вложенности самого на себя.  Но об этом позже.

 

Как я понял, FreeRTOS не умеет во вложенные прерывания (речь о внешних прерываниях, которые на INTC с его приоритетами).

 

Новые номера внешних источников прерываний, которые нашёл по ходу работы:

#define GPIOB_INTC_SOURCE 40 //GPIO Port B
#define LCD_INTC_SOURCE   56 //LCD TCON0
#define CSIC_INTC_SOURCE  61 //CSIC - digital camera capture (DVP)
53 minutes ago, sasamy said:

а китаец ещё и сторонние бинарнные библиотеки и конфиг (оверлей) откуда то взял - явно не из астрала

Скорее всего они были взяты из Cadence Xtensa. Тот самый, что больше 1 ГБ и требует лицензию.

Исходники libhal я нашёл и пересобрал. Ссылку давал выше с компилятором под ABI=call0.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/30/2023 at 10:01 AM, repstosw said:

легко сетапится на ABI=call0

только неизвестно поддерживает ли xcc этот abi иначе затея с bare metal для него обречена тормозить

On 9/30/2023 at 10:01 AM, repstosw said:

Кроме того, libc, которую собрал китаец японец - НЕ поддерживает printf с %f и %x.

в freertos используются сторонние бинарные либы, это видно из map файла и из выхлопа printf

	printf("DSP uart\n");
	printf("hex 0x%x, float %lf\n", 1024, 3.14159);
Quote

DSP uart
hex 0x400, float 3.141590

 

 

On 9/30/2023 at 10:01 AM, repstosw said:

Как я понял, FreeRTOS не умеет во вложенные прерывания

для меня совсем не интересно - вся периферия работает в Linux, на freertos скидывать есть смысл только задачи требующие реалтайма - максимум пара прерываний от INTC  и вложенность тут вообще непонятно для чего

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, sasamy said:

а можно куда-нибуть скинуть весь SDK ?

В сжатом виде он занимает около 12 ГБ. Слишком большой объём. Я не буду столько закачивать и ждать.:boredom:

1 hour ago, sasamy said:

только неизвестно поддерживает ли xcc этот abi иначе затея с bare metal для него обречена тормозить

Чего? 🙂

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

Тот компилер, что я собрал под call0 ABI уже давно всё работает, перевел на него несколько проектов. По скорости одинаково с windowed ABI, делал замер скорости на рутинных вычислениях.  А вот то, что с Call0 не дергаются экспешены по вызову переключений окон и копирования в стек - это  явно плюс + освобождает программиста от головной боли.

1 hour ago, sasamy said:

в freertos используются сторонние бинарные либы, это видно из map файла и из выхлопа printf

Честно говоря, меня этот FreeRTOS уже начинает порядком раздражать. Куда ни посмотри на сорцы - везде суют контекст многозадачности в обработчики прерываний, делая их неуклюжими.  И кишки, торчащие из libc, которые требуют реентабельность. На самом деле проще надо быть! Проще!  🙂

1 hour ago, sasamy said:

для меня совсем не интересно - вся периферия работает в Linux, на freertos скидывать есть смысл только задачи требующие реалтайма - максимум пара прерываний от INTC  и вложенность тут вообще непонятно для чего

Для меня неинтересны ни Линукс, ни фриРТОС. :)))

А вложенность и приоритеты мне нужны, чтобы не потерять пакеты в потоковом режиме, которые принимает приёмник на Si4463 по прерыванию, при этом есть ещё дополнительные три прерывания: камера, дисплей и аудио-DMA 🙂

 

P.S. Ещё не совсем понятно, как у данного тулчейна как строится работа с floating point.  Я перемножаю два числа и результат вывожу printf. В ассемблерном листинге я вижу вызовы функций типа mulf_ , formatf_.  А должны быть ассемблерные вкрапления инструкций.   Из-за  этого я был вынужден перевести компиляцию библиотек libspeexdsp и libcelt в режим fixed point.

 Возможно нужно простроение тулчейна с ABI hardfp.

 

Из всего увиденного и испытанного я сделал вывод, что вычислительная мощь HiFi DSP  явно проигрывает основному ядру Cortex A7. В разы. Скажем так - в 3..4 раза. При условии, если считать частоты одинаковыми.  А если учесть, что у HiFi4 частота вдвое меньше, то проигрыш - в 6..8 раз.

А крику-то сколько было... Cadence, Tensillica...  На поверку оказалось хуже, чем ARM.   ESP32 туда же.

Не стоит ждать от этого ядра слишком много.  Как второстепенный недо-проц, чтобы посчитать какой-нибудь звуковой синтез или проэмулять раритет - пойдёт.  На что-то более серьёзное - нет.

Лучше взять H616 с его 4-мя ядрами 😃

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/1/2023 at 2:34 AM, repstosw said:

Чего? 🙂

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

Речь про XCC - оптимизирующий компилятор cadence, в crosstool-ng собирается версия от сообщества поддерживающая только core isa, есть какие-то работы в clang, помоему там даже поддержка TIE в форке espressif есть, но я не уверен что там всё радужно

 

On 10/1/2023 at 2:34 AM, repstosw said:

А вложенность и приоритеты мне нужны, чтобы не потерять пакеты в потоковом режиме, которые принимает приёмник на Si4463

вот эти пакеты и принимать на DSP и будет у него единственное прерывание, результат складывать в буфер и отдавать Linux

On 10/1/2023 at 2:34 AM, repstosw said:

при этом есть ещё дополнительные три прерывания: камера, дисплей и аудио-DMA 🙂

для них никакого реалтайма не требуется - прекрасно работают в gpos Linux параллельно с DSP. Если так нужны приоритетные прерывания - в  ISR только отпендить и отключить источник прерывания и запустить задачу с обработчиком с нужным приоритетом а дальше проблема планировщика кто кого вытеснит в соответствии с его приоритетом

On 10/1/2023 at 2:34 AM, repstosw said:

Ещё не совсем понятно, как у данного тулчейна как строится работа с floating point.  Я перемножаю два числа и результат вывожу printf. В ассемблерном листинге я вижу вызовы функций типа mulf_ , formatf_.  А должны быть ассемблерные вкрапления инструкций.   Из-за  этого я был вынужден перевести компиляцию библиотек libspeexdsp и libcelt в режим fixed point.

наверно как и в Linux

https://ru.wikipedia.org/wiki/Math.h#libm

не уверен что комьюнити версия поддерживает floating-point сопроцессор, в freertos сторонняя библиотека libm.a и возможно поддерживает - надо проверять

On 10/1/2023 at 2:34 AM, repstosw said:

Из всего увиденного и испытанного я сделал вывод, что вычислительная мощь HiFi DSP  явно проигрывает основному ядру Cortex A7. В разы. Скажем так - в 3..4 раза.

вывод: если в автомобиль не заливать бензин (SIMD и VLIW) а тащить собачкой (core ISA)  он не может обогнать даже велосипедиста!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 minutes ago, sasamy said:

вывод: если в автомобиль не заливать бензин (SIMD и VLIW) а тащить собачкой (core ISA)  он не может обогнать даже велосипедиста!

Много работаю с чужим кодом. Обычным кодом.  Который не VLIW. Обычный сишный код.  General purpose. Именно производительность на таком коде HiFi4 DSP будет хуже T113-s3 CPU.

Чтобы заливать бензин марки VLIW - нужно писать с нуля под этот набор инструкций.

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

32 minutes ago, sasamy said:

наверно как и в Linux

https://ru.wikipedia.org/wiki/Math.h#libm

не уверен что комьюнити версия поддерживает floating-point сопроцессор, в freertos сторонняя библиотека libm.a и возможно поддерживает - надо проверять

В нормальных тулчейнах GCC это переключается флагом -mhard-float.  Но в xtensa-hifi4-elf-  этот флаг не работает и при его использовании пишет ошибку.

И дело не в libm.  Дело не в синусах-косинусах.  Простое умножение двух чисел: арифметические выражения должны инлайниться ассемблерными инструкциями, а не вызовами функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про инлайн- обычной спрсоб в виде -fno-errno или какой-то такой флаг помогает? На cortex это обычное дело

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, GenaSPB said:

Про инлайн- обычной спрсоб в виде -fno-errno или какой-то такой флаг помогает? На cortex это обычное дело

Использую эти : -fno-math-errno -ffast-math. Вызовы остаются

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

float ttt(float a,float b)
{
 float c=a+b;
 printf("%f\n",c);
 return c;
}

int main(void)
{
 printf("%f\n",ttt(0.5F,0.333F));
 return 0;
}
xtensa-hifi4-elf-gcc -Ofast -std=c99 -DNDEBUG -ffast-math -fno-math-errno -ffinite-math-only -fno-trapping-math -S -o my_asm_output.s main.c
ttt:
	movi	a9, 0x90
	sub	sp, sp, a9
	s32i	a0, sp, 140
	s32i	a12, sp, 136
	call0	__addsf3
	mov.n	a12, a2
	call0	__extendsfdf2
	mov.n	a5, a3
	l32r	a3, .LC1
	mov.n	a4, a2
	mov.n	a2, sp
	call0	sprintf
	mov.n	a2, sp
	call0	UART_puts
	l32i	a0, sp, 140
	movi	a9, 0x90
	mov.n	a2, a12
	l32i	a12, sp, 136
	add.n	sp, sp, a9
	ret.n

 

Стыдоба и позор: __addsf3, __extendsfdf2.

https://github.com/gcc-mirror/gcc/blob/master/libgcc/soft-fp/addsf3.c

Quote

Software floating-point emulation.
   Return a + b

У меня libcelt с включенной в конфиге floating-point реализацией даёт всего 88 FPS.  А с Fixed point реализацией: 438 FPS.

https://github.com/scjtqs2/libcelt/tree/main

 

Имеет ли этот HiFi4 DSP аппаратную поддержку floating point? Если да, то есть ли способ заставить компилятор НЕ использовать эмуляцию floating point? 

Вариант применения всяких интринсиков типа Float_Add(Float_Mul(a,b),c ) - не рассматриваю.   Нужно чтобы набранное в сях float d = a*b+c  становилось ассемблерными инструкциями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оверлей, предоставленный японцем, не поддерживает hard float. В файле xtensa-config.c отсутствуют описания регистров f0 .. f15 и операции над ними. Построение тулчейна со включенными опциями vfpu2 завершилось неудачно: не знает что такое регистры f0..f15.

Вот как выглядит настоящий код с плавающей точкой в архитектуре xtensa:

Spoiler
	wfrd		f1, xh, xl
	wfrd		f2, yh, yl

	div0.d		f3, f2
	nexp01.d	f4, f2
	const.d		f0, 1
	maddn.d		f0, f4, f3
	const.d		f5, 0
	mov.d		f7, f2
	mkdadj.d	f7, f1
	maddn.d		f3, f0, f3
	maddn.d		f5, f0, f0
	nexp01.d	f1, f1
	div0.d		f2, f2
	maddn.d		f3, f5, f3
	const.d		f5, 1
	const.d		f0, 0
	neg.d		f6, f1
	maddn.d		f5, f4, f3
	maddn.d		f0, f6, f2
	maddn.d		f3, f5, f3
	maddn.d		f6, f4, f0
	const.d		f2, 1
	maddn.d		f2, f4, f3
	maddn.d		f0, f6, f3
	neg.d		f1, f1
	maddn.d		f3, f2, f3
	maddn.d		f1, f4, f0
	addexpm.d	f0, f7
	addexp.d	f3, f7
	divn.d		f0, f1, f3

	rfr		xl, f0
	rfrd		xh, f0

Я понимаю, что инструкции SIMD и VLIW недоступны с данным тулчейном.  Но инструкции FPU - они просто ОБЯЗАНЫ быть!

Нужно искать другой оверлей. И строить с ним новый тулчейн через crosstool-ng.

Изменено пользователем haker_fox
Длинный код спрятал под спойлер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/2/2023 at 6:22 AM, repstosw said:

Но инструкции FPU - они просто ОБЯЗАНЫ быть!

это большой хз, смотрю оверлей xtensa-config-overlay.tar.gz (не сконвертированыый который), config/core.h

Quote

#define XCHAL_HAVE_USER_DPFPU       0       /* user DP floating-point pkg */
#define XCHAL_HAVE_USER_SPFPU       1       /* user SP floating-point pkg */
#define XCHAL_HAVE_FP           1   /* single prec floating point */
#define XCHAL_HAVE_FP_DIV       1   /* FP with DIV instructions */
#define XCHAL_HAVE_FP_RECIP     1   /* FP with RECIP instructions */
#define XCHAL_HAVE_FP_SQRT      1   /* FP with SQRT instructions */
#define XCHAL_HAVE_FP_RSQRT     1   /* FP with RSQRT instructions */

 

смотрю конфиг binutils/xtensa-config.h

Quote

#undef XCHAL_HAVE_FP
#define XCHAL_HAVE_FP           0

#undef XCHAL_HAVE_FP_DIV
#define XCHAL_HAVE_FP_DIV       0

 

в gcc/xtensa-config.h то же что в binutils - FPU отключен, похоже на какой-то самодел, чему тут верить непонятно. Посмотрел оверлеи espressif - там такого противоречия нет

https://github.com/espressif/xtensa-overlays

 

xtensa_esp32s2 - одноядерный lx7 без fpu

xtensa_esp32s3 - двухядерный lx7 + fpu

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, sasamy said:

xtensa_esp32s3 - двухядерный lx7 + fpu

Скачал этот тулчейн: xtensa-esp32s3-elf-12.2.0_20230208-i686-w64-mingw32.zip

Он легко гуглится. Там же и для Линукса есть.

Проверил.

Результаты впечатлили: кроме floating point он ещё может переключать ABI. По умолчанию там Windowed, но я поставил Call0. 

Но слинковать им не выйдет. И полностью откомпилять HiFi4 не получится (не видит некоторые регистры/инструкции для HiFi4).

Поэтому сделал смешанную компиляцию: арифметику скомпилил xtensa-esp32s3-elf , а остальное xtensa-hifi4-elf.

Тестирование провел на таком коде:

float ttt(float a,float b,float c,float d)
{
 float e;
 e=a+b;
 e-=c;
 e*=c;
 e+=(a*b)+c;
 return e;
}

int main(void)
{
 AVS_CNT0_REG=0;
 float z=0;
 for(u32 i=0;i<100000;i++)z+=ttt(0.5F,0.123F,0.25F,0.1F);
 printf("result: %f, delay: %d us\n",z,AVS_CNT0_REG/6);
 while(1);
 return 0;
}

Листинг функции ttt() с компилятора xtensa-esp32s3-elf-gcc - кроме FPU регистров даже присутствуют  инструкции madd, что меня очень сильно радует. Код функции вышел крохотным:

ttt:
	wfr	f1, a4
	wfr	f3, a3
	sub.s	f0, f3, f1
	wfr	f2, a2
	mov.s	f4, f1
	madd.s	f4, f2, f3
	add.s	f0, f0, f2
	madd.s	f4, f1, f0
	rfr	a2, f4
	ret.n

Совсем иная картина с "родным" тулчейном xtensa-hifi4-elf-gcc:

Spoiler
ttt:
	addi	sp, sp, -32
	s32i.n	a14, sp, 16
	mov.n	a14, a3
	s32i.n	a13, sp, 20
	mov.n	a3, a4
	mov.n	a13, a2
	mov.n	a2, a14
	s32i.n	a0, sp, 28
	s32i.n	a12, sp, 24
	s32i.n	a15, sp, 12
	mov.n	a12, a4
	call0	__subsf3
	mov.n	a3, a13
	call0	__addsf3
	mov.n	a3, a2
	mov.n	a2, a12
	call0	__mulsf3
	mov.n	a15, a2
	mov.n	a3, a14
	mov.n	a2, a13
	call0	__mulsf3
	mov.n	a3, a12
	call0	__addsf3
	mov.n	a3, a15
	call0	__addsf3
	l32i.n	a0, sp, 28
	l32i.n	a12, sp, 24
	l32i.n	a13, sp, 20
	l32i.n	a14, sp, 16
	l32i.n	a15, sp, 12
	addi	sp, sp, 32
	ret.n

 

 

Результаты очевидны.

Хардовая плавучка:

Quote

result: 40476.511719, delay: 666 us

Софтовая - почти в 10 раз медленее:

Quote

result: 40476.511719, delay: 6229 us

Надо как-то наложить на HiFi4 оверлей возможности FPU 🙂

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/2/2023 at 9:48 AM, repstosw said:

Результаты впечатлили: кроме floating point он ещё может переключать ABI.

у espressif есть свой форк crosstool-ng - кроме прочего (свои форки gcc, binutils) там есть поддержка вплоть до gcc 13

https://github.com/espressif/crosstool-NG/tree/esp-1.25.x

я им собирал с оверлеем китайца видел что abi переключается но fpu не взлетел и я подумал что gcc настолько убог и не поддерживает  - не ожидал что такая подстава в оверлее, всегда смотрел только core-isa а там всё есть и адреса совпадают, так похоже на правду было.

 

UPD интересно но похоже не самодел а штатный сгенерированный оверлей, посмотрел для imx оверлеи, там тоже самое - в core-isa есть FPU а в конфигах утилит нет

https://github.com/thesofproject/xtensa-overlay

похоже espressif дальше других продвинулись в разработке

 

 

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, sasamy said:

я им собирал с оверлеем китайца видел что abi переключается но fpu не взлетел и я подумал что gcc настолько убог и не поддерживает  - не ожидал что такая подстава в оверлее, всегда смотрел только core-isa а там всё есть и адреса совпадают, так похоже на правду было.

А как вы переключали ABI ?  Я правил в оверлее все дефайны касающиеся WINDOWED/CALL0.  Полагаю, есть способ проще.

3 hours ago, sasamy said:

у espressif есть свой форк crosstool-ng - кроме прочего (свои форки gcc, binutils) там есть поддержка вплоть до gcc 13

https://github.com/espressif/crosstool-NG/tree/esp-1.25.x

Собрал его в Линуксе.  Но не удаётся построить тулчейн - тупит при загрузке zlib 2.1.13. Не может его загрузить и всё завершается неудачно.

Есть ли способ заставить ct-ng  не качать и устанавливать каждый раз всё барахло, а сохранять и устанавливать на локальной машине?

Слишком долго ждать постоянно когда строится.  У меня 2 часа один билд.  GCC собирается в 2 прохода (это помто что BUILD != HOST)

Старый crosstool-ng собирает без проблем.

3 hours ago, sasamy said:

похоже espressif дальше других продвинулись в разработке

Да.  Они молодцы. Развивают оверлеи.

4 hours ago, sasamy said:

xtensa_esp32s2 - одноядерный lx7 без fpu

xtensa_esp32s3 - двухядерный lx7 + fpu

HiFi4 - Это тоже LX7 ?

Глянул даташиты на эти ESP:

ESP32 - LX6

ESP32-s2 : не имеет регистров FPU

ESP32-s3: имеет только FPU одинарной точности (SP, не DP).

 

И ещё. Есть ли способ собрать crosstool-ng в винде с помощью minGW32 ?  У меня Линукс виснет во время билда почему-то.  Просто курсор мыши исчезает и даже на Ctrl+Alt+Del не реагирует. Только из розетки выключать.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...