• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    XCHAOSANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API
    REDGUY
    REDGUY --- ---
    XCHAOS: Aaaaaaaaaaaargh. To proste neni mozny. Ty proste nejsi skutecnej. Ty jsi ve skutecnosti sdruzeni nekolika spickovejch komiku s extremne bizanim smyslem pro humor.

    Co jsem napsal v puvodni zprave?
    - "pokud mu na prikazove radce reknete "WTF"
    Co se pise v kodu?
    - "if (argc == 2 && !strcmp(argv[1], "WTF")) {"

    Co potom napsal xchaos?

    - "xchaos@tartarus:~$ ./test wtf"

    Najdi tri rozdily...

    Jak si z tebe potom nemam delat srandu?
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: myslím, že vidět v hlavním cíli mých pokusů "mikrooptimalizace" je trochu nepochopení mojí motivace k tomu, o co se snažím...
    XCHAOS
    XCHAOS --- ---
    REDGUY: dvě setinky sekundy. hmm, zajímavý.

    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 3.50986
    xchaos@tartarus:~$ ./test wtf
    Sum: 403504454559365000
    Time: 3.52524
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Protoze to vede ke (spatnemu) zaveru, ze mikrooptimalizace (ala ty ktery delas ty) jsou dobrej napad.
    XCHAOS
    XCHAOS --- ---
    REDGUY: mě to přijde jako zajímavý zadání... nevím proč se do mě musíš obouvat i v případě, že to je zajímavý téma který nijak nesouvisí s mýma ujetýma nápadama.

    až budu mít chvilku, vyzkouším to.
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    Ostatne, funguje to i ve skalarnim kodu, zkus to samy na tohle (kdyz je v #if 1, je to maskovani, kdyz 0 je to starej kod):

    for(j = 0; j < ITERS; j++) {
    for(i = 0; i < ASIZE; i++) {
    #if 1
    unsigned mask = (prdel[i] >= RAND_MAX/2);
    mask = unsigned(-mask);
    sum += (mask & prdel[i]);
    #else
    if (prdel[i] >= RAND_MAX/2) {
    sum += prdel[i];
    }
    #endif
    }
    }
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    REDGUY: Jak ktery. Ale vetsinou mas instrukci ktera ti nastavi masky podle nejaky podminky a pak instrukci co je resetne do nejakyho stavu.

    v SIMD by to bylo cca takhle (kdyby se tohle odehravalo v jedny lane, takze de facto SIMT prave ala CUDA).

    const __m128 treshold = _mm_set_ss(RND_MAX/2);
    __m128 acc = _mm_set_ss(0);

    for(int i=0; i < ASIZE; i++)
    {
    // hezky
    __m128 datai = _mm_set_ss(data[i]);
    __m128 mask = _mm_cmp_ge(datai, treshold);
    datai = _mm_and_ps(datai, mask);
    acc = _mm_add_ps(acc, datai);
    }
    REDGUY
    REDGUY --- ---
    DAVIDOWITCH: To maskovani funguje jak? Na pristi instrukci, pristi store, dokud ho nevypnu, nebo jinak?
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    REDGUY: Jako, je husty jak mi tohle vubec nedoslo, protoze ted programuju pro GPU a tam se takovyhle maly tela resej maskovanim.
    tj. if by jen nastavil predikat jestli zapsat vysledek nebo ne, a tudiz skok by vubec neprobehl (to samy bych delal v SIMD)
    REDGUY
    REDGUY --- ---
    DAVIDOWITCH: Rekl bych ze jo. Navic stejnej efekt je udajne videt i v Jave.
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    (ne, necekal sem to, myslel sem ze to bude opacne)
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    REDGUY: Tyjo, ze by se tohle CELY dalo svyst na branch prediction?
    REDGUY
    REDGUY --- ---
    Hehe, tohle je docela legracni. Sice se desim ze si z toho XChaos vezme uplne spatne pouceni a bude z toho zase zaplava jeho zmatecnejch vizi, ale je to tak zajimavy ze to risknu:

    [C] WTFC - Pastebin.com
    http://pastebin.com/E2vHyXjU

    Cckovej program kterej vygeneruje pole nahodnejch cisel a pak ho mnohokrat projizdi a pocita soucet tech nahodnejch hodnot, ktery jsou vetsi nez RAND_MAX/2. Na zaver rekne jak dlouho mu to trvalo. Nic slozityho. Jedina vec zajimava vec je, ze pokud mu na prikazove radce reknete "WTF", tak predtim, nez to pole zacne projizdet a scitat ho setridi, coz na vysledny soucet nema zadnej vliv.

    Za domaci ukol se na ten kod podivejte a zkuste si odhadnout, jak se bude vysledny cas lisit v zavislosti na tom, jestli tomu programu reknete nebo nereknete "WTF". Pak si to vyzkousejte a uvidite 8)
    XCHAOS
    XCHAOS --- ---
    ANT_39: dík, to jsem možná teď napodruhé přehlédl, už jsem to ale měl nastudovaný... řetězící alokátor get_str() a formátující alokátor get_strf() u mě každopádně budou hlavní stringové nástroje (začal jsem diplomaticky používat označení "můj toolkit", protože cokoliv jiného působí jako rudý hadr :-)

    (jo a připomínám, že rozhodně nečekám reputaci, dokud to nereleasnu...)
    NECROMAN
    NECROMAN --- ---
    Dokazal byste nekdo prekompilovat Cckovou knihovnu LUA do WinRT / C++ ? WinRT jak asi vite je novy runtime ve Windows 8 pro beh Metro aplikaci. Lze v nem programovat pomoci C++, C# nebo HTML5/JavaScriptu.
    Pro zkusene C++ matadory by to predpokladam nemel byt takovy problem, neni tam skoro nic platform-specific, jen obecne algoritmy :)
    Dik
    LUA library compiled in WinRT C++
    http://social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/f4621710-2cdf-4fc5-a04e-44ecb25c6769
    ANT_39
    ANT_39 --- ---
    XCHAOS: ten asprintf se da naemulovat celkem trivialne, pustis vsnprintf(NULL, 0) abys zmeril, kolik to potrebuje, alokujes bafr dane delky + 1, a pak podruhe vsprintf(buf).
    REDGUY
    REDGUY --- ---
    XCHAOS: něco, co se použije místo malloc() když programátor uzná za vhodné - jen tak pro kontrolu, vis ze malloc sam o sobe je dost chytrej a jaksi kondenzuje zkusenosti a znalosti spousty programatoru? A cilem tveho pry na uziti jednodussiho alokatoru je tuhle chytrost zahodit a nechat na programatorovi at premejsli co pouzit? Chapu to spravne?
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Ja chtel rict, ze i uplne obycejnej vanilla malloc co se provede kdyz proste vemes gcc a udelat malloc, je zatracene draha sranda.
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: tak minimálně je to obvykle ta funkce, která se nahrazuje, když místo běžného malloc() použiješ nějaký složitější, s nějakým sofistikovanějším GC... takže tady jsem neměl na mysli ten konkrétní standardní, ale mluvil jsem "co se děje na místě, kde se volá malloc()" - kde můžou být použité různé implementace správy paměti, které lze srovnávat, viz [ ANT_39 @ ANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API ]

    když se použije místo standardní správy paměti nějaká sofistikovanější, tak se pak nahrazuje i volání toho malloc() voláním jiné knihovní funkce (ať už to řeší pomocí #define nebo prostě tak, že jen použiješ jiný header file a samotná funkce se jmenuje stejně... ).

    jinými slovy se chci dobrat k tomu, že "každý malloc() dělá něco jiného" - a můj projekt pak není v kategorii "1000+první náhrada za malloc() implementovaná jako diplomka" (které další diplomky mezi sebou co nejobjektivněji porovnávají", ale spíš v kategorii "něco, co se použije místo malloc() když programátor uzná za vhodné".
    XCHAOS
    XCHAOS --- ---
    ANT_39: resp. srovnáním jeho výkonu. no, u mě by ten výkon přeměřit dost dobře nešlo, protože je to určené jen na speciální použití...

    ANT_39: no já tak trochu předpokládám, že si načtu nějaký ten get_rlimit a vyjdu třeba z velikosti stacku jako základní jednotky pro alokaci...

    (taky je zajímavé zvolit vhodnou strategii pro tu formátovací alokaci ve stylu asprintf - viz man sprintf - dělá se to pomocí jakéhosi vsnprintf a víceméně se zkusmo testuje, jestli se do řetězce dané délky vejde...)
    Kliknutím sem můžete změnit nastavení reklam