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

 
 
 
Reply to this topicStart new topic
> Время преобразования int --> float, Хотелось бы побыстрей...
Andy_F
сообщение Apr 10 2009, 21:46
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



При изучении времени выполнения операций с плавающей точкой (IAR EWAVR 4.30A) выяснилось, что сами операции выполняются относительно быстро (умножение - ~90 тактов, деление - ~90 тактов, логарифм - ~240 тактов...). Но преобразование из int во float занимает чудовищное время - ~1600 тактов. Имеется в виду элементарная операция вида:

Код
int   a;
float b;
...
  b = a;
...


То есть, взяли мы отсчёт АЦП, и для вычисления чего-либо с плавающей точкой, должны сперва потратить 1600 циклов на преобразование. А если отсчёт не один...

Так вот, вопрос, - не существует ли способа ускорить этот процесс ? Рассматривание листинга дизассемблера показало, что в этом месте вызывается функция SL2F, предполагаю - SignedLong2Float. Не существует ли способа "сказать" компилятору, что следует использовать, допустим, SI2F (SignedInt2Float) ?
Go to the top of the page
 
+Quote Post
*antzol*
сообщение Apr 11 2009, 02:28
Сообщение #2


Участник
*

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



А если сделать так?
Код
int   a;
float b;
...
  b = (float)a * 1.25;  // какие-то вычисления с отсчетом АЦП
...


Сообщение отредактировал *antzol* - Apr 11 2009, 02:29
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 11 2009, 05:40
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше.

А вообще надо стараться работать только с целыми числами.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Apr 11 2009, 09:28
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Цитата(*antzol* @ Apr 11 2009, 06:28) *
А если сделать так?
Код
int   a;
float b;
...
  b = (float)a * 1.25;  // какие-то вычисления с отсчетом АЦП
...

Нет, от явного приведения типа ничего не меняется.

Цитата(Rst7 @ Apr 11 2009, 09:40) *
Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше.

Спорить про деление не буду, не оно меня в данном случае интересует.

Цитата(Rst7 @ Apr 11 2009, 09:40) *
А вообще надо стараться работать только с целыми числами.

Большинство функций модуля math работают именно с плавающей точкой. Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед". А здесь такая беда...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 11 2009, 10:10
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед".


А придется. Иначе Вам в соседние ветки - ARM, MIPS, PPC - выбираете по возрастанию производительности и цены, прямо коррелирующие с количеством "готовых библиотек". Дабы не слыть флудерастом скажу - выкладывайте свою математику, поможем Вам сделать ее целочисленной.

Цитата
Спорить про деление не буду, не оно меня в данном случае интересует.


Это был намек wink.gif Подумайте, какие операции надо выполнить процессору при преобразовании int->float. Намекаю более конкретно - пока старший бит не равен 1 сдвигаем влево, заодно увеличивая дополнительный счетчик (знак можно обработать отдельно). После выполнения этого цикла результат сдвига - суть мантиса, счетчик - суть порядок. Ну плюс еще туда-сюда данные приготовить. Итого - мизер, а никак не 1600 тактов. Это нормальное число для деления, но не для преобразования типов. Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Apr 11 2009, 12:42
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Цитата(Rst7 @ Apr 11 2009, 14:10) *
Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект.

smile.gif
Go to the top of the page
 
+Quote Post

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

 


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


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