Намалете точността на плаваща запетая в python, за да увеличите производителността

Работя с python на raspberry pi. Използвам допълнителен филтър, за да получа по-добри стойности от жироскопа, но той изяжда твърде много мощност на малината - това е около 70%. Мислех, че мога да повиша производителността чрез намаляване на точността на плаваща запетая. Сега резултатите имат около 12 знака след десетичната запетая, това е много повече, отколкото ми трябва. Има ли някакъв начин да зададете максимална точност? Самото закръгляване на числото не отговаря на нуждите ми, тъй като това е просто друго изчисление. Благодаря!

Редактиране: Опитах се да използвам модул Decimal и с прецизност, зададена на 6, беше почти 6 пъти по-бавен от float! Има ли някакъв друг начин за работа с числа с фиксирана запетая освен Decimal (изглежда, че е създаден за по-висока точност, отколкото за производителност)


person ametis    schedule 09.07.2014    source източник
comment
Нямате ли нужда от плаваща запетая? Какво не е наред с аритметиката с фиксирана точка?   -  person Willem Van Onsem    schedule 09.07.2014
comment
@CommuSoft: О, вероятно съм разбрал нещо погрешно. Как мога да настроя променлива в python да бъде с фиксирана точка? Ако мога, това ще бъде най-доброто решение.   -  person ametis    schedule 09.07.2014
comment
И така, опитах се да използвам Decimal, за да задам точност... и това е дори по-лошо от обикновеното плаващо число:/   -  person ametis    schedule 09.07.2014
comment
Опитвали ли сте gmpy (aleax.it/gmpy.html)? или cdecimal?   -  person Willem Van Onsem    schedule 09.07.2014


Отговори (2)


Можете да принудите изчисления с плаваща запетая с единична точност, като използвате numpy.

Обаче бих бил много изненадан, ако използването на плаваща запетая с единична точност работи по-бързо от двойна точност: raspberry pi има хардуерна поддръжка на плаваща запетая, така че бих очаквал всички изчисления да се извършват с пълна 80-битова точност и след това да се закръглят за 32-битова или 64 битови резултати при запис в паметта. Единствената възможна печалба би била малко по-малка честотна лента на паметта, използвана при запазване на стойностите.

person Duncan    schedule 09.07.2014
comment
Откъде идва 80-битовата точност? - person Diego Herranz; 10.07.2014
comment
80 бита е разширената точност, използвана вътрешно на x87 архитектури, за да се избегне загуба на точност по време на изчисления. Не знам дали ARM прави същото или използва само 64 бита вътрешно. - person Duncan; 10.07.2014

Възможно е да имате грешния край на пръчката.

Потокът от данни от жироскоп е доста бавен, така че трябва да имате достатъчно време да го филтрирате с всеки разумен филтър. Дори филтърът на Калман трябва да е използваем (макар и вероятно ненужен). Колко често вземате проби от данните от жироскопа и акселерометъра? Разумните максимални стойности са няколкостотин херца, не повече.

Допълнителният филтър за измерване на акселерометър и жироскоп е много лек и сам по себе си трябва да консумира много малко мощност за обработка. Може да се внедри на бавен 8-битов процесор, така че Raspberry е твърде бърз за него.

В зависимост от това какво правите с допълнителния филтър, самият филтър се нуждае от няколко операции с плаваща запетая. Ако изчислявате аркус тангенси или еквивалентни функции, това ще изисква стотици FLOPs. Ако направите това със скорост от 1 kHz, ще консумирате може би няколкостотин kFLOPS (Операции с плаваща запетая за секунда). FP пропускателната способност на RPi е приблизително 100 MLFOPS, така че има голям марж.

Следователно намаляването на точността на FP няма да помогне значително, проблемът е другаде. Може би, ако покажете малко повече от кода си, може да се определи къде е проблемът!

person DrV    schedule 09.07.2014
comment
Честотата на опресняване е 10 ms (100 Hz), така че трябва да има някаква лоша грешка :/ Ще коригирам кода си отново. - person ametis; 09.07.2014
comment
Добре. Имах лошо състояние в цикъла while и отне цялата мощност на процесора... сега използването е около 1-3%. Съжалявам за това. - person ametis; 09.07.2014
comment
@ametis: Няма нужда да съжалявате, бъговете наистина изпълзяват. Радвам се да чуя, че сега работи добре! - person DrV; 09.07.2014