Diskuze: Optimalizace (přesunutá diskuse)
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 33 zpráv z 33.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Pokud jsi velká firma se stádem programátorů tak ano, jinak ani omylem.
Allegro sice není moderní, ale je velmi jednoduché. Otázka je, jak umí
ten jazyk, ale já když jsem začínal s allegrem tak jsem v C/C++ neznal
ještě ani funkce, a naučil sem se ho hned
C++ se spíš upřednostňuje proto, že v C# je nutné rychlé programy psát objektově a to každý nezvládne. C++ snese i smíšený přístup.
No zatím ho tu Honza už týden instaluje, tak nevím Navíc mi C++ nepřijde vůbec jako
vhodný jazyk, když dělá v GameMakeru. Co jsem viděl počiny do
Devbookátoru v Allegru, tak po několitýdenní práce byli schopni přehrát
zvuk a zobrazit průhledný obrázek, tím mě Allegro tedy moc
nepřesvědčilo.
Je to hlavně o rychlosti, profesionální hry mají spoustu zátěže (fyzika, stovky grafických efektů), které se v amatérských hrách neobjeví.
Ano, 95% "velkých" her se píše v C++, je to především kvůli rychlosti.
Sdraco: i malé firmy s pár programátory mohou psát v C++, treba kamos dela sam po vecerech v C++ 3D engine, uz ma planetu, kde muzes odzoomovat do vesmiru a nebo prizoomovat az treba na snezku, ma tam vodu, naky stromy, tusim, ze uz i mraky...
Allegro je jednoduché na naučení, ale moc toho neumí.
http://leteckaposta.cz/992005420
Já v allegru psal tohle. Přihlašoval jsem to do devbookátoru téměř ve
stejném stavu jako je to teď, nebyl čas ani nálada něco tam přidělávat.
Tohle jsem ale napsal za pár dní a engine je plně funkčí, už v podstatě
stačí jenom dávat cihly které chci, tam kam chci. Plus přidělat menu,
nastavení a nějaké ukládání. Co se týká nějakých hezkých efektů tak
toho v allegru moc neuděláš.
Jinak ve výkonu bych řekl, že allegro na tom také není nejlépe, přijde mi
že hrozně pomalu vykresluje.
Já začal s C++ proto, že už mě přestával bavit Gamemaker.
Luckin: Allegro bylo pomalé, dokud nevyšlo Allegro 5.
Je však spousta tříd, které jsou napsány v C++, ale jsou použitelné v C#. Pokud je programátor umí používat, dostane se s výkonem na podobné hodnoty.
Jen asi 10 % programu má smysl výkonnostně optimalizovat. Pokud se pro těchto 10 % využijí patřičné systémové knihovny, aplikace je velmi rychlá i v C# či Javě.
Satik napísal:
...treba kamos dela sam po vecerech v C++ 3D engine, uz ma planetu...
Predpokladám, že nepoužíva allegro, ale niečo iné. Nie?
Když už mluvíš o těch třídách napsaných v C++. Můžu se podělit o zajímavý fakt. Měřil jsem v C++ rychlost naplnění pole o 200M prvcích a to samé s vectorem z STL. U pole to trvalo cca 650 - 700 ms, vektor se naplnil za cca 450 ms. Docela by mě zajímalo, v čem nabo jak je napsaný vector, že se s ním pracuje rychleji než s polem.
Sorry, mám pocit že píšem blbiny.
Používá přímo DirectX, i když si teď nejsem jistý, jestli to nepřepisoval do OpenGL.
Můžeš mi ten zdroják poslat?
Kouknul bych se na to a řekl ti, protože Vector by měl být pomalejší, má nějakou režii.
Zkoušel jsi to v Release módu?
Kompilátory mívají k dispozici optimalizace, které není radno v běžných případech zapínat, ale v některých případech mohou zvýšit výkon konkrétní knihovní funkce.
Konkrétně se v C++ se velmi často používá pro práci s polem počítaný cyklus. Při vhodné optimalizaci zůstává řídící proměnná v registru. Při ještě větší optimalizaci se v určitých případech dá celý cyklus vykonat jednou strojovou instrukcí procesoru, jenže se to nevyplatí pro malá pole (musí se předem těch registrů plnit víc).
Také firma vyvíjející knihovny může mít lepší (a dražší) kompilátor C++, který mezi lidi nepustí, aby měla výkonnostní převahu nad konkurencí. Někdy stačí jen přehodit dvě nezávislé strojové instrukce a zvýší to výkon.
Sorry kluci, já nechtěl rozpoutat III. světovou
Tohle je takový menší boj A ještě vcelku se dobře čte
... ale možná by moderátoři
potom mohli začít hlídat
Ale aspoň zase vím něco víc
A to nám říkáš jen tak se zapnutým laserovým mečem v ruce?
Tohle přece není válka, jen si vyměňujeme zkušenosti s optimalizací.
Těmi instrukcemi nahrazujícími cyklus jsi myslel třeba REP, REPE a REPNE
instrukce?
Jen škoda, že se nedají moc využít třeba pro hledání v UTF8
A ani nevím, jaký je u nich rozdíl v rychlosti oproti běžnému cyklu,
někdy to budu muset zkusit
Jinak kompilátorů je spousta, třeba ten od intelu je docela rychlý.
A ono pak už i záleží na procesoru, protože různé instrukce na různých procesorech trvají různě dlouho (i když ty počty cyklů jsou většinou dost podobné) a jak psal Kit, občas záleží i na pořadí instrukcí (třeba kvůli latenci paměti).
Vecer na to kouknu, ted jsem jeste v praci a dorazil ted sef
libcosenior: tak to predelal do OpenGL
kit: optimalizací bych se nebál, kompilátor většinou ví, co dělá
Jinak u cyklů se z optimalizací (kromě řídící proměnné v registru u
cyklů, kde není moc kódu v těle cyklu) ještě často používá unrolling,
čímž se snižuje režie cyklu.
Už na to koukám, v obou případech se celý cyklus zkompiluje do jedné instrukce REP STOS (protože celé pole plníš konstantou), ještě kouknu, proč je vector rychlejší.
Zkoušel jsem takhle naplnit i objekt vlastní třídy pro práci s poli, trvalo to stejně dlouho jako u pole nebo byl ten rozdíl naprosto minimální, a to ta moje třída ještě kontroluje, zda index není mimo hranice pole.
Problém je v cache.
Při vytváření vectoru se hodnoty jeho prvků inicializují, takže se na ně šahá a jsou nacachované (nejen cache procesoru, ale hlavně jsou při tom namapované i stránky ve virtuální paměti, takže nedochází k neplatnosti stránky (page fault)).
Řešením je pak buďto na hodnoty pole před testem nějak šáhnout (třeba inicializovat hodnoty cyklem) nebo je možné hned při deklaraci, místo
int* arr = new int[size];
použít
int* arr = new int[size]();
Pak už je pole stejně rychlé jako vector.
A jinak co jsem si s tím zkoušel hrát, tak pokud bys místo konstantní hodnoty přiřazoval něco jiného, tak když je to možné, tak se to kompilátor (namísto REP STOS instrukce) snaží urychlit přes MMX instrukce.
Ono z cykly jde, co se týče optimalizace, dělat spoustu věcí. Záleží také na tom, jaké možnosti dává k dispozici procesor: například zda disponuje nějakými instrukcemi pro vektorové počítání atd. Cyklus pak lze například nahradit menším počtem vektorových instrukcí, rozvinout tak, že jedna iterace nového provádí více iterací cyklu originálního. Když překladač vidí několik vnořených cyklů a zjistí, že přerovnání operací prováděných v tom nejvnitřnějším nenej nezpůsobí nežádoucí vedlejší účinky, ale také lépe rozloží závislosti jednotlivých operací, může klidně prohodit pořadí zanoření cyklů.
Těch optimalizací je dost a netýkají se jenom cyklů. Záleží ale na programovacím jazyce (čím toho víc umí, tím hůře), procesoru a nastavení překladače. Například prohazování vnitřního a vnějšího cyklu jsem viděl i v praxi. S vektorizací jsem si nikdy moc nehrál, nějak se mi nepodařilo Visual Studio příslušně nastavit.
Jinak umisťování proměnné do registru může znamenat problémy v případě, že k ní aplikace přistupuje z více vláken souběžně. Což samozřejmě za předpokladu, že aktuální hodnota proměnné se nenachází v paměti, ale v registru, nedává správné výsledky.
Někdy může být zajímavé se podívat, jakým způsobem jsou
implementovány funkce jako memset či
memmove. Člověk by řekl, že to udělají jedním cyklem,
ale například na x64 mají tyhle rutiny větší množství verzí, které se
aplikují v závislosti na tom, kolik bajtů se kopíruje/přepisuje. A
používají instrukce, které jsem předtím nikde neviděl .
int* arr = new int[size]();
Tohle mi vyhodilo chybu - out of memory allocating 65536 bytes
V čem to kompiluješ?
A kolik máš volné RAMky?
Mě to běží v pohodě, zabírá to asi 800 MB.
Dev-C++, ramky mam dost, tu chybu hází už kompilátor, kdyby to bylo nedostatkem paměti, tak to spadne za běho, v tom případě new hází výjimku.
Hm, tak to ti asi nepomuzu, v Visual Studiu mi to bezi bez problemu, zkus se pohrabat nekde v nastaveni a zvysit limit pameti pro haldu, jestli neni defaultne nejaky nizsi, ale pak by bylo divny, ze ti to bez tech zavorek jelo.
Zobrazeno 33 zpráv z 33.