Andy_F 0 10 апреля, 2009 Опубликовано 10 апреля, 2009 · Жалоба При изучении времени выполнения операций с плавающей точкой (IAR EWAVR 4.30A) выяснилось, что сами операции выполняются относительно быстро (умножение - ~90 тактов, деление - ~90 тактов, логарифм - ~240 тактов...). Но преобразование из int во float занимает чудовищное время - ~1600 тактов. Имеется в виду элементарная операция вида: int a; float b; ... b = a; ... То есть, взяли мы отсчёт АЦП, и для вычисления чего-либо с плавающей точкой, должны сперва потратить 1600 циклов на преобразование. А если отсчёт не один... Так вот, вопрос, - не существует ли способа ускорить этот процесс ? Рассматривание листинга дизассемблера показало, что в этом месте вызывается функция SL2F, предполагаю - SignedLong2Float. Не существует ли способа "сказать" компилятору, что следует использовать, допустим, SI2F (SignedInt2Float) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
*antzol* 0 11 апреля, 2009 Опубликовано 11 апреля, 2009 (изменено) · Жалоба А если сделать так? int a; float b; ... b = (float)a * 1.25; // какие-то вычисления с отсчетом АЦП ... Изменено 11 апреля, 2009 пользователем *antzol* Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 11 апреля, 2009 Опубликовано 11 апреля, 2009 · Жалоба Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше. А вообще надо стараться работать только с целыми числами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_F 0 11 апреля, 2009 Опубликовано 11 апреля, 2009 · Жалоба А если сделать так? int a; float b; ... b = (float)a * 1.25; // какие-то вычисления с отсчетом АЦП ... Нет, от явного приведения типа ничего не меняется. Чтото неправильно у вас с данными по тактам. Деление никак не 90. Смотрите лучше. Спорить про деление не буду, не оно меня в данном случае интересует. А вообще надо стараться работать только с целыми числами. Большинство функций модуля math работают именно с плавающей точкой. Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед". А здесь такая беда... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 11 апреля, 2009 Опубликовано 11 апреля, 2009 · Жалоба Хотелось бы пользоваться готовой библиотекой, а не "изобретать велосипед". А придется. Иначе Вам в соседние ветки - ARM, MIPS, PPC - выбираете по возрастанию производительности и цены, прямо коррелирующие с количеством "готовых библиотек". Дабы не слыть флудерастом скажу - выкладывайте свою математику, поможем Вам сделать ее целочисленной. Спорить про деление не буду, не оно меня в данном случае интересует. Это был намек ;) Подумайте, какие операции надо выполнить процессору при преобразовании int->float. Намекаю более конкретно - пока старший бит не равен 1 сдвигаем влево, заодно увеличивая дополнительный счетчик (знак можно обработать отдельно). После выполнения этого цикла результат сдвига - суть мантиса, счетчик - суть порядок. Ну плюс еще туда-сюда данные приготовить. Итого - мизер, а никак не 1600 тактов. Это нормальное число для деления, но не для преобразования типов. Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Andy_F 0 11 апреля, 2009 Опубликовано 11 апреля, 2009 · Жалоба Надо бы Вам еще внимательно покурить теорию работы с float'ами, а потом уже браться за проект. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться