реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Microblaze float unit, Вопрос по модулю математики микроблайз
Golikov A.
сообщение Jul 15 2013, 09:18
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Всем привет!

Есть у кого либо данные сколько Микроблайз на 6 спартане перемножает float числа?

По описанию при наличии в микроблайзе хардварного модуля это у него занимает 3-4 такта. Но если этот модуль сделать просто в ISE, то там по времени тоже 3-4 такта на умножение, но еще есть задержка по времени на 24 такта для разгона....

Так как оно по жизни, если микроблайзом полином посчитать типа

Код
float a,b,c,d,e,x;

float result = a;

result*=x;
result+=b;

result*=x;
result+=c;

result*=x;
result+=d;

result*=x;
result+=e;

сколько реально тактов такое будет считаться?

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

Буду благодарен за помощь...
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 15 2013, 09:30
Сообщение #2


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Golikov A. @ Jul 15 2013, 12:18) *
Есть у кого либо данные сколько Микроблайз на 6 спартане перемножает float числа?

можно перед выполнением функции запустить вначале таймер, после выполнения функции сразу остановить таймер - значение вывести в терминал компьютера...
Таймер покажет количество тактов выполнения функции...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 15 2013, 11:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



этим и занимаюсь, сильно надеялся на то что кто-то такой анализ уже делал... ну и заодно укажет на тонкости применения флота, а то мало ли что я упустил.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 15 2013, 15:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



вот тепереча я вообще ничего не понимаю...

сделал я проект, Микроблайз+таймер+уарт+все считалки какие есть. Все это на 100 МГц


написал программку вида

CODE
float A = 1.12;
float B = 1.234;
float C = 123.2314;
float D = 1234.23241;
float E = 23.134;

float dt = 0.01;

float t = 0;

int i = 0;

float result = 0;
float array[10];
float arr_t[10];
u32 StartArr[10];
u32 StopArr[10];

u32 StartTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
u32 StartTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
for(i =0;i<10;i++)
{
StartArr[i] = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
result = A;
result *= t;
result += B;
result *= t;
result += C;
result *= t;
result += D;
result *= t;
result += E;

array[i] = result;
arr_t[i] = t;

t+= dt;

StopArr[i] = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
}
u32 StopTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
u32 StopTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));


xil_printf("\r\nStart %d(%d), Stop %d(%d), Delta %d", StartTime, StartTime2, StopTime, StopTime2, (StopTime-StartTime));
for(i =0;i<10;i++)
xil_printf("\r\n%d: (%d <=> %d), Start %d, Stop %d, Delta %d",i , ((int)(arr_t[i]*1000)), ((int)(array[i]*1000)), StartArr[i], StopArr[i], (StopArr[i]-StartArr[i]));


и она мне говорит
Start 77(69), Stop 333(344), Delta 256
0: (0 <=> 23134), Start 85, Stop 97, Delta 12
1: (10 <=> 35488), Start 110, Stop 122, Delta 12
2: (20 <=> 47867), Start 135, Stop 147, Delta 12
3: (30 <=> 60271), Start 159, Stop 171, Delta 12
4: (40 <=> 72700), Start 191, Stop 204, Delta 13
5: (49 <=> 85153), Start 217, Stop 228, Delta 11
6: (59 <=> 97631), Start 239, Stop 250, Delta 11
7: (69 <=> 110134), Start 261, Stop 272, Delta 11
8: (79 <=> 122661), Start 285, Stop 297, Delta 12
9: (89 <=> 135214), Start 309, Stop 321, Delta 12

внимание вопрос.
почему при первом опросе таймера 2 соседние строчки отличались на 8 тактов.
Код
u32 StartTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
    u32 StartTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));

результат
Start 77(69)

а в конце они же
Код
u32 StopTime = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));
    u32 StopTime2 = *((volatile u32 *)(XPAR_AXI_TIMER_0_BASEADDR + 8));


дали уже 11 тактов
Результат
Stop 333(344)

Дальше поглядел я код в дизасемблере, напрягает отсутствие команд умножения, как то он их соптимизил, но как я не понимаю... и как его попросить это не делать (выключить оптимизатор не вариант). Или это принцип работы хардварного умножителя, он просто в какие то регистры записывает данные и получает ответ?

то есть 12 тактов это реальность? Да еще вопрос, почему число тактов плавает
11 - 12 - 13?

дальше добавил вот такой код

CODE
for(;;)
{
St1 = *((volatile u32 *)0x41C00008);
St2 = *((volatile u32 *)0x41C00018);

result = A;
result *= t;
result += B;
result *= t;
result += C;
result *= t;
result += D;
result *= t;
result += E;
result_t = t;
t+= dt;

En1 = *((volatile u32 *)0x41C00008);
En2 = *((volatile u32 *)0x41C00018);

xil_printf("\r\n(%d <=> %d), Start %d (%d), Stop %d(%d), Delta %d(%d)",((int)(result_t*1000)), ((int)(result*1000)), St1, St2, En1, En2, (En1-St1), (En2-St2));
}


и вот тут вообще странно, результат
(0 <=> 23134), Start 4665603 (4665555), Stop 4665619(4665577), Delta 16(22)
(5 <=> 29308), Start 5330851 (5330803), Stop 5330867(5330825), Delta 16(22)
(10 <=> 35488), Start 5996133 (5996085), Stop 5996149(5996107), Delta 16(22)
(15 <=> 41675), Start 6670053 (6670005), Stop 6670069(6670027), Delta 16(22)
(20 <=> 47867), Start 7343973 (7343925), Stop 7343989(7343947), Delta 16(22)
(24 <=> 54066), Start 8017896 (8017848), Stop 8017912(8017870), Delta 16(22)
(29 <=> 60271), Start 8691809 (8691761), Stop 8691825(8691783), Delta 16(22)
(34 <=> 66483), Start 9365733 (9365685), Stop 9365749(9365707), Delta 16(22)


0x41C00008 - это адрес таймераа + смещение на 8, то есть регистр счетчика вроде как...
почему блин между первыми таймерами разница 16, а между вторыми 22?

на шине только таймер да уарт, делить они вроде шину не должны или должны?
Вообщем кто может объяснить результат, и рассказать про оптимизацию, куда умножения то делись?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 19:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016