Portál AbcLinuxu, 9. května 2025 14:19
Řešení dotazu:
Zdravim, Jinak bych si asi zkusil napsat sam nejaky assemblerovsky kod na to, cimz bych urcite zapusobil na porotu :DNepochybuju o tom, ze tvuj kod v assembleru bude radove vykonnejsi, nez knihovni funkce. Zabyvat se podobnou - podle mne nesmyslnou - uvahou o optimalizci vypoctu odmocniny v kontextu programu na rizeni koptery je ucebnicovy priklad uviznuti v detailu, ktery na porotu jiste zapusobi, mozna ale ne tim zpusobem, ktery ocekavas. Naprogramuj to s knihovni funkci, profiluj, a pak pripadne optimalizuj.
Ocividne jste analyzu obrazu nikdy nedelal a nevite, jak dlouho to trva a na cem to vazne.Mě přijde, že vy na tom nejste o moc lépe. Nevím, co konkrétně tam řešíte, ale pokud jde o rychlost výpočtu, tak se spousta věcí dá řešit pomocí lookup tabulek, pro float vstup se pak dá použít lineární interpolace hodnot z tabulky. Ale na samotné sqrt, sin aj. se to skoro určitě nevyplatí, protože HW implementace často nějakou formu LUT používá. Pokud ale výpočet jde sloučit do nějakého black boxu „hodím dovnitř číslo/čísla, vyhodí to výsledek“ a vstup je nějak rozumně omezen, tak je LUT většinou dobrá volba. Tabulka může být i vícerozměrná, ale její velikost je pak mnohem větší a chce si to opravdu dávat pozor na to, jestli její použití kvůli případným cache misses nebude pomalejší než to počítat normálně. Další věc je, že jít do assembleru se většinou vyplatí jen v případě, kdy se problém dá dobře řešit pomocí SIMD instrukcí, což je k ničemu, protože RPi nemá NEON. Mnohem víc se získá upravením algoritmu (něco různě ošidit a podobně). Třeba u analýzy obrazu se často dá dobře využít časové koherence a počítat jen změny.
Nepochybuju o tom, ze tvuj kod v assembleru bude radove vykonnejsi, nez knihovni funkce.Jsem si celkem jist, že tomu bude naopak. Leda by využil specifických podmínek daných konkrétním problémem. Ale to je problém spíš matematický, než programovací. Tady je lepší se zamyslet nad nahrazením pomalých operací něčím jiným – předpočítané tabulky, aproximace polynomem, kešování mezivýsledků, … Taková předpočítaná tabulka hodnot často používaných vzorečků by mohla hodně pomoct. Pokud má málo významných číslic, je použité množství paměti celkem malé. Například tabulka 11bit int na 16bit int zabere 4KB, což se při troše štěstí vejde do L1 cache. Další a mnohem zajímavější možností je použít grafický čip k výpočtům. Nevím jak moc Malina podporuje OpenCL, ale možná by jsi mohl aspoň něco implementovat pomocí shaderů.
Nevím jak moc Malina podporuje OpenCLMyslím, že vůbec. A i kdyby, tak než se dočká výsledku z OpenCL, tak mu to spadne :) (musí počítat víc věcí paralelně a je tam laaaaaag) Já myslím, že pokud má problém řídit quadcopteru s takto výkonným procesorem, chyba bude jinde než v pomalém počítání odmocnin a trigonometrie. Jsou i elektroniky s 8bit AVR na 24 MHz a funguje to.
sqrtf
.
1.f/Q_rsqrt(x)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.