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

 
 
> Отключение плавучки и 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
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
alx2
сообщение Nov 8 2012, 03:17
Сообщение #2


Местный
***

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



Цитата(Ash_snz @ Nov 5 2012, 19:39) *
Компилятор ругается на многие андефайны, относящиеся к плавучке, хотя в libm их видно.

Кто, что может подсказать по этому вопросу?

Если Вы уточните, на какие именно "андефайны" ругается компилятор, нам, вероятно, будет легче что-либо подсказать.
Пока могу лишь предположить, что Вы забыли #include <math.h>...


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


Участник
*

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



Цитата(alx2 @ Nov 8 2012, 09:17) *
Если Вы уточните, на какие именно "андефайны" ругается компилятор, нам, вероятно, будет легче что-либо подсказать.
Пока могу лишь предположить, что Вы забыли #include <math.h>...

Хм. Надо проверить. math.h не должен был никуда отвалиться. Отпишу обязательно.
Go to the top of the page
 
+Quote Post
klen
сообщение Nov 8 2012, 22:03
Сообщение #4


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



я думаю решим вопрос, только зачем надевать штаны через голову если есть FPU, сдается что Вы не пытаетесь решить задачу а пытаетесь решить задачу так как Вам хочется.

рас уж поднялась тема про мипсы то можно по ходу и преесобрать все. какое ядро?
Go to the top of the page
 
+Quote Post
Ash_snz
сообщение Nov 10 2012, 16:56
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
cant
сообщение Nov 10 2012, 20:15
Сообщение #6


Местный
***

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



если там ядро заточено для плавучки, то используйте и не парьтесь.


Занимался когда-то по необходимости (по скорости не пролазил в p30F6014A).

Еще нужно после перевода матиматики обязательно сделать расчет на ошибку, т.к. ошибка полюбому выше будет

вот пример фикс числа для ДСпик:

Код
#define fixed long
fixed pi =        0x3243f;            // 3,14


fixed sin_fixed(fixed x){
    unsigned char a;
    fixed x_to_pi; // = x * pi / 180;
    fixed res = x * pi / 180;

    if ( x >=0 && x<=90 ){
        a = 1;
        x_to_pi = res;
    }
    if ( x >90 && x<=180 ){
        a = 1;
        x_to_pi = -1*(res - pi);
    }
    if ( x >180 && x<=270 ){
        a = -1;
        x_to_pi = res - pi;
    }
    if ( x >270 && x<360 ){
        a = -1;
        x_to_pi = -1*(res - pi<<1);
    }
    
    fixed s = (( x_to_pi * x_to_pi ) >> 15);
    res = (x_to_pi * ((s/6) * ((s/20) - (1<<15)) + (1<<15) )) >> 15;

    if(a>0){
        return   res;
    }
    else{
        return -1 * res;
    }
}



PS сейчас сижу пытаюсь догнать что тогда накидал wacko.gif . И как понять как он работает ??? blink.gif

Сообщение отредактировал cant - Nov 10 2012, 20:25
Go to the top of the page
 
+Quote Post
Ash_snz
сообщение Nov 11 2012, 08:14
Сообщение #7


Участник
*

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



Цитата(cant @ Nov 11 2012, 02:15) *
если там ядро заточено для плавучки, то используйте и не парьтесь.
Занимался когда-то по необходимости (по скорости не пролазил в p30F6014A).
Еще нужно после перевода матиматики обязательно сделать расчет на ошибку, т.к. ошибка полюбому выше будет
вот пример фикс числа для ДСпик:
PS сейчас сижу пытаюсь догнать что тогда накидал wacko.gif . И как понять как он работает ??? blink.gif

т.е. мне без вариантов нужно переписать под себя математику? немного печально, но предсказуемо...
Go to the top of the page
 
+Quote Post
alx2
сообщение Nov 12 2012, 04:29
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 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
cant
сообщение Nov 13 2012, 18:06
Сообщение #13


Местный
***

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



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


скорее увеличилась biggrin.gif .

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


Участник
*

Группа: Участник
Сообщений: 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
maksimp
сообщение Nov 14 2012, 18:14
Сообщение #15


Местный
***

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



Цитата(Ash_snz @ Nov 14 2012, 20:03) *
Наше ядро тратит до 16 тактов на деление, на умножение до 8 кажется тактов.

Вы наверное про целочисленные операции. Деление вроде до 12 тактов, умножние 1 или 2.
А я имел в виду вычисления с плавающей точкой без аппаратной поддержки. То есть специальная процедура, используя множество целочисленных команд, выделяет знак, мантиссу, порядок, проверяет операнды на INF и NAN, потом всё это обрабатывает и формирут результат. Это гораздо дольше. Деление около 200 тактов.
Go to the top of the page
 
+Quote Post

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

 


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


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