ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
6 ноября
1552572
klen (Сегодня, 19:44, просмотров: 54)
получилось цапнуть armv8 MVE (векторное расширение Helium) на stm32n657. через интринсики и непосредственной векторизацией мой gcc16.0.0 20251105 генерит код с MVE иструкциями и stm32n657 считает вектора вроде бы все правильно. 

доки про MVE/Helium

https://arm-software.github.io/acle/mve_intrinsics/mve.html


HeliumTechnology_referencebook.pdf



чуток ранее я чупыхался подцепить stm32n657 и это было как то тяжко. удалось запустится в sram. как я понимаю в flash меня пока не пустили ... нужно разбиратся с TrustZone и Debug Authentication.

здесь мы немного это обсуждали

https://caxapa.ru/1551417.html


итак - имеем отладочную плату nucleo-n657x0-q микросхема ревизии B.


специфические для данного случая ключики компиляции

-mcpu=cortex-m55

-mcmse

-mfpu=fpv5-d16

-mfloat-abi=hard

-mthumb


код на С/С++

....

#include <arm_mve.h>

int32_t a[4] = { -5,6, 7,8} ; int32_t b[4] = { -5,6,-7,8} ; int32_t c[4] ; int main(void) { asm volatile ("nop") ; asm volatile ("nop") ; asm volatile ("nop") ; asm volatile ("nop") ; mve_pred16_t p = vctp32q (4); int32x4_t va = vldrwq_z_s32 (a, p); int32x4_t vb = vldrwq_z_s32 (b, p); int32x4_t vc = vmulq_x_s32 (va, vb, p); vstrwq_p_s32 (c, vc, p); asm volatile ("nop") ; asm volatile ("nop") ; asm volatile ("nop") ; asm volatile ("nop") ;

.....


после компиляции в асме, болдом выделены vme инструкции.

   0:	b508      	push	{r3, lr}
   2:	f7ff fffe 	bl	0 <HAL_Init>
   6:	f7ff fffe 	bl	0 <main>
   a:	bf00      	nop
   c:	bf00      	nop
   e:	bf00      	nop
  10:	bf00      	nop
  12:	2004      	movs	r0, #4
  14:	f020 e801 	vctp.32	r0
  18:	490c      	ldr	r1, [pc, #48]	@ (4c <main+0x4c>)
  1a:	4a0d      	ldr	r2, [pc, #52]	@ (50 <main+0x50>)
  1c:	fe71 0f4d 	vpst
  20:	ed91 5f00 	vldrwt.u32	q2, [r1, #0]
  24:	fe71 0f4d 	vpst
  28:	ed92 3f00 	vldrwt.u32	q1, [r2, #0]
  2c:	fe71 0f4d 	vpst
  30:	ef24 6952 	vmult.i32	q3, q2, q1
  34:	4b07      	ldr	r3, [pc, #28]	@ (54 <main+0x54>)
  36:	fe71 0f4d 	vpst
  3a:	ed83 7f00 	vstrwt.32	q3, [r3, #0]
  3e:	bf00      	nop
  40:	bf00      	nop
  42:	bf00      	nop
  44:	bf00      	nop







теперь более прикольный вариант для программиста - втоматическая векторизация (компиллер умный - пусть сам векторизирует код если с может и сгенерит истркции векторного ускорителя!)

asm volatile ("nop") ;

asm volatile ("nop") ;

asm volatile ("nop") ;

asm volatile ("nop") ;


for (int i = 0; i< 4; i++)

Dst[i] = A[i] * B[i];


asm volatile ("nop") ;

asm volatile ("nop") ;

asm volatile ("nop") ;

asm volatile ("nop") ;



выход компилятора

  34:	bf00      	nop
  36:	bf00      	nop
  38:	bf00      	nop
  3a:	bf00      	nop
  3c:	4a0b      	ldr	r2, [pc, #44]	@ (6c <main+0x6c>)
  3e:	4b0c      	ldr	r3, [pc, #48]	@ (70 <main+0x70>)
  40:	ed92 7f00 	vldrw.u32	q3, [r2, #0]
  44:	ed93 5f00 	vldrw.u32	q2, [r3, #0]
  48:	ff06 6d54 	vmul.f32	q3, q3, q2
  4c:	4b09      	ldr	r3, [pc, #36]	@ (74 <main+0x74>)
  4e:	ed83 7f00 	vstrw.32	q3, [r3, #0]
  52:	bf00      	nop
  54:	bf00      	nop
  56:	bf00      	nop
  58:	bf00      	nop
    



ляпота то какая - GCC веторизирует код .... как долго я об этом мечтал... вот. теперь не знаю че хотеть дальше.


также я проверил fpu на double операндах, приятно когда не нужно портить и отлаживать численные алгоритмы с даблов yf флоты если на даблах хватает скорости.


ну теперь прикрутим векторный сопроцессор к внешнему 16-битному АЦП .... ну теперь мы разгонимся, но это не точно :)