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

 
 
> Отключение плавучки и KGP
Ash_snz
сообщение Nov 5 2012, 14:39
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958



Господа. имеется тема для размышления.
Есть процессор мипсовый с сопроцессором для плавучки. 32-х разрядные вычисления делаются на отлично.
Цель попробовать отказаться от 32-х разрядов и все плавучие вычисления реализовать на 16 разрядах, соответственно не используя дополнительное ядро.

Я так понимаю один из вариантов -использование фиксированной запятой. Сам я с этим не сталкивался, кто знаком подскажите где можно изучить вопрос?

Второй вариант - перекинуть это на сильные плечи компилятора. Пробовал с помощью KGP и библиотек сбилденных на soft-float реализовать ту же программу. Компилятор ругается на многие андефайны, относящиеся к плавучке, хотя в libm их видно. Как итог - не собирается.

Кто, что может подсказать по этому вопросу?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ash_snz
сообщение Nov 10 2012, 16:56
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958



math.h на месте.
вот так ругается:
Код
(.text+OxleO): undefined reference to "_floatsisf'
main.о:  In function 'rs_transmit_digit':
(.text+Oxlf8):  undefined reference to "_floatsisf'
main, о:  In function    'rs_transmit_digit' :
(.text+0x204):  undefined reference to '_mulsf3'
main.о:  In function 'rs_transmit_digit1:
(.text+0x224):  undefined reference to '_fixsfsi'
main, о :  In function    rs_transmit_digit' :
(.text+0x808):  undefined reference to "_subsf31
main.o:  In function 'cycle_2_datchika':
(.text+0xac8):  undefined reference to "_addsf31
main.o:  In function "cycle_2_datchika1:
(.text+0xb2c): undefined reference to "_extendsfdf2'
main.o:  In function ''cycle_2_datchika' :
(.text+0xb58): undefined reference to "_divdf31
main.o:  In function 'cycle_2_datchika1:
(.text+Oxcdc): undefined reference to "_truncdfsf2'
main.o:  In function "cycle_2_datchika1:
( . text+0xce4) : undefined reference to   _truncdf sf 2 1
main.o:  In function vcycle_2_datchika1:
(.text+0xe48):  undefined reference to "_subdf3'
main.o:   In function "cycle_2_datchika1:
(.text+0xe68):  undefined reference to "_truncdfsf21
с:\kgp_mips_elf\mips-kgp-elf\lib\libm.a(lib_a-w_sqrt.o): In function "sqrf: (.text.sgrt+0x54):  undefined reference to -_ltdf21
с:\kgp_mips_elf\mips-kgp-elf\lib\libm.a(lib_a-w_sqrt.o): In function "sqrt": (.text.sqrt+0xa8):  undefined reference to "_divdf3'
c:\kgp_mips_elf\mips-kgp-elf\lib\libm.adib_a-e_sqrt.o):  In function "_ieee754__sqrt' :
(.text._ieee754_sqrt+0x34):  undefined reference to "_muldf3'
с:\kgp_mips_elf\mips-kgp-elf\lib\libm.a(lib_a-e_sqrt.o):  In function _ieee754_sqrt1 :
(.text._ieee754_sqrt+0x48):  undefined reference to "_adddf3'
с:\kgp_mips_elf\mips-kgp-elf\lib\libm.a(lib_a-e_sqrt.o):  In function "_ieee754_sqrt1:
(.text._ieee754_sqrt+0x84): undefined reference to *_subdf3'
с:\kgp_mips_elf\mips-kgp-elf\lib\libm.a(lib_a-e_sqrt.o):  In function "_ieee754_sqrt1:
(.text._ieee754_sqrt+0x98): undefined reference to "_divdf31
cs-make:  ***   [main.elf]   Error 1

Прям и не знаю что делать...

Цитата(klen @ Nov 9 2012, 04:03) *
я думаю решим вопрос, только зачем надевать штаны через голову если есть FPU, сдается что Вы не пытаетесь решить задачу а пытаетесь решить задачу так как Вам хочется.

рас уж поднялась тема про мипсы то можно по ходу и преесобрать все. какое ядро?
Ядро многострадального R3000 (комдив, вестимо sm.gif ). Дело даже не в том - как решить задачу. Это попытка научиться и попробовать работать без плавучки, а также выяснить разницу в производительности.
Вот только не понимаю, что можно пересобрать? у нас есть сборка под наш проц и lib.m как с плавучкой так и без, с плавучкой работает, а вот без - нет.

Чувствую где-то пробел в моих знаниях sm.gif
Go to the top of the page
 
+Quote Post
alx2
сообщение Nov 12 2012, 04:29
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Ash_snz @ Nov 10 2012, 21:56) *
math.h на месте.
вот так ругается:
Код
(.text+OxleO): undefined reference to "_floatsisf'
main.о:  In function 'rs_transmit_digit':

Так это у Вас вовсе не компилятор ругается, а линкер!
Следовательно, разбираться надо не с инклудами, а с библиотеками. Судя по именам символов, у Вас не подключена библиотека libgcc.


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Ash_snz
сообщение Nov 12 2012, 15:37
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958



Цитата(alx2 @ Nov 12 2012, 10:29) *
Так это у Вас вовсе не компилятор ругается, а линкер!
Следовательно, разбираться надо не с инклудами, а с библиотеками. Судя по именам символов, у Вас не подключена библиотека libgcc.
блин, как догадался? sm.gif пойду проверю.

и почему я так не могу догадаться?! sad.gif
Go to the top of the page
 
+Quote Post
alx2
сообщение Nov 13 2012, 11:02
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Ash_snz @ Nov 12 2012, 20:37) *
блин, как догадался? sm.gif пойду проверю.

Вы будете смеяться. sm.gif Я тупо погрепал имя символа по своим библиотекам. Сначала тут:
Код
alx% grep -rl _floatsisf /usr/local/arm-elf/lib
/usr/local/arm-elf/lib/thumb/libm.a
/usr/local/arm-elf/lib/libm.a

Но здесь этот символ оказался Undefined:
Код
alx% arm-elf-nm /usr/local/arm-elf/lib/libm.a|grep _floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf
         U __floatsisf

А вот тут он нашелся:
Код
alx% grep -rl _floatsisf /usr/local/lib/gcc/arm-elf
/usr/local/lib/gcc/arm-elf/4.5.2/plugin/include/insn-flags.h
/usr/local/lib/gcc/arm-elf/4.5.2/libgcc.a
/usr/local/lib/gcc/arm-elf/4.5.2/thumb/libgcc.a
/usr/local/lib/gcc/arm-elf/4.5.2/fpu/libgcc.a
alx% arm-elf-nm /usr/local/lib/gcc/arm-elf/4.5.2/libgcc.a |grep _floatsisf
000001d0 T __floatsisf


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Ash_snz
сообщение Nov 13 2012, 16:18
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958



Цитата(alx2 @ Nov 13 2012, 17:02) *
Вы будете смеяться. sm.gif Я тупо погрепал имя символа по своим библиотекам.

Благодарствую за подсказку! beer.gif
В итоге добавил libgcc и libg и все собралось. Скорость выполнения уменьшилась в 50 раз, точность (на удивление) осталась на том же уровне! /тестим дальше/

Остался последний и главный вопрос.
Существуют ли способы реализации плавучки, а точнее даже дробных вычислений не с 32-мя разрядами, а с 16-ю?
Понимаю, что для перехода придется изменять программу. вопрос в том как? Куда двигаться, кто знает?
может кто реализовывал вычисления на 16-ти разрядных системах без сопроцессоров?

Сообщение отредактировал Ash_snz - Nov 13 2012, 16:18
Go to the top of the page
 
+Quote Post
maksimp
сообщение Nov 13 2012, 17:14
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(Ash_snz @ Nov 13 2012, 19:18) *
Скорость выполнения уменьшилась в 50 раз,

Ядро ARM тратит около 50 тактов на сложение или умножение с 32 битной плавающей точкой при отсутствии аппаратной поддержки. То есть у вас аппаратно операции за 1 такт выполняются.
Цитата(Ash_snz @ Nov 13 2012, 19:18) *
точность (на удивление) осталась на том же уровне!

Если реализация аппаратного и программного вычисления соответствуют стандарту, то операциии + - * / дают чётко определённый результат. Поэтому так и должно быть.
Цитата(Ash_snz @ Nov 13 2012, 19:18) *
Существуют ли способы реализации плавучки, а точнее даже дробных вычислений не с 32-мя разрядами, а с 16-ю?

Есть такое. Ищите в сети "half precision floating point".
Есть даже процессоры с аппаратной поддержкой такого.
Go to the top of the page
 
+Quote Post
Ash_snz
сообщение Nov 14 2012, 17:03
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 12-05-11
Пользователь №: 64 958



Цитата(maksimp @ Nov 13 2012, 23:14) *
Ядро ARM тратит около 50 тактов на сложение или умножение с 32 битной плавающей точкой при отсутствии аппаратной поддержки. То есть у вас аппаратно операции за 1 такт выполняются.
Наше ядро тратит до 16 тактов на деление, на умножение до 8 кажется тактов.
Цитата(maksimp @ Nov 13 2012, 23:14) *
Если реализация аппаратного и программного вычисления соответствуют стандарту, то операциии + - * / дают чётко определённый результат. Поэтому так и должно быть.

Есть такое. Ищите в сети "half precision floating point".
Есть даже процессоры с аппаратной поддержкой такого.
Спасибо, уже ищу.


Цитата(cant @ Nov 14 2012, 00:06) *
скорее увеличилась biggrin.gif .

С точностью смотрите окуратно: у меня количество знаков после запятой было критично и вначале точность поплыла, увеличивал количество знаков после запятой, чтоб проходить по точности.
Как меняли количество знаков? что за методы?
Go to the top of the page
 
+Quote Post
cant
сообщение Nov 14 2012, 19:28
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 216
Регистрация: 28-10-08
Из: Брест
Пользователь №: 41 243



Цитата(Ash_snz @ Nov 14 2012, 21:03) *
Как меняли количество знаков? что за методы?


В общем ничего особенного: вначале из лонг два байта было на дробь, т.е точность 1/65536. потом добавил пол байта за счет уменьшения целой части - дипозон чисел позволял.

сделал это только там, где критична была погрешность, в остальном коде обычные числа.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ash_snz   Отключение плавучки и KGP   Nov 5 2012, 14:39
- - alx2   Цитата(Ash_snz @ Nov 5 2012, 19:39) Компи...   Nov 8 2012, 03:17
|- - Ash_snz   Цитата(alx2 @ Nov 8 2012, 09:17) Если Вы ...   Nov 8 2012, 14:37
|- - klen   я думаю решим вопрос, только зачем надевать штаны ...   Nov 8 2012, 22:03
||- - maksimp   Цитата(Ash_snz @ Nov 14 2012, 20:03) Наше...   Nov 14 2012, 18:14
|||- - Ash_snz   Цитата(maksimp @ Nov 15 2012, 00:14) Вы н...   Nov 15 2012, 16:38
|||- - maksimp   Цитата(Ash_snz @ Nov 14 2012, 20:03) Наше...   Nov 15 2012, 19:02
||||- - Ash_snz   Цитата(maksimp @ Nov 16 2012, 01:02) Тогд...   Nov 16 2012, 16:49
|||- - cant   Цитата(Ash_snz @ Nov 15 2012, 19:38) Да, ...   Nov 16 2012, 18:54
|||- - demiurg_spb   Цитата(cant @ Nov 16 2012, 22:54) Да. сво...   Nov 21 2012, 12:16
|||- - Ash_snz   Цитата(demiurg_spb @ Nov 21 2012, 18:16) ...   Nov 22 2012, 15:37
|- - cant   Цитата(Ash_snz @ Nov 13 2012, 20:18) Скор...   Nov 13 2012, 18:06
- - cant   если там ядро заточено для плавучки, то используйт...   Nov 10 2012, 20:15
- - Ash_snz   Цитата(cant @ Nov 11 2012, 02:15) если та...   Nov 11 2012, 08:14


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

 


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


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