• ú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
    XCHAOS
    XCHAOS --- ---
    xchaos@tartarus:~$ ./test WTF
    Sum: 403504454559365000
    Time: 0.444335
    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 2.32974

    ....a tohle je nejlepší:

    xchaos@tartarus:~$ ./test WTF
    Sum: 403504454559365000
    Time: 0.658788
    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 0.687157

    ok, přiznávám se - dostali jste mě :-)

    (jen podotýkám, že můj mini-toolkit zahnrnuje i dávkový soubor "bake", který se má používat místo "make" a Makefile - a že budu používat při volání gcc ty optimalizace, který mě nejlíp dopadnou s mými typy zasmyčkování, která chystám... ale to je offtopic, tohle byl hezký vtípek, uznávám ...)
    XCHAOS
    XCHAOS --- ---
    xchaos@tartarus:~$ gcc -O1 test.c -otest
    xchaos@tartarus:~$ ./test WTF
    Sum: 403504454559365000
    Time: 0.43624
    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 2.3264
    XCHAOS
    XCHAOS --- ---
    huh


    xchaos@tartarus:~$ gcc -O0 test.c -otest
    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 3.60948
    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 4.5604
    xchaos@tartarus:~$
    XCHAOS
    XCHAOS --- ---
    dobře... tohle už vypadá jako signál mimozemské civilizace "WTF" (zachycen po velkém úspěchu předchozího signálu "WOW")

    xchaos@tartarus:~$ ./test WTF
    Sum: 403504454559365000
    Time: 1.53202
    xchaos@tartarus:~$ ./test
    Sum: 403504454559365000
    Time: 3.59716

    můj návrh interpretace: sčítání čísel obsahujíích různý počet nastavených bitů prostě trvá různě dlouho - prostě CPU nějak ví, kolik je max. platných bitů v registru a pak i mikrokód sčítačící různý počet bitů trvá různě dlouho, to je celé.... prostě se mi to jeví, že asm instrukce ADD už není "atomická" (či jak to nazvat) - prostě už na soudobých architekturách netrvá vždy stejný počet taktů CPU (resp. možná trvá na úrovni jednoho vlákna, ale ten čas se může využívat např. pro NEVÍM způsobem NEVÍM JAK)

    je možné, že je to tímhle? (testováno zatím jen na 64bit platformě), nebo trváte na compile-time optimalizacích?
    XCHAOS
    XCHAOS --- ---
    REDGUY: ok :-)
    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
    Kliknutím sem můžete změnit nastavení reklam