• ú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
    /* Toto je klub především pro lidi, pro které je programování jednou z mnoha massive multiplayer online počítačových her, které lze hrát.
        V tomto klubu hrozí sémantická hereze a nezdravě vysoký obsah syntaktického cukru. Nevhodné pro algoritmické diabetiky.
        Od účastníků debaty se předpokládá automaticky přístup k instalovanému GNU C: sudo apt-get install build-essential
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C (programovací jazyk)#C99 Heslo na české Wikipedii
    Jazyk C - Základy praktického programování V Praze 2oo7 pro SSPŠ Tomáš Harvie Mudruňka a kolektiv - jak si programování v C představuje většina lidí
    http://stevenkobes.com/ctest.html C Programming Puzzlers - nepouštějte se do flamewars v tomhle klubu, pokud neuhodnete aspoň polovinu správně!
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://en.wikipedia.org/wiki/C99 C99 is a modern dialect of the C programming language.
    http://cprogramminglanguage.net/ C programming language
    http://cprogramminglanguage.net/c-programming-language-tutorial.aspx C programming language - úvod
    http://en.wikipedia.org/wiki/Criticism_of_the_C_programming_language C makes it easy to shoot yourself in the foot. (ještě že ne do hlavy...)
    http://en.wikipedia.org/wiki/C_preprocessor
    http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html C99 makra s proměnným počtem argumentů - __VA_ARGS__
    http://gcc.gnu.org/onlinedocs/gcc/ GNU C Compiler
    http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Optimize-Options.html
    http://bellard.org/tcc/ Tiny C Compiler - prý C99 compliant (min. umí __VA_ARGS__) - vhodný pro skriptování v C - umí #!/usr/bin/tcc -run
    http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest - pokud jste neviděli tohle, tak jste ještě neviděli opravdu nečitelný C zdroják
    http://bellard.org/otcc/ Obfuscated Tiny C Compiler - z tohohle vtípku vznikl Tiny C compiler
    http://en.wikipedia.org/wiki/ANSI_C Jak se střelit do nohy standardizovaným způsobem.
    http://eli-project.sourceforge.net/c_html/c.html ANSI C Specification
    http://www.lysator.liu.se/c/ Různý ANSI C bordel
    http://www.cs.rit.edu/~ats/books/ooc.pdf Object Oriented Programming with ANSI-C - a pak že to nejde
    http://en.wikipedia.org/wiki/Longjmp co jsou to setjmp()/longjmp() knihovní funkce (pro všechny, podle kterých to bez C++ try { } catch() ... nejde)
    http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/dcdc710c27f47c72 C neumí správně počítat (?)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://www.fastcgi.com/ FastCGI is simple because it is actually CGI with only a few extensions.
    http://www.metalshell.com/source_code/18/Mysql_Select.html How to do a simple connection and select with mysql
    http://xmlsoft.org/ The XML C parser and toolkit of Gnome
    http://curl.haxx.se/libcurl/ libcurl - the multiprotocol file transfer library
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    https://dev.arachne.cz/svn/cll1h SVN/Trac jazyka C<<1 (user-friendly nadstavba nad ANSI C99 - ve stylu JQuery vs. JavaScript)
    Benchmark iterace a serializace stringů v různých jazycích vs. v C
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        moderátor se velice zhruba řídí zvyklostmi moderace, která kdysi platila v řadě konferencí sítě FidoNet ... C != 0xdead */
    rozbalit záhlaví
    REDGUY
    REDGUY --- ---
    XCHAOS: No urcite. Akorat ze to, ze spousteni extra threadu ma rezii, kterou nemuzes ignorovat jsem ti rikal uz od zacatku. Ale pochopitelne, kdyz neco rika Redguy, je to to fuj fuj osklive off-topic trollovani, kterej potreba ignorovat nebo rovnou zabavnovat, zatimco ted, kdyz si idiot ted to samy konecne precetl nekde jinde, tak je to idiotova zasluha 8)))
    XCHAOS
    XCHAOS --- ---
    REDGUY: no vida, konečně se mi diskusi podařilo stočit někam ontopic :-) tak jestli využiju tohle, můžu autorovi koupit koupit kafe, zdá se :-)
    XCHAOS
    XCHAOS --- ---
    ANT_39: mno. takže řešení připravené rozparalelizovat _jakýkoliv_ cyklus by vlastně místo na trhu našlo... :-)
    ANT_39
    ANT_39 --- ---
    XCHAOS: Standard OpenMP popisuje, jak hlavicka toho cyklu musi vypadat, aby sla rozparalelizovat.
    REDGUY
    REDGUY --- ---
    XCHAOS: velká frajeřina by vlastně byla napsat v C kód, který recykluje již jednou vytvořená vlákna - boha jeho. Napis do googlu "C thread pool" a vypadne ti hromada tehle "velkejch frajerin", treba https://github.com/Pithikos/C-Thread-Pool .

    Kolikrat ti budu opakovat, ze bys fakt hodne dobre udelal, kdyby sis o tom paralelnim programovani nejdriv neco poradne precetl, nastudoval, neco realnyho v nem naprogramoval a pak teprv zacal machrovat o tom, jak napises paralelni programovaci jazyk?
    XCHAOS
    XCHAOS --- ---
    LUDO: zajímavé by bylo vyzkoušet, jak ta paralelizace dopadne v případě, že podmínka v tom cyklu je nějak složitější, než jen prosté počítadlo. každopádně dík za inspiraci, konečně sem někdo po několika týdenní flamewar vnesl nějaký ontopic :-)
    LUDO
    LUDO --- ---
    XCHAOS: ti to mozem porovnat z hlavy, kedze OpenMP pracuje na urovni kompilatora, musel by si byt velmi velky maestro aby tvoj C kod bol rychlejsi

    A ano, OpenMP to robi presne tak, pokial mu to parametrom povies.
    XCHAOS
    XCHAOS --- ---
    LUDO: částečně máš pravdu, že vytvoření threadu má režii... neřeší tohleto právě ty go-routines?

    tak mi napadá, že velká frajeřina by vlastně byla napsat v C kód, který recykluje již jednou vytvořená vlákna. normálně, po dokončení threadu by tehle thread nezanikl, neukončoval se - ale čekal by na nějakém semaforu, až se mu předá pointer na funkci, kterou má dále vykonat. takže by se nepracovalo přímo s phthreads, ale runtime by spravoval nějaký pool threadů (jako to dělá většina aplikací s podporou multihtreadingu, typu Apache)

    začíná mi to do sebe v hlavě docela zapadat (stejně mi vycházelo, že ten můj highlevel zdrojový kód bude z řady důvodů překladač do C muset rozkrájet do řady automaticky generovaných funkcí, protože C prostě nemá nic jako anonymní funkce nemá... stejně tak všechny lokální proměnné budou ve strukturách, na které půjde předat pointer, apod.).

    je pravda, že už se to celé začíná trochu podobat operačnímu systému :-) Jestli to OpenML dělá přesně takhle, tak je to dost zajímavé... ale v tom případě by stálo za to srovnat výkonost kódu který paralelizuje OpenML s tím mým :-)
    REDGUY
    REDGUY --- ---
    LUDO: A v tom Pythonu, na kterej XChaos miri, samozrejme existuje ThreadPoolExecutor, kterej presne tohle dela.

    K comu preboha generovat medzikod ked tam staci vlozit jednu direktivu preprocesora - protoze XChaos si vymyslel, ze generovat C jako mezikod je cool, tak ted hleda neco, na co by to pouzil. Ze to nedava smysl je irelevantni.
    LUDO
    LUDO --- ---
    XCHAOS: ja si teda docela dobre viem predstavit vstupne data z ktorych sa bude iba citat, dokonca by som povedal, ze ich je vacsina. Na to ziadny vyhradny pristup pre vlakna zabezpecovat nepotrebujes, navyse to co popisujes ziadny vyhradny pristup nezabezpeci. Netusim presne o co ti ide, ale vytvarat nove vlakno pre kazdy prvok je volovina, ked staci thread vytvorit jedenkrat a vyhradit mu urcitu cast pamate ktoru ma spracovat.

    K comu preboha generovat medzikod ked tam staci vlozit jednu direktivu preprocesora?
    XCHAOS
    XCHAOS --- ---
    LUDO: tak na druhou stranu, napsat paralelně na stdout 2x Hello World není moc praktický příklad paralelizace, obávám se :-) většina reálných algoritmů bude pracovat s nějakými vstupními daty, a i matematické modely, které teoreticky žádná vstupní data nepotřebují a pouze něco generují, se musí minimálně dohodnout, kterou část modelu generuje které vlákno.

    můj příklad, kdy si vyžádáš paralelní zpracování prvků seznamu, je podle mě nejjednodušší možný. Akorát ten OpenMP příklad, který to rozdělí právě na dvě vlákna a polovinu intervalu, mi přijde nepraktický ... takhle jsem o tom přemýšlel celá léta, až mi došlo, že je to právě blbost.

    většina kontejnerových struktur (nejhezčeji to má udělené právě ten Python), většinou nabízí dvě metody: "vezmi první prvek" a "vezmi další prvek" (hezkým příkladem je nějaké to otevření souboru a jeho čtení, stejně tak otevření socketu a jeho čtení, může jít ale i procházení dlouhého stringu v paměti...). Přičemž ne všechny kontejnery jsou schopny jednoduše zjistit "kolik toho je" - u spousty typů datových struktur musíš prostě projít všechny prvky a spočítat je, a někdy to vychází z logiky věci (např. tabulka v databázi může být na jiném serveru, apod.). Jindy se informaci "kolik toho je" vůbec nemusí vyplatit věřit (viz slavné Microsoftí bugy, které byly vzhledem k microsoftímu přístupu ke codeřině nevyhnutelné).

    Takže moje myšlenka je, že právě vůbec nemusím dělit nějaké intervaly na předem známý počet intervalů... ale můžu jednoduše každý nový prvek posílat do nového vlákna, dokud mi nedojdou resourcy (možná to ostatně OpenMP dělá takhle, co já vím...). samozřejmě je tady otázka, jakou má start a konec vlákna režii.. protože v případě, kdy je samotný krok triviální a CPU čas žere to samotné procházení intervalu, by se mi doba běhu mohla prodloužit, místo zkrátit...

    tohle ale všechno může právě řešit runtime! to místo, na kterém vzniká nový thread, si může samo změřit, jak dlouho thready běžely a jestli režie spojená s paralelizaci program zrychlila nebo zpomalila. někdy se to prostě nevyplatí (např. když úzké hrdlo jsou I/O operace).

    samozřejmě kolem toho bude trocha přemýšlení. podívat se, jak to dělá OpenMP, by určitě bylo užitečné. a dokonce ten C mezikód, který budu generovat, může využívat to OpenMP, když se ukáže, že to dělají efektivněji než cokoliv, co bych vymyslel sám...
    LUDO
    LUDO --- ---
    XCHAOS: v OpenMP na trivialnu paralelizaciu ziadne mutexy nepotrebujes, to su dve makra v zdrojaku a zapnuty prepinac v kompilatore
    XCHAOS
    XCHAOS --- ---
    KEJML: tohle jsem neznal a je to velmi zajímavý!
    OpenMP - Wikipedia
    https://en.wikipedia.org/wiki/OpenMP
    spustit všechno "co nejvíc paralelně" bez dalšího zadání mi nenapadlo, že bych potřeboval, ale svým způsobem, pro nějakej velmi masivní a současně velmi snadno paralizovaelnej výpočet.. hmm... až na to sraní s mutexama, apod.

    jinak pojem https://en.wikipedia.org/wiki/Embarrassingly_parallel jsem neznal, a je to popravdě přesně ten případ, který jsem se tu snažil popsat - některé algoritmy jsou zcela zjevně paralelizovatelné velice přímočaře, bez nutnosti přemýšlet o re-entrantnosti, semaforech a takových věcech. přesto řada dnešních jazyky vícevláknovost často buď nenabízí, nebo nemá jednoduchý nástroj, který by byl aspoň ekvivalentní tomu, když si třeba v unixovém shellu vyžádám spuštění něčeho "na pozadí".

    nejvíc mi zaujala jednoduchost paralelizace v go, tzn. co se týče "xjazyku" (což je vlastně jen nepodstatný syntaktický třtinový cukr), mělo by jít o mashup pythonu a intuitivních instrukcí pro triviální paralelizaci, jakou má třeba to go.

    (jestli mnou zavedená specifikace jednou bude akceptována coby Python block 4, proč ne :-) spíš nebude, ale člověk musí celý život něco zkoušet, než umře o samotě a zapomenut...)
    REDGUY
    REDGUY --- ---
    KEJML: Myslim, ze XChaos nehleda reseni svyho problemu, ale problem k svymu reseni.
    KEJML
    KEJML --- ---
    XCHAOS: Viděl jsi někdy OpenMP? Použil jsem to párkrát, na triviální operace, kde mi šlo o hrubej výkon. Prostě před for cyklus napíšu #pragma omp for a všechno samo funguje. Defaultně si to vezme tolik vláken, kolik je v systému procesorů (s jistě mnoha způsoby konfigurace) a všechno krásně běží. Není to to, co hledáš?
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    Me to neda, ja do toho trochu stouchnu :-D
    Vubec to neni na web. Necekam ze by to nekdy vzniklo ale..
    Znate Inteli SPMD compiler ISPC?
    V drevnich dobach, nez se rozhodli udelat tenhle oficialni, tak existovaly 2 verze. ISPC (napsal drzitel Oskara Matt Pharr) a Unnamed compiler (napsal nedrzitel Oskara, Ingo Wald).. z toho je videt ze Intel ma preference bud pro hezka jmena, nebo pro drzitele Oskara, pripadne oboji.

    Anyway, oba prekladace delaj to co dela Cuda, tj: napisu:
    float dot(Vector3f a, Vector3f b) { return a[0]*b[0] + a[1]*b[1] + a[2] * b[2]; }

    A prelozi to do neceho co umi pracovat na nekonecne dlouhejch vektorech (ty Vector3f se prelozi jako SoA) a to pomoci SIMD instrukci (clovek si muze zvolit jaky instrukce).

    ISPC jde rovnou do binarky a je to nuda.

    To co umel ten od Ingo Walda bylo, ze to prelozil do citelnyho C++ kodu (ale velmi C-ish, jen si tam pomahal templatama a pretizenejma operatorama), kterej slo pripadne dal upravovat.
    Protoze kdo nekdo psal SIMD rucne vi, ze to je vetsinou zbesilej vopruz a mit neco co vezme normalni kod a udela mi z nej SIMD kod by bylo fajn, ale mit kvuli tomu separatni prekladac ze kteryho vypadne .o ktery musim linkovat.. to uz je vopruz. Takze.. kdyby misto trivialniho pthreadu z toho padaly SIMD intrinsicy, tak by to i k necemu bylo. Food for thought. (A napsal to jeden clovek behem par mesicu, vesmes po vecerech, takze to je celkem pricetnej cil.. a ani nemel Oskara)
    REDGUY
    REDGUY --- ---
    XCHAOS: A napsat funkci, ktera se bude jmenovat go a bude ti pocitat ty thready, to je fakt hrozne slozity. Tak strasne slozity, ze se vyplati kvuli tomu Cecko vyhodit a prejit na uplne novej jazyk 8)))

    a už mi fakt neunavuj - hele, ja chapu ze te to sere, ale kdybys to doakzal aspon na momenticek prekonat, tak si uvedomis, ze v jedny zasadni veci mam proste pravdu: nic z toho, cos zatim vyblabolil, proste neni zasadni vyhoda, ktera by k xJazyku nekoho prilakala. Bud proto, ze to jsou neobhajitelny pitomosti od kterejch po par tejdnech mlzeni sam ustoupis ("lidi si budou cist generovanej kod a ucit se z nej"), nebo marginalnosti ("misto funkce na vytvareni threadu mam keyword") nebo veci tak extremne specificky, ze teoretickou hodnotu maji mozna pro dva lidi na svete (viz ten seznam podminek, co jsem nedavno psal). Jestli si chces napsat jazyk jen tak pro zabavu, tak je to samozrejme jedno. Ale zjevne miris na jazyk, kterej by byl uzitecnej pro vic lidi. Takze by ses mel fakt zamyslet nad tim, jaky opravdu uzitecny vlastnosti bude mit pro pripadny uzivatele.

    Ale jasne, kdyz z toho nic nebude a jde jen o to si zafantazirovat, jakou "frajerinu" bys napsal, kdyby te udajny trollove neotravovali, tak je to vlastne jedno 8)))
    XCHAOS
    XCHAOS --- ---
    REDGUY: v podstatě, ano, napsat "go" následované indentovaným blokem mi přijde stručnější, než napsat "pthread_create". Které si fakt nehlídá, kolik vláken si už spustil, atd.

    a už mi fakt neunavuj...
    REDGUY
    REDGUY --- ---
    XCHAOS: se dá předpokládat, že by zaujal část programotorů, co ještě občas v C programují, aby místo vývoje kódu přímo v C použili tento vygenerovaný mezikód, resp. psali přímo v "xjazyku" - no urcite. "Mam leta zkusenosti s C, spoustu knihoven, nastroju a hotovyho kodu. Hmmm... uz vim. Vsechno to zahodim a misto toho se naucim zbastlenej xJazyk, kterej nema debugger, nema knihovny, nema nastroje, nikdo ho neumi takze mi neporadi, stejne preklada do C, ale hura, umi "automaticky paralelizovat zpracovani kontejneru", protoze napsat rucne to pthread_create je pro me neprekonatelnej problem. Anebo, jako alternativu k prechodu na xJazyk, se muzu bodat rezarvym sroubovakem do oka, coz mozna bude trochu prijemnejsi. Dejte mi jeste chvili, rozmyslim se" . Jo, urcite, "predpokladat" se to da 8)))

    Momentálně mám popravdě asi jiné starosti. Takze z toho nic nebude. As expected, jen svalnaty recicky. Procs to nerekl hned? 8)))
    XCHAOS
    XCHAOS --- ---
    REDGUY: no dobře, z téhle věty jsem ochoten slevit.

    fakticky, pokud se mi ten nástroj podaří vymyslet, aby nebyl jen hračka, tak se dá předpokládat, že by zaujal část programotorů, co ještě občas v C programují, aby místo vývoje kódu přímo v C použili tento vygenerovaný mezikód, resp. psali přímo v "xjazyku". (počátky C++ taky směřovaly ke generování C mezikódu, pokud vím)

    (podotýkám, že čistě teoretická možnost, že by se s generátoru mezikódu stal časem plnohodnotný kompiler, generující assembler, samozřejmě existuje... pouze bych takový projekt nebyl schopen realizovat já... ale měl by na to rozhodně našlápnuto líp, než jazyky, které mají pouze interpretery...)

    Momentálně mám popravdě asi jiné starosti. Ale pochopitelně každý asi má nějaký wishlist typu "co bych asi naprogramoval, kdyby ch měl čas a chuť"... nebo nemá?
    REDGUY
    REDGUY --- ---
    XCHAOS: Jen teda abych ukoncil tvoje trapeni: konkretne mi jde o tuhle tvoji poznamku: programátoři, co ovládají C a bude se jim líbit, že nový nástroj generuje mezikód, který je pro ně srozumitelný a ze kterého třeba můžou čerpat inspiraci pro svoje vlastní aplikace v C . Jaka kategorie programatoru v C a za jakych okolnosti by podle tebe chtela cist nejaky generovany kod a "cerpat z nej inspiraci"? Obvzvlast pokud ten kod je, jak rikas, generovanej pomoci "jednoradkovejch templat"?
    Kliknutím sem můžete změnit nastavení reklam