Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Zarovnání + předání hodnotou

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Zarovnání + předání hodnotou

Autor: ssemaniak

19:16:05 04.02.2010

Nakonec jsem přidal ten #error, jen jsem ještě rozšířil hlášku, snad to bude ok. Tekže děkuju, aspoň vím, že lepší řešení asi není. Ta změna rozhraní podle návrh p. Zezuly by asi taky nebyl špatný nápad, budu si to pamatovat, až se do něčeho podobného pustím příště.

Teď k tomu měření. Jedná se o knihovnu několika utilit především pro práci s grafikou, tzn. matice 4x4, 3,4-prvkové vektory, dále pár funkcí na raytracing, stromy, jednoduché kolize, ale i primitivní verze Levenberg-Marquardt, Simplexová metoda, Mersenne Twister apod. Prostě "užitečné" blbiny, které jsem postupem času potřeboval, jsem do ní shrnul. Do SSE jsem zatím předělal jen matice a vektory a popravdě, jediná operace, která se tam použitím SSE nezrychlila (to jsem testoval už při vývoji) byl skalární součin, všechno ostatní je oproti FPU na mém stroji rychlejší. Skalární součin by se dostal rychlostně na úroveň FPU jen s použitím _mm_dp_ps, ale jelikož by to pak byla jediná použitá instrukce ze SSE4, tak jsem jí kvůli lepší kompatibilitě nepoužil a nechal sklární součin ve FPU.
Měřil jsem pár operací nad vektory a maticemi. Samotné měření jsem provedl pomocí rdtsc před a po provedením operace, výsledné číslo je v taktech přímo z rozdílu obou rdtsc. Měří se na sadě 256 náhodně vygenerovaných instancí (ale pro každé měření stejných). Zrychlení jednoduchých operací je při jednom zavolání tak malé, že ho nepovažuji za průkazné (ale patrné je), při vícero už ano. ale dá se dojít na ještě větší zrychlení, např. hromadná transformace vektorů je při 65536 vektorech víc než 4x v SSE než v FPU. Měří se vždy celé volání nějaké funkce, nikoliv jen samotný výpočet uvnitř ní. Všechny měření jsem 10x zopakoval a číslo, které je tady je průměr s vyloučením extrémů z 10 změřených hodnot. Zarovnání jsem použil i pro FPU, už jen tím se dá při hromadných operacích občas nahnat až 20% zrychlení (ačkoliv se to moc běžně nepoužívá, což je, jak jsem si nyní ověřil, škoda).

Součet vektorů
FPU: 3330, SSE: 1450

Vektor * skalár
FPU: 3681, SSE: 1071

Normalizace vektorů
FPU: 15506, SSE: 6825

Tranformace vektorů maticí
FPU: 5309, SSE: 2711

Inverze matic
FPU: 129628, SSE: 46225

Je mi jasné, že při větších objemech dat, kdy se do toho začne mnohem výrazněji motat cache, a vzhledem k množství podobných operací v reálné aplikaci se tyhle optimisticky vyhlížející čísla nakonec moc neprojeví. Osobně odhaduju tak 1% a míň, ale i to za těch pár hodin psychické námahy nad SSE intrinsics stálo. Jo a měřil jsem na procesoru Intel(R) Core(TM)2 Duo CPU P7550 @ 2.26GHz

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: JiriValerian

9:26:34 04.02.2010

[color=#008000]ssemaniak Napsal:
-------------------------------------------------------
> -> JV - Asi jsem se špatně vyjádřil. Je to
> statická knihovna, na tu chybu přijdou už
> programátoři při kompilaci, ale jsou to většinou
> Javaři, a když to na ně při kompilaci vyplivne
> "error C2719: bla bla bla", jsou vedle. Ono těch
> "uživatelů" co znám je kolem 20 (netuším, jestli
> se to nešířilo dál), časem jim to samozřejmě
> vysvětlím, ale původně mě jen tak napadlo, jestli
> neexistuje nějaké elegantní řešení, jak z toho
> vybruslit.[/color]

Tak s tím, že nečtou vaše popisy ke statické knihovně a používají ji nevhodně jako starší verzi
moc nenaděláte a nic lepšího než to co jste už uvedl tj.
"#error Nepředávat nic hodnotou, jinak se objeví chyba C2719. Tenhle řádek po přečtení smažte."
asi v tomto ohledu nebude.

Citovat příspěvek

 

Re[2]: Zarovnani + predani hodnotou

Autor: LadislavZezula

9:00:45 04.02.2010

Nevim sice presne, co se do te DLL knihovny predava a jak,
ale neslo by proste stare funkce tam nechat (takze Javari budou
happy), a pridat tam nove, treba s priponou "Ex" nebo "SSE",
tak jak to dela Microsoft ve svych DLL, kdyz tam potebuje
dodat novou verzi nejake funkce ?

L.




Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: ssemaniak

21:10:47 03.02.2010

-> JV - Asi jsem se špatně vyjádřil. Je to statická knihovna, na tu chybu přijdou už programátoři při kompilaci, ale jsou to většinou Javaři, a když to na ně při kompilaci vyplivne "error C2719: bla bla bla", jsou vedle. Ono těch "uživatelů" co znám je kolem 20 (netuším, jestli se to nešířilo dál), časem jim to samozřejmě vysvětlím, ale původně mě jen tak napadlo, jestli neexistuje nějaké elegantní řešení, jak z toho vybruslit. I tak děkuji.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: JiriValerian

20:23:38 03.02.2010

[color=#008000]ssemaniak Napsal:
-------------------------------------------------------
> -> Farao - jo, tohle jsem přesně udělal, ale
> oni to stejně nečtou. V podstatě to byl tak nějak
> "požadavek" - stejné třídy, ale pomocí sse. oni
> prostě nakopírujou novou verzi knihovny do starého
> projektu a překompilujou a za chvíli mám ve
> schránce mail "Pavle, nějak ti to nefunguje.":)
> Zatim to řešim pomocí
> #error Nepředávat nic
> hodnotou, jinak se objeví chyba C2719. Tenhle
> řádek po přečtení smažte.
>[/color]

Další možnost je ta, že do nové verze DLL knihovny zapracujete mechanismus, který buď při zavádění knihovny nebo třeba při prvním volání kterékoli funkce či objektu z ní otestuje na shodu nějaký řetězec, který bude jednak přeložen v knihovně oproti řetězci, který se knihovna pokusí načíst z nějakého souboru, který bude muset být ve stejném adresáři jako ta DLL knihovna. K nové verzi DLL poskytnete popis změn a uvedete v něm i nový řetězec, ale tak, že bude uvnitř textu tj. ani na začátku ani na konci tak, aby je to aspoň trochu nutilo si přečíst určitou část než to najdou. Pokud v příslušném souboru nebude správný řetězec pak zobrazí knihovna dialog, ve kterém budou taktéž ty důležité informace uvedené v tom popisu a bude v nich opět někde uvnitř i ten řetězec. Jakmile příslušný vývojář použije novou verzi Vaší knihovny bez toho aby si to přečetl a udělal patřičné kroky a dokonce i kdyby aplikaci používající tu DLL vůbec nepřekládal, ale jen k ní zkopíroval tu novou DLL a pokoušel se to spustit, tak se mu zobrazí ten dialog s patřičným textem, který by mohl začínat nějak takto:

[quote][color=#FF0000][i][b]Milý vývojáři (pokud jste uživatel přeskočte rovnou na další odstavec) ![/b]
Nepřečetl jste si popis k této nové verzi DLL, a proto se zobrazilo toto upozornění,
ve kterém najdete informace co máte udělal při použití této nové verze DLL.

[b]Milý uživateli![/b]
Stěžujte si na příslušného vývojáře, který u Vás nasadil tuto novou verzi knihovny
aniž by si přečetl popis k ní a učil příslušná opatření v něm uvedená k tomu,
aby toto hlášení nebylo zobrazováno.

[b]Zde je návod pro vývojáře jak na to[/b]
A tady napíšete důležitá sdělení a někdu uvnitř nich bude i ten nový řetězec.[/i][/color][/quote]

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: ssemaniak

18:44:20 03.02.2010

>>Takže bych Vám radil zklidnit hormony.
:D :D :D :D
No já nevímn, ale já jsem zcela klidný, a myslím, že po přečtení všeho, co jsem já a Vy zde i jinde (já zatim jidne nepsal) musí každý uznat, že Vy máte asi problém s nervy, ne já. Vemte si příklad z p. Faraa či p. Jiřího Valeriana, kteří dokáží napsat radu, informaci, či cokoliv jiného, aniž by u toho dostali infarkt. Pokud Vám to dělá problémy, už se zde snažně prosím nevyjadřujte.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: AnonymousUser

18:21:03 03.02.2010

ssemaniak> Doporučil bych si při získání dobré rady tolik nevyskakovat. Chování lidí přesně jako jste Vy je přesně důvodem, proč řada lidí kašle na to, aby někomu radila. Takže bych Vám radil zklidnit hormony.

Jinak použití ukazatele nerovná se nutně dynamická alokace, ale to jistě člověk takového formátu a mistr světa jako Vy zajisté ví.

Jinak s lidmi, kteří na každou dobrou a použitelnou radu odpovídali: „A to mám dělat takhle s takovou volovinou?“ jsem již našel více a nikdy to daleko nedotáhli.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: ssemaniak

16:38:31 03.02.2010

-> Farao - jo, tohle jsem přesně udělal, ale oni to stejně nečtou. V podstatě to byl tak nějak "požadavek" - stejné třídy, ale pomocí sse. oni prostě nakopírujou novou verzi knihovny do starého projektu a překompilujou a za chvíli mám ve schránce mail "Pavle, nějak ti to nefunguje.":) Zatim to řešim pomocí
[code]#error Nepředávat nic hodnotou, jinak se objeví chyba C2719. Tenhle řádek po přečtení smažte.[/code]

-> AnonymousUser - hezký a to budu pro každou instanci dynamicky alokovat? No tomu se řiká šetření prostředků :)
Ke zbytku se nebudu vyjadřovat, po přečtení některých Vašich příspěvků tady na fóru jsem zjistil, že se vyjadřujete až příliš "ofenzivně", chtělo by to nějak se odreagovat a zklidnit, např. alkohol, cigaretka (nedoporučuju), hudba, pěkný film, sex (doporučuju) by mohly pomoci.

Měření klidně nějaké udělám, ale hned to nebude, dřív než zejtra odpoledne se k tomu nedostanu, tak mě nekamenujte, když to tu do půl hodiny nebude. Co se týče výpočtů, dělám FP single.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: AnonymousUser

15:22:26 03.02.2010

[ital]Tedy např. nejde donutit kompilátor aby předával parametr v SSE registru místo na stacku?[/ital]

Vy máte pane jedno veliké štěstí, a to, že se Microsoft vůbec rozhodl, že metody tříd budou mít ukazatel na this předávaný v registru exc/rax, tedy registrem. Také se Microsoft mohl rozhodnout (a některé kompilátory se tak rozhodují), předávat ukazatel na this přes stack a pak byste ani metody tříd nazavolal bez varování.

Ne, nad předáváním parametrů s instancemi Vašich tříd do cizího kódu nemáte sebemenší kontrolu.

Když už si stěžujete na to, že jsem nedal žádné řešení, odjakživa platilo, že můžete ze třídy udělat obálku, která zarovnání nepotřebuje:

class moje_sse_uzasna_trida
{
public:

private:
internal_type* my_aligned_data;
};

Tímto řešením přestanete blbnout s Vašimi nerealistickými požadavky a vyrobíte standardní třídu, která nebude mít problémy. Zároveň si interní datový blok můžete zarovnat na co chcete.

[ital]Psal jsem, že některé kónkrétní aplikace (jako násobení a inverze matic, operace s vektory) jsou rychlejší. Já "benchmarkoval" a zklamaný nejsem, ale bude to tím, že jsem realista a narozdíl od ostatních jsem asi nečekal zázračné zrychlení. Když budete chtít čísla, můžu klidně ono zrychlení zkusit naměřit znovu a přesněji[/ital]

Což by mně zajímalo. Podle měření a pokusů se nedaří urychlit výpočty přes SSE, které obsahují příliš krátké algoritmy, stejně tak výpočty v double precision byly rychlejší přes FPU. Podařilo se někdy zrychlit výpočty v single precision (float) u větších algoritmů, kde bylo zrychlení několikanásobné, ale byly to spíše výjimky.

Miloslav Ponkrác
[url]http://ponkrac.net/complex-web-server[/url]
[url]http://ponkrac.net/pisma/[/url]

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: Farao

9:28:53 03.02.2010

>> Tedy např. nejde donutit kompilátor aby předával parametr v SSE registru
>> místo na stacku?

Pravděpodobně nepůjde.

>> Nebo spíš, jak donutit programátory, aby nepředávali hodnotou,

Pokud se struktury používají i mimo kód tvé knihovny tak asi nijak. Jinak by mělo stačit příslušným způsobem upravit rozhraní knihovny.

>> nebo když už předají, jak jim vysvětlit že to nesmí?
>> Oni těm chybovým hláškám o zarovnání často nerozumí (a dokumentaci evidentně nečtou)

Napsat příslušné komentáře ke všem funkcím, které tu strukturu vrací ale stejně počítej s tím, že jich za tebou většina stejně přijde. S tím musíš počítat, když kvůli "optimalizaci" znemožníš použití jedné ze základních vlastností jazyka.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: ssemaniak

21:14:34 02.02.2010

Ok, tak si pan anonymní zanadával kvůli nedostatku informací (co za důležitou informaci jsem prosímpěkně vynechal?), ale skutek utek. To že zarovnání na stacku nepůjde, na to už jsem přišel sám, tady jsem se ptal proto, že jsem očekával nějaké jakékoliv řešení toho problému. Tedy např. nejde donutit kompilátor aby předával parametr v SSE registru místo na stacku? Nebo spíš, jak donutit programátory, aby nepředávali hodnotou, nebo když už předají, jak jim vysvětlit že to nesmí? Oni těm chybovým hláškám o zarovnání často nerozumí (a dokumentaci evidentně nečtou), já osobně to vím, takže všechno samozřejmě předávám referencí. Zeptám se tedy ještě jinak - kdybyste se ocitli na mém místě, jak byste problém řešili?

BTW, nepsal jsem, že když použiju SSE, tak se běh celého programu znatelně zrychlí, to by asi vzhledem k rozsahu FP výpočtů v běžných aplikacích nešlo. Psal jsem, že některé kónkrétní aplikace (jako násobení a inverze matic, operace s vektory) jsou rychlejší. Já "benchmarkoval" a zklamaný nejsem, ale bude to tím, že jsem realista a narozdíl od ostatních jsem asi nečekal zázračné zrychlení. Když budete chtít čísla, můžu klidně ono zrychlení zkusit naměřit znovu a přesněji.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: JiriValerian

20:41:59 02.02.2010

[color=#008000]ssemaniak Napsal:
-------------------------------------------------------
> Zdravím. Před časem jsem začal jednu svou
> knihovničku (kterou bohužel používají i jiní
> programátoři) optimalizovat pro SSE. Kvůli SSE
> (ale i bez něj, zlepší se pak využití cache) je
> potřeba, aby data byla zarovnaná na 16 bajtů, a to
> se dá zařídit pomocí _declspec(align(16))...[/color]

[b]_declspec(align(16))[/b] se netýká parametrů funkcí či metod
tj. při předávání hodnotou to nemá žádný efekt viz odkaz a citace.

[b]Visual C++ Language Reference: align (C++)[/b]
http://msdn.microsoft.com/en-us/library/83ythb65.aspx
[quote][color=#FF0000][i]...You cannot specify alignment for function parameters...[/i][/color][/quote]
[b]PS:[/b] Jinak platí to co zde již uvedl pan Ponkrác.

Citovat příspěvek

 

Re: Zarovnání + předání hodnotou

Autor: AnonymousUser

20:01:56 02.02.2010

Á, zase bude potřeba zažhavit křišťálovou kouli kvůli nedostatku informací.

Ve 32 bit os není možné na stacku dodržet zarovnání na 16 bajtů. Prostě není, vzdejte to. Tudíž buďte rád, že hodný kompilátor Vám to řekne.

V 64 bitovém os pak je stack zarovnán 16 bajtů implicitně.

Jinak nevím co je to za knihovnu, ale SSE jsem testoval já i několik lidí, a takový zázrak to tedy není. Jistě některé akce lze urychlit, ale veskrze jsem neviděl člověka, který by SSE benchmarkoval a nebyl opravdu velmi zklamaný z pomalosti SSE.

Miloslav Ponkrác
[url]http://ponkrac.net/complex-web-server[/url]
[url]http://ponkrac.net/pisma/[/url]

Citovat příspěvek

 

Zarovnání + předání hodnotou

Autor: ssemaniak

13:26:43 02.02.2010

Zdravím. Před časem jsem začal jednu svou knihovničku (kterou bohužel používají i jiní programátoři) optimalizovat pro SSE. Kvůli SSE (ale i bez něj, zlepší se pak využití cache) je potřeba, aby data byla zarovnaná na 16 bajtů, a to se dá zařídit pomocí _declspec(align(16)). Jenže když je takhle zarovnaná nějaká třída, má to za následek, že se nedá do funkcí předávat hodnotou, musí se použít reference/ukazatel, jinak kompilátor nadává. U mě v pohodě, jenže u ostatních začínají problémy. Jejich programy jsou udělané za pomoci starších verzí knihovny, kde není zarovnání použito a když se použije nová verze se zarovnáním (SSE se nechci vzdát, některé operace jsou cca 3x - 4x rychlejší) vyflusne to na ně několik set chyb, kterým nerozumí. Otázka teda zní: Jde nějak donutit kompilátor, aby data předal funkci v parametru zarovnaná (tedy aby sežral předání hodnotou), nebo nějak "znemožnit" předání hodnotou, či vypsat rozumnou chybovou hlášku, když to někdo udělá? Díky za každý nápad.

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: