|
плавающая точка |
|
|
|
Aug 16 2007, 11:48
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
пример проекта умножения с плавающей точкой. работает быстрее, чем стандартная Си операция благодаря использованию аппаратного умножителя. Подходит только для серии Mega
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Aug 16 2007, 14:42
|

Частый гость
 
Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334

|
Цитата(dimka76 @ Aug 16 2007, 18:48)  работает быстрее, чем стандартная Си операция благодаря использованию аппаратного умножителя. Причём тут аппаратный умножитель? ИАР его уже давно использует. Выигрыш действительно есть 173цикла против 210 ИАРовских, но это не за счёт умножителя, а за счёт уменьшения гибкости реализации(перемножение только фиксированных переменных).
--------------------
Всяк хорошая мысля к нам приходит опосля.
|
|
|
|
|
Aug 17 2007, 05:04
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(Proton @ Aug 16 2007, 18:42)  Причём тут аппаратный умножитель? ИАР его уже давно использует. Выигрыш действительно есть 173цикла против 210 ИАРовских, но это не за счёт умножителя, а за счёт уменьшения гибкости реализации(перемножение только фиксированных переменных). Попробуйте написать такой код: void main(void) { float a = 4.56789; float b = 10.45321; // или любые другие цифры a = a*b; } И посмотрите сгенерированный IARом ассемблерный код. И никаких mul вы там не увидите. А время выполнения составит порядка 600 тактов. На asme порядка 200 - 300 тактов.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Aug 17 2007, 09:01
|
Частый гость
 
Группа: Свой
Сообщений: 151
Регистрация: 11-01-06
Из: Украина Ровно
Пользователь №: 13 066

|
iar 430a не купленный, лицензия сгенерирована. Оптимизация отключена. мега48 195 тактов. MUL используется вовсю. Вот кусок (не весь) полученного кода: +000003A2: 9F04 MUL R16,R20 Multiply unsigned +000003A3: 01F0 MOVW R30,R0 Copy register pair +000003A4: 9F05 MUL R16,R21 Multiply unsigned +000003A5: 0DF0 ADD R31,R0 Add without carry +000003A6: 2D71 MOV R23,R1 Copy register +000003A7: 1F73 ADC R23,R19 Add with carry +000003A8: 9F14 MUL R17,R20 Multiply unsigned +000003A9: 0DF0 ADD R31,R0 Add without carry +000003AA: 1D71 ADC R23,R1 Add with carry +000003AB: 1C22 ROL R2 Rotate Left Through Carry +000003AC: 9F06 MUL R16,R22 Multiply unsigned +000003AD: 0D70 ADD R23,R0 Add without carry +000003AE: 1C21 ADC R2,R1 Add with carry +000003AF: 1C33 ROL R3 Rotate Left Through Carry +000003B0: 9F15 MUL R17,R21 Multiply unsigned +
Сообщение отредактировал aleksey_g - Aug 17 2007, 09:18
|
|
|
|
|
Aug 17 2007, 11:30
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(aleksey_g @ Aug 17 2007, 13:01)  iar 430a не купленный, лицензия сгенерирована. Оптимизация отключена. мега48 195 тактов. MUL используется вовсю. Вот кусок (не весь) полученного кода: +000003A2: 9F04 MUL R16,R20 Multiply unsigned +000003A3: 01F0 MOVW R30,R0 Copy register pair +000003A4: 9F05 MUL R16,R21 Multiply unsigned +000003A5: 0DF0 ADD R31,R0 Add without carry +000003A6: 2D71 MOV R23,R1 Copy register +000003A7: 1F73 ADC R23,R19 Add with carry +000003A8: 9F14 MUL R17,R20 Multiply unsigned +000003A9: 0DF0 ADD R31,R0 Add without carry +000003AA: 1D71 ADC R23,R1 Add with carry +000003AB: 1C22 ROL R2 Rotate Left Through Carry +000003AC: 9F06 MUL R16,R22 Multiply unsigned +000003AD: 0D70 ADD R23,R0 Add without carry +000003AE: 1C21 ADC R2,R1 Add with carry +000003AF: 1C33 ROL R3 Rotate Left Through Carry +000003B0: 9F15 MUL R17,R21 Multiply unsigned + а какие настройки проекта Цитата(aleksey_g @ Aug 17 2007, 13:01)  iar 430a не купленный, лицензия сгенерирована. Оптимизация отключена. мега48 195 тактов. MUL используется вовсю. Вот кусок (не весь) полученного кода: +000003A2: 9F04 MUL R16,R20 Multiply unsigned +000003A3: 01F0 MOVW R30,R0 Copy register pair +000003A4: 9F05 MUL R16,R21 Multiply unsigned +000003A5: 0DF0 ADD R31,R0 Add without carry +000003A6: 2D71 MOV R23,R1 Copy register +000003A7: 1F73 ADC R23,R19 Add with carry +000003A8: 9F14 MUL R17,R20 Multiply unsigned +000003A9: 0DF0 ADD R31,R0 Add without carry +000003AA: 1D71 ADC R23,R1 Add with carry +000003AB: 1C22 ROL R2 Rotate Left Through Carry +000003AC: 9F06 MUL R16,R22 Multiply unsigned +000003AD: 0D70 ADD R23,R0 Add without carry +000003AE: 1C21 ADC R2,R1 Add with carry +000003AF: 1C33 ROL R3 Rotate Left Through Carry +000003B0: 9F15 MUL R17,R21 Multiply unsigned + а подскажите где лекарство брали
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Aug 17 2007, 16:10
|

Частый гость
 
Группа: Свой
Сообщений: 185
Регистрация: 3-08-05
Из: Новосибирск
Пользователь №: 7 334

|
Цитата(dimka76 @ Aug 16 2007, 12:04)  Попробуйте написать такой код:
void main(void) { float a = 4.56789; float b = 10.45321; // или любые другие цифры
a = a*b; } Код писал и даже привёл результаты его выполнения в тактах. Или Вы считаете что если изменить сомножители аппаратный умножитель не будет использоваться? Цитата(dimka76 @ Aug 16 2007, 18:48)  пример проекта умножения с плавающей точкой. Подходит только для серии Mega А по какой причине происходит дискриминация семейства tiny? Ведь оперативки требуется около 70 байт, практически у всех контроллеров семейства tiny её больше. Компилируется и работает это всё на них без проблем, или может я что-то не так делаю?
--------------------
Всяк хорошая мысля к нам приходит опосля.
|
|
|
|
|
Aug 20 2007, 04:38
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(Proton @ Aug 17 2007, 20:10)  Код писал и даже привёл результаты его выполнения в тактах. Или Вы считаете что если изменить сомножители аппаратный умножитель не будет использоваться? А по какой причине происходит дискриминация семейства tiny? Ведь оперативки требуется около 70 байт, практически у всех контроллеров семейства tiny её больше. Компилируется и работает это всё на них без проблем, или может я что-то не так делаю? У меня IAR 4.11 и при использовании операций с плавающей точкой компилятор не использует аппаратный умножитель. При любых сочетаниях сомножителей. У тини нет аппаратного умножителя.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|